devices/r8169-2.6.29-ethercat.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 2589 2b9c78543663
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
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
 * vim: noexpandtab
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/module.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/moduleparam.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/pci.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/netdevice.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/etherdevice.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/delay.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/ethtool.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/mii.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/if_vlan.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/crc32.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/in.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/ip.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/tcp.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/init.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/dma-mapping.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "../globals.h"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "ecdev.h"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define RTL8169_VERSION "2.3LK-NAPI"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define MODULENAME "ec_r8169"
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define PFX MODULENAME ": "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#ifdef RTL8169_DEBUG
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define assert(expr) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	if (!(expr)) {					\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		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
    44
		#expr,__FILE__,__func__,__LINE__);		\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define dprintk(fmt, args...) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
	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
    48
#else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define assert(expr) do {} while (0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define dprintk(fmt, args...)	do {} while (0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#endif /* RTL8169_DEBUG */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define R8169_MSG_DEFAULT \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	(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
    55
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define TX_BUFFS_AVAIL(tp) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	(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
    58
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
/* 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
    60
static const int max_interrupt_work = 20;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
/* 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
    63
   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
    64
static const int multicast_filter_limit = 32;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
/* MAC address length */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define MAC_ADDR_LEN	6
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define MAX_READ_REQUEST_SHIFT	12
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#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
    71
#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
    72
#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
    73
#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
    74
#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
    75
#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
    76
#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
    77
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_REGS_SIZE		256
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define R8169_NAPI_WEIGHT	64
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#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
    81
#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
    82
#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
    83
#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
    84
#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
    85
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL8169_TX_TIMEOUT	(6*HZ)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define RTL8169_PHY_TIMEOUT	(10*HZ)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#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
    90
#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
    91
#define RTL_EEPROM_SIG_ADDR	0x0000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
/* write/read MMIO register */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#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
    95
#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
    96
#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
    97
#define RTL_R8(reg)		readb (ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
#define RTL_R16(reg)		readw (ioaddr + (reg))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
#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
   100
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
enum mac_version {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	RTL_GIGA_MAC_VER_25 = 0x19  // 8168D
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
#define _R(NAME,MAC,MASK) \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
static const struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	const char *name;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	u8 mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	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
   136
} rtl_chip_info[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_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
   138
	_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
   139
	_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
   140
	_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
   141
	_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
   142
	_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
   143
	_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
   144
	_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
   145
	_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
   146
	_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
   147
	_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
   148
	_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
   149
	_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
   150
	_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
   151
	_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
   152
	_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
   153
	_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
   154
	_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
   155
	_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
   156
	_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
   157
	_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
   158
	_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
   159
	_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
   160
	_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
   161
	_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
   162
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
#undef _R
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
enum cfg_version {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_0 = 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	RTL_CFG_1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	RTL_CFG_2
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
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
   172
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
   173
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
   174
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
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
   176
	{ 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
   177
	{ 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
   178
	{ 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
   179
	{ 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
   180
	{ 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
   181
	{ 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
   182
	{ 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
   183
	{ 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
   184
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
		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
   186
	{ 0x0001,				0x8168,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
		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
   188
	{0,},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/* prevent driver from being loaded automatically */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
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
static int rx_copybreak = 200;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
static int use_dac;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
static struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	u32 msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
} debug = { -1 };
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
enum rtl_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	MAC0		= 0,	/* Ethernet hardware address. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	MAC4		= 4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	MAR0		= 8,	/* Multicast filter. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	CounterAddrLow		= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	CounterAddrHigh		= 0x14,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxDescStartAddrLow	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	TxDescStartAddrHigh	= 0x24,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	TxHDescStartAddrLow	= 0x28,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	TxHDescStartAddrHigh	= 0x2c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	FLASH		= 0x30,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	ERSR		= 0x36,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	ChipCmd		= 0x37,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxPoll		= 0x38,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	IntrMask	= 0x3c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	IntrStatus	= 0x3e,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	TxConfig	= 0x40,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	RxConfig	= 0x44,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	RxMissed	= 0x4c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Cfg9346		= 0x50,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config0		= 0x51,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config1		= 0x52,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config2		= 0x53,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	Config3		= 0x54,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	Config4		= 0x55,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	Config5		= 0x56,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	MultiIntr	= 0x5c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	PHYAR		= 0x60,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	PHYstatus	= 0x6c,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxMaxSize	= 0xda,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	CPlusCmd	= 0xe0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	IntrMitigate	= 0xe2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	RxDescAddrLow	= 0xe4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	RxDescAddrHigh	= 0xe8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	EarlyTxThres	= 0xec,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncEvent	= 0xf0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	FuncEventMask	= 0xf4,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	FuncPresetState	= 0xf8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	FuncForceEvent	= 0xfc,
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 rtl8110_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	TBICSR			= 0x64,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	TBI_ANAR		= 0x68,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	TBI_LPAR		= 0x6a,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
enum rtl8168_8101_registers {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	CSIDR			= 0x64,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	CSIAR			= 0x68,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_FLAG			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_WRITE_CMD			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define	CSIAR_BYTE_ENABLE		0x0f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define	CSIAR_BYTE_ENABLE_SHIFT		12
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	CSIAR_ADDR_MASK			0x0fff
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	EPHYAR			= 0x80,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_FLAG			0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_WRITE_CMD		0x80000000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
#define	EPHYAR_REG_MASK			0x1f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	EPHYAR_REG_SHIFT		16
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	EPHYAR_DATA_MASK		0xffff
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	DBG_REG			= 0xd1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	FIX_NAK_1			(1 << 4)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	FIX_NAK_2			(1 << 3)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
enum rtl_register_content {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	/* InterruptStatusBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	SYSErr		= 0x8000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	PCSTimeout	= 0x4000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	SWInt		= 0x0100,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	TxDescUnavail	= 0x0080,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	RxFIFOOver	= 0x0040,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	LinkChg		= 0x0020,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	RxOverflow	= 0x0010,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	TxErr		= 0x0008,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	TxOK		= 0x0004,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	RxErr		= 0x0002,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxOK		= 0x0001,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	/* RxStatusDesc */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxFOVF	= (1 << 23),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	RxRWT	= (1 << 22),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	RxRES	= (1 << 21),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	RxRUNT	= (1 << 20),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxCRC	= (1 << 19),
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
	/* ChipCmdBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	CmdReset	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	CmdRxEnb	= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	CmdTxEnb	= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	RxBufEmpty	= 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	/* TXPoll register p.5 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	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
   296
	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
   297
	FSWInt		= 0x01,		/* Forced software interrupt */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	/* Cfg9346Bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	Cfg9346_Lock	= 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	Cfg9346_Unlock	= 0xc0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	/* rx_mode_bits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	AcceptErr	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	AcceptRunt	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	AcceptBroadcast	= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	AcceptMulticast	= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	AcceptMyPhys	= 0x02,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	AcceptAllPhys	= 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	/* RxConfigBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	RxCfgFIFOShift	= 13,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	RxCfgDMAShift	=  8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	/* TxConfigBits */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	TxInterFrameGapShift = 24,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	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
   318
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* Config1 register p.24 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	LEDS1		= (1 << 7),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	LEDS0		= (1 << 6),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	Speed_down	= (1 << 4),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	MEMMAP		= (1 << 3),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	IOMAP		= (1 << 2),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	VPD		= (1 << 1),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	PMEnable	= (1 << 0),	/* Power Management Enable */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	/* Config2 register p. 25 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	PCI_Clock_66MHz = 0x01,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	PCI_Clock_33MHz = 0x00,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	/* Config3 register p.25 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	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
   335
	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
   336
	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
   337
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	/* Config5 register p.27 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	LanWake		= (1 << 1),	/* LanWake enable/disable */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	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
   344
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	/* TBICSR p.28 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	TBIReset	= 0x80000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	TBILoopback	= 0x40000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	TBINwEnable	= 0x20000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	TBINwRestart	= 0x10000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	TBILinkOk	= 0x02000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	TBINwComplete	= 0x01000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	/* CPlusCmd p.31 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	EnableBist	= (1 << 15),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	Normal_mode	= (1 << 13),	// unused
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	Force_half_dup	= (1 << 12),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	Force_rxflow_en	= (1 << 11),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	Force_txflow_en	= (1 << 10),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	ASF		= (1 << 8),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	PktCntrDisable	= (1 << 7),	// 8168 8101
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Mac_dbgo_sel	= 0x001c,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	RxVlan		= (1 << 6),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	RxChkSum	= (1 << 5),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	PCIDAC		= (1 << 4),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	PCIMulRW	= (1 << 3),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	INTT_0		= 0x0000,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	INTT_1		= 0x0001,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	INTT_2		= 0x0002,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	INTT_3		= 0x0003,	// 8168
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	/* rtl8169_PHYstatus */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	TBI_Enable	= 0x80,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	TxFlowCtrl	= 0x40,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	RxFlowCtrl	= 0x20,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	_1000bpsF	= 0x10,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	_100bps		= 0x08,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	_10bps		= 0x04,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	LinkStatus	= 0x02,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	FullDup		= 0x01,
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
	/* _TBICSRBit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	TBILinkOK	= 0x02000000,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	/* DumpCounterCommand */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	CounterDump	= 0x8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
};
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
enum desc_status_bit {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	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
   392
	RingEnd		= (1 << 30), /* End of descriptor ring */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	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
   394
	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
   395
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	/* Tx private */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	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
   398
	MSSShift	= 16,        /* MSS value position */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	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
   400
	IPCS		= (1 << 18), /* Calculate IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	/* Rx private */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	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
   407
	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
   408
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
#define RxProtoUDP	(PID1)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
#define RxProtoTCP	(PID0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
#define RxProtoIP	(PID1 | PID0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
#define RxProtoMask	RxProtoIP
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
	IPFail		= (1 << 16), /* IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	RxVlanTag	= (1 << 16), /* VLAN tag available */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
#define RsvdMask	0x3fffc000
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 TxDesc {
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 RxDesc {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	__le32 opts1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	__le32 opts2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	__le64 addr;
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
struct ring_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	struct sk_buff	*skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	u32		len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	u8		__pad[sizeof(void *) - sizeof(u32)];
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
enum features {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	RTL_FEATURE_WOL		= (1 << 0),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	RTL_FEATURE_MSI		= (1 << 1),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	RTL_FEATURE_GMII	= (1 << 2),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
struct rtl8169_counters {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	__le64	tx_packets;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	__le64	rx_packets;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	__le64	tx_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	__le32	rx_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	__le16	rx_missed;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	__le16	align_errors;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	__le32	tx_one_collision;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	__le32	tx_multi_collision;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	__le64	rx_unicast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	__le64	rx_broadcast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	__le32	rx_multicast;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	__le16	tx_aborted;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	__le16	tx_underun;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
struct rtl8169_private {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	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
   464
	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
   465
	struct net_device *dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	struct napi_struct napi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	spinlock_t lock;		/* spin lock flag */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	u32 msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	int chipset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	int mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	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
   472
	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
   473
	u32 dirty_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	u32 dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	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
   476
	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
   477
	dma_addr_t TxPhyAddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	dma_addr_t RxPhyAddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	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
   480
	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
   481
	unsigned align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	unsigned rx_buf_sz;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	struct timer_list timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	u16 cp_cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	u16 intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	u16 napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	u16 intr_mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	int phy_auto_nego_reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	int phy_1000_ctrl_reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	struct vlan_group *vlgrp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	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
   494
	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
   495
	void (*phy_reset_enable)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	void (*hw_start)(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	unsigned int (*phy_reset_pending)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	unsigned int (*link_ok)(void __iomem *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	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
   500
	int pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	struct delayed_work task;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	unsigned features;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	struct mii_if_info mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	struct rtl8169_counters counters;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	ec_device_t *ecdev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	unsigned long ec_watchdog_jiffies;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
MODULE_DESCRIPTION("EtherCAT-capable RealTek RTL-8169 Gigabit Ethernet driver");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
module_param(rx_copybreak, int, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
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
   515
module_param(use_dac, int, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
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
   517
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
   518
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
   519
MODULE_LICENSE("GPL");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
MODULE_VERSION(EC_MASTER_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
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
   523
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
   524
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
   525
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
   526
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
   527
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
   528
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
   529
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
   530
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
   531
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
   532
				void __iomem *, u32 budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
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
   534
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
   535
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
   536
static void ec_poll(struct net_device *dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
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
   538
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
static const unsigned int rtl8169_rx_config =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	(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
   541
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
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
   543
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	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
   547
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	for (i = 20; i > 0; i--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		 * 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
   551
		 * MII register.
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
		if (!(RTL_R32(PHYAR) & 0x80000000))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
		udelay(25);
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
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
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
   560
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	int i, value = -1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	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
   564
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	for (i = 20; i > 0; i--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
		 * 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
   568
		 * the specified MII register.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		if (RTL_R32(PHYAR) & 0x80000000) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
			value = RTL_R32(PHYAR) & 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
			break;
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
		udelay(25);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	return value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
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
   580
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	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
   582
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
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
   585
			   int val)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	void __iomem *ioaddr = tp->mmio_addr;
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
	mdio_write(ioaddr, location, val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
}
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
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
   594
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	void __iomem *ioaddr = tp->mmio_addr;
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
	return mdio_read(ioaddr, location);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
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
   602
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
	unsigned int i;
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
	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
   606
		(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
   607
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
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
   616
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	u16 value = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	unsigned int i;
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
	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
   621
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
			break;
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
		udelay(10);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	return value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
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
   634
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	unsigned int i;
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
	RTL_W32(CSIDR, value);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	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
   639
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		udelay(10);
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
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
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
   649
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	u32 value = ~0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	unsigned int i;
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
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
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
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
			value = RTL_R32(CSIDR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
			break;
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
		udelay(10);
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
	return value;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
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
   668
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	RTL_W16(IntrMask, 0x0000);
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
	RTL_W16(IntrStatus, 0xffff);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
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
   675
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
	RTL_W8(ChipCmd, 0x00);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	RTL_R16(CPlusCmd);
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_reset_pending(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) & TBIReset;
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_reset_pending(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 mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
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 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
   692
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	return RTL_R32(TBICSR) & TBILinkOk;
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 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
   697
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	return RTL_R8(PHYstatus) & LinkStatus;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
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
   702
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
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
   707
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	unsigned int val;
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
	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
   711
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
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
   715
				      struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
				      void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	unsigned long flags;
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
    if (tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
		spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
		if (tp->link_ok(ioaddr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
			netif_carrier_on(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
			if (netif_msg_ifup(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
				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
   728
		} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
			if (netif_msg_ifdown(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
				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
   731
			netif_carrier_off(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
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
   738
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	u8 options;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	wol->wolopts = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
#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
   746
	wol->supported = WAKE_ANY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
	options = RTL_R8(Config1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	if (!(options & PMEnable))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		goto out_unlock;
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
	options = RTL_R8(Config3);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	if (options & LinkUp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
		wol->wolopts |= WAKE_PHY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	if (options & MagicPacket)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		wol->wolopts |= WAKE_MAGIC;
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
	options = RTL_R8(Config5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	if (options & UWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		wol->wolopts |= WAKE_UCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	if (options & BWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		wol->wolopts |= WAKE_BCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	if (options & MWF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		wol->wolopts |= WAKE_MCAST;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
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
   773
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	static struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		u32 opt;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		u16 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		u8  mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	} cfg[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		{ WAKE_ANY,   Config1, PMEnable },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		{ WAKE_PHY,   Config3, LinkUp },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
		{ WAKE_MAGIC, Config3, MagicPacket },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
		{ WAKE_UCAST, Config5, UWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
		{ WAKE_BCAST, Config5, BWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		{ WAKE_MCAST, Config5, MWF },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		{ WAKE_ANY,   Config5, LanWake }
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	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
   796
		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
   797
		if (wol->wolopts & cfg[i].opt)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
			options |= cfg[i].mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
		RTL_W8(cfg[i].reg, options);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	RTL_W8(Cfg9346, Cfg9346_Lock);
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
	if (wol->wolopts)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
		tp->features &= ~RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	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
   809
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
}
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
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
   816
				struct ethtool_drvinfo *info)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	strcpy(info->driver, MODULENAME);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	strcpy(info->version, RTL8169_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	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
   823
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
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
   826
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	return R8169_REGS_SIZE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
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
   831
				 u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	int ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	u32 reg;
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
	reg = RTL_R32(TBICSR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	    (duplex == DUPLEX_FULL)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	} else if (autoneg == AUTONEG_ENABLE)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		if (netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
			printk(KERN_WARNING "%s: "
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
			       "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
   848
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		ret = -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	return ret;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
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
   857
				  u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	int auto_nego, giga_ctrl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
		       ADVERTISE_100HALF | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
	giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
	giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	if (autoneg == AUTONEG_ENABLE) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		if (speed == SPEED_10)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
			auto_nego |= ADVERTISE_10HALF | ADVERTISE_10FULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		else if (speed == SPEED_100)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
			auto_nego |= ADVERTISE_100HALF | ADVERTISE_100FULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		else if (speed == SPEED_1000)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
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
		if (duplex == DUPLEX_HALF)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
			auto_nego &= ~(ADVERTISE_10FULL | ADVERTISE_100FULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		if (duplex == DUPLEX_FULL)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
			auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_100HALF);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
		/* 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
   888
		if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) &&
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_13) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		     (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
   891
			auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
	}
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
	/* 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
   896
	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
   897
	    (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
   898
	    (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
   899
	    (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
   900
	    (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
   901
	    (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
   902
	    (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
   903
	    (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
   904
		if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		    netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
			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
   907
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	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
   913
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	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
   915
	    (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
   916
	    (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
   917
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
		 * Wake up the PHY.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
		 * 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
   920
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
		mdio_write(ioaddr, 0x0e, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
	tp->phy_auto_nego_reg = auto_nego;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	tp->phy_1000_ctrl_reg = giga_ctrl;
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
	mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	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
   931
	return 0;
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_speed(struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
			     u8 autoneg, u16 speed, u8 duplex)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	struct rtl8169_private *tp = netdev_priv(dev);
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
	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
   941
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	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
   943
		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
   944
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	return ret;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
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
   949
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	int ret;
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
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	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
   956
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	return ret;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
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
   962
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
	return 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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
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
   969
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	unsigned long flags;
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
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	if (data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		tp->cp_cmd |= RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
		tp->cp_cmd &= ~RxChkSum;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	RTL_R16(CPlusCmd);
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
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
#ifdef CONFIG_R8169_VLAN
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
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
   992
				      struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	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
   995
		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
   996
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
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
   999
				     struct vlan_group *grp)
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
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	unsigned long flags;
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
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	tp->vlgrp = grp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	if (tp->vlgrp)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
		tp->cp_cmd |= RxVlan;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
		tp->cp_cmd &= ~RxVlan;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
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
  1017
			       struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	u32 opts2 = le32_to_cpu(desc->opts2);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	struct vlan_group *vlgrp = tp->vlgrp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	int ret;
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
	if (vlgrp && (opts2 & RxVlanTag)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
		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
  1025
		ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	} else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		ret = -1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
	desc->opts2 = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	return ret;
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
#else /* !CONFIG_R8169_VLAN */
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 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
  1035
				      struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
}
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
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
  1041
			       struct sk_buff *skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	return -1;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
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
  1049
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	u32 status;
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
	cmd->supported =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	cmd->port = PORT_FIBRE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	cmd->transceiver = XCVR_INTERNAL;
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
	status = RTL_R32(TBICSR);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	cmd->autoneg = !!(status & TBINwEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	cmd->speed = SPEED_1000;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	cmd->duplex = DUPLEX_FULL; /* Always set */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	return 0;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
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
  1070
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
	return mii_ethtool_gset(&tp->mii, cmd);
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 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
  1077
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	int rc;
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
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	rc = tp->get_settings(dev, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	return rc;
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 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
  1091
			     void *p)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
	unsigned long flags;
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
	if (regs->len > R8169_REGS_SIZE)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
		regs->len = R8169_REGS_SIZE;
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
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	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
  1101
	spin_unlock_irqrestore(&tp->lock, flags);
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 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
  1105
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	return tp->msg_enable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
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
  1112
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	tp->msg_enable = value;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
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
  1119
	"tx_packets",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	"rx_packets",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	"tx_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	"rx_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	"rx_missed",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	"align_errors",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	"tx_single_collisions",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	"tx_multi_collisions",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	"unicast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	"broadcast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	"multicast",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	"tx_aborted",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	"tx_underrun",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
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
  1135
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	switch (sset) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	case ETH_SS_STATS:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
		return ARRAY_SIZE(rtl8169_gstrings);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
		return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
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
  1145
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	struct rtl8169_counters *counters;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	dma_addr_t paddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	u32 cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	int wait = 1000;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	 * 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
  1155
	 * is disabled.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	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
  1161
	if (!counters)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
		return;
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(CounterAddrHigh, (u64)paddr >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	cmd = (u64)paddr & DMA_32BIT_MASK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	RTL_W32(CounterAddrLow, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	RTL_W32(CounterAddrLow, cmd | CounterDump);
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
	while (wait--) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
			/* copy updated counters */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
			memcpy(&tp->counters, counters, sizeof(*counters));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
			break;
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
		udelay(10);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	RTL_W32(CounterAddrLow, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	RTL_W32(CounterAddrHigh, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	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
  1182
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
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
  1185
				      struct ethtool_stats *stats, u64 *data)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	ASSERT_RTNL();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	rtl8169_update_counters(dev);
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
	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
  1194
	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
  1195
	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
  1196
	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
  1197
	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
  1198
	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
  1199
	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
  1200
	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
  1201
	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
  1202
	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
  1203
	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
  1204
	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
  1205
	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
  1206
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
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
  1209
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	switch(stringset) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	case ETH_SS_STATS:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
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
  1218
	.get_drvinfo		= rtl8169_get_drvinfo,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	.get_regs_len		= rtl8169_get_regs_len,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	.get_link		= ethtool_op_get_link,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	.get_settings		= rtl8169_get_settings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	.set_settings		= rtl8169_set_settings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	.get_msglevel		= rtl8169_get_msglevel,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	.set_msglevel		= rtl8169_set_msglevel,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	.get_rx_csum		= rtl8169_get_rx_csum,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	.set_rx_csum		= rtl8169_set_rx_csum,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	.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
  1228
	.set_sg			= ethtool_op_set_sg,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	.set_tso		= ethtool_op_set_tso,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	.get_regs		= rtl8169_get_regs,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	.get_wol		= rtl8169_get_wol,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	.set_wol		= rtl8169_set_wol,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	.get_strings		= rtl8169_get_strings,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	.get_sset_count		= rtl8169_get_sset_count,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
};
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
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
  1239
				       int bitnum, int bitval)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	int val;
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
	val = mdio_read(ioaddr, reg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	val = (bitval == 1) ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	mdio_write(ioaddr, reg, val & 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
}
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
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
  1250
				    void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	 * 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
  1254
	 * 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
  1255
	 * if needed:
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
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
	 * 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
  1260
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	const struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		u32 mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		u32 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		int mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	} mac_info[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		/* 8168D family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_25 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		/* 8168C family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ 0x7cf00000, 0x3ca00000,	RTL_GIGA_MAC_VER_24 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		/* 8168B family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		/* 8101 family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
		/* 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
  1302
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
		/* 8110 family. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
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
		{ 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
  1314
	}, *p = mac_info;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	u32 reg;
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
	reg = RTL_R32(TxConfig);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	while ((reg & p->mask) != p->val)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		p++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	tp->mac_version = p->mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	if (p->mask == 0x00000000) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
		struct pci_dev *pdev = tp->pci_dev;
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
		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
  1326
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
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
  1330
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	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
  1332
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
struct phy_reg {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
	u16 reg;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
	u16 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
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
  1340
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
	while (len-- > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		mdio_write(ioaddr, regs->reg, regs->val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		regs++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
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
  1348
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		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
  1351
	} phy_magic[5] = { {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		{ 0x0000,	//w 4 15 12 0
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		  0x00a1,	//w 3 15 0 00a1
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		  0x0008,	//w 2 15 0 0008
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		  0x1020,	//w 1 15 0 1020
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		  0x1000 } },{	//w 0 15 0 1000
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		{ 0x7000,	//w 4 15 12 7
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		  0xff41,	//w 3 15 0 ff41
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		  0xde60,	//w 2 15 0 de60
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		  0x0140,	//w 1 15 0 0140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		  0x0077 } },{	//w 0 15 0 0077
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		{ 0xa000,	//w 4 15 12 a
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		  0xdf01,	//w 3 15 0 df01
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		  0xdf20,	//w 2 15 0 df20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		  0xff95,	//w 1 15 0 ff95
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		  0xfa00 } },{	//w 0 15 0 fa00
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		{ 0xb000,	//w 4 15 12 b
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		  0xff41,	//w 3 15 0 ff41
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		  0xde20,	//w 2 15 0 de20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		  0x0140,	//w 1 15 0 0140
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		  0x00bb } },{	//w 0 15 0 00bb
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		{ 0xf000,	//w 4 15 12 f
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		  0xdf01,	//w 3 15 0 df01
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		  0xdf20,	//w 2 15 0 df20
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		  0xff95,	//w 1 15 0 ff95
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		  0xbf00 }	//w 0 15 0 bf00
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	}, *p = phy_magic;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
	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
  1382
	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
  1383
	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
  1384
	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
  1385
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	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
  1387
		int val, pos = 4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		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
  1390
		mdio_write(ioaddr, pos, val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
		while (--pos >= 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
			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
  1393
		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
  1394
		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
  1395
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	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
  1397
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
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
  1400
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		{ 0x01, 0x90d0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		{ 0x1f, 0x0000 }
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	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
  1408
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
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
  1411
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	struct phy_reg phy_reg_init[] = {
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
	mdio_write(ioaddr, 0x1f, 0x0001);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	mdio_patch(ioaddr, 0x16, 1 << 0);
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
	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
  1421
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
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
  1424
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x10, 0xf41b },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x1f, 0x0000 }
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	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
  1432
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
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
  1435
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		{ 0x1d, 0x0f00 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
		{ 0x0c, 0x1ec8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	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
  1445
}
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
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
  1448
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	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
  1460
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
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
  1463
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		{ 0x00, 0x88d4 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x01, 0x82b1 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x03, 0x7002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		{ 0x08, 0x9e30 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
		{ 0x09, 0x01f0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		{ 0x0a, 0x5500 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
		{ 0x0c, 0x00c8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		{ 0x12, 0xc096 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		{ 0x16, 0x000a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		{ 0x09, 0x2000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		{ 0x09, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
	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
  1485
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
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
  1492
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		{ 0x03, 0x802f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		{ 0x02, 0x4f02 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		{ 0x01, 0x0409 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		{ 0x00, 0xf099 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		{ 0x04, 0x9800 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x04, 0x9000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x0c, 0x7eb8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		{ 0x06, 0x0761 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		{ 0x16, 0x0f0a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	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
  1512
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
	mdio_patch(ioaddr, 0x16, 1 << 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	mdio_write(ioaddr, 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
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
  1520
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x12, 0x2300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		{ 0x1d, 0x3d98 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x0c, 0x7eb8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		{ 0x06, 0x5461 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x16, 0x0f0a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		{ 0x1f, 0x0000 }
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	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
  1534
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
	mdio_patch(ioaddr, 0x16, 1 << 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
	mdio_patch(ioaddr, 0x14, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
	mdio_patch(ioaddr, 0x0d, 1 << 5);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
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
  1542
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
	rtl8168c_3_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
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
  1547
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	struct phy_reg phy_reg_init_0[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x1f, 0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x09, 0x2770 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x08, 0x04d0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x0b, 0xad15 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x0c, 0x5bf0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x1c, 0xf101 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x14, 0x94d7 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x12, 0xf4d6 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x09, 0xca0f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x0b, 0x0b10 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x0c, 0xd1f7 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x06, 0x5461 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x1f, 0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x05, 0x6662 },
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
		{ 0x14, 0x0060 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
		{ 0x0d, 0xf8a0 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
		{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
		{ 0x05, 0xffc2 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	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
  1575
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
	if (mdio_read(ioaddr, 0x06) == 0xc400) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
		struct phy_reg phy_reg_init_1[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			{ 0x01, 0x0300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
			{ 0x1f, 0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
			{ 0x11, 0x401c },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			{ 0x16, 0x4100 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
			{ 0x1f, 0x0005 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			{ 0x07, 0x0010 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			{ 0x05, 0x83dc },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			{ 0x06, 0x087d },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
			{ 0x05, 0x8300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
			{ 0x06, 0x0101 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			{ 0x06, 0x05f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
			{ 0x06, 0xf9fa },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
			{ 0x06, 0xfbef },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
			{ 0x06, 0x79e2 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
			{ 0x06, 0x835f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
			{ 0x06, 0xe0f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
			{ 0x06, 0x9ae1 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
			{ 0x06, 0xf89b },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
			{ 0x06, 0xef31 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
			{ 0x06, 0x3b65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
			{ 0x06, 0xaa07 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
			{ 0x06, 0x81e4 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
			{ 0x06, 0xf89a },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
			{ 0x06, 0xe5f8 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
			{ 0x06, 0x9baf },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
			{ 0x06, 0x06ae },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
			{ 0x05, 0x83dc },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
			{ 0x06, 0x8300 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
		};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		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
  1610
			      ARRAY_SIZE(phy_reg_init_1));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	mdio_write(ioaddr, 0x1f, 0x0000);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
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
  1617
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	struct phy_reg phy_reg_init[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
		{ 0x1f, 0x0003 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		{ 0x08, 0x441d },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		{ 0x01, 0x9100 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		{ 0x1f, 0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	};
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
	mdio_write(ioaddr, 0x1f, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	mdio_patch(ioaddr, 0x11, 1 << 12);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
	mdio_patch(ioaddr, 0x19, 1 << 13);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	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
  1630
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
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
  1633
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	rtl8169_print_mac_version(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	case RTL_GIGA_MAC_VER_01:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	case RTL_GIGA_MAC_VER_02:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	case RTL_GIGA_MAC_VER_03:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		rtl8169s_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_04:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		rtl8169sb_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_07:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	case RTL_GIGA_MAC_VER_08:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	case RTL_GIGA_MAC_VER_09:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		rtl8102e_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
	case RTL_GIGA_MAC_VER_11:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		rtl8168bb_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	case RTL_GIGA_MAC_VER_12:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		rtl8168bef_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
	case RTL_GIGA_MAC_VER_17:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		rtl8168bef_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	case RTL_GIGA_MAC_VER_18:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		rtl8168cp_1_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	case RTL_GIGA_MAC_VER_19:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		rtl8168c_1_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
	case RTL_GIGA_MAC_VER_20:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		rtl8168c_2_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	case RTL_GIGA_MAC_VER_21:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		rtl8168c_3_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	case RTL_GIGA_MAC_VER_22:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		rtl8168c_4_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	case RTL_GIGA_MAC_VER_23:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	case RTL_GIGA_MAC_VER_24:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		rtl8168cp_2_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	case RTL_GIGA_MAC_VER_25:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		rtl8168d_hw_phy_config(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
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
  1692
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	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
  1694
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	struct timer_list *timer = &tp->timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	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
  1700
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	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
  1702
		return;
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 (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		spin_lock_irq(&tp->lock);
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
	if (tp->phy_reset_pending(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
		 * 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
  1710
		 * 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
  1711
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
		timeout = HZ/10;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		goto out_mod_timer;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	if (tp->link_ok(ioaddr))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	if (netif_msg_link(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		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
  1721
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	tp->phy_reset_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
out_mod_timer:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		mod_timer(timer, jiffies + timeout);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		spin_unlock_irq(&tp->lock);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
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
  1733
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	struct timer_list *timer = &tp->timer;
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
	if (tp->ecdev || 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
  1738
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	del_timer_sync(timer);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
}
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 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
  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 timer_list *timer = &tp->timer;
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
	if (tp->ecdev || 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
  1749
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
}
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
#ifdef CONFIG_NET_POLL_CONTROLLER
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
 * 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
  1757
 * 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
  1758
 * the interrupt routine is executing.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
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
  1761
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
	disable_irq(pdev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	rtl8169_interrupt(pdev->irq, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	enable_irq(pdev->irq);
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
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
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
  1772
				  void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	iounmap(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	pci_release_regions(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	pci_disable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	free_netdev(dev);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
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
  1781
			      struct rtl8169_private *tp)
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
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	tp->phy_reset_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		if (!tp->phy_reset_pending(ioaddr))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
			return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		msleep(1);
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 (netif_msg_link(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		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
  1794
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
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
  1797
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	rtl_hw_phy_config(dev);
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
	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
  1803
		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
  1804
		RTL_W8(0x82, 0x01);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	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
  1808
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	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
  1810
		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
  1811
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	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
  1813
		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
  1814
		RTL_W8(0x82, 0x01);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		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
  1817
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	rtl8169_phy_reset(dev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	 * 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
  1823
	 * only 8101. Don't panic.
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
	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
  1826
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	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
  1828
		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
  1829
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
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
  1832
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	u32 high;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	u32 low;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	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
  1838
	high = addr[4] | (addr[5] << 8);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	RTL_W32(MAC0, low);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	RTL_W32(MAC4, high);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	RTL_W8(Cfg9346, Cfg9346_Lock);
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
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
}
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
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
  1851
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	struct sockaddr *addr = p;
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
	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
  1856
		return -EADDRNOTAVAIL;
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
	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
  1859
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	rtl_rar_set(tp, dev->dev_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
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
  1866
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
	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
  1869
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	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
  1871
}
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
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
  1874
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	switch (cmd) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	case SIOCGMIIPHY:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		data->phy_id = 32; /* Internal PHY */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		return 0;
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
	case SIOCGMIIREG:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		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
  1882
		return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
	case SIOCSMIIREG:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		if (!capable(CAP_NET_ADMIN))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
			return -EPERM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		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
  1888
		return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
	return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
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
  1894
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	return -EOPNOTSUPP;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
}
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
static const struct rtl_cfg_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	void (*hw_start)(struct net_device *);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	unsigned int region;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	unsigned int align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	u16 intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
	u16 napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	unsigned features;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
} rtl_cfg_infos [] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	[RTL_CFG_0] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		.hw_start	= rtl_hw_start_8169,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		.region		= 1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		.align		= 0,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		.intr_event	= SYSErr | LinkChg | RxOverflow |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		.features	= RTL_FEATURE_GMII
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	[RTL_CFG_1] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		.hw_start	= rtl_hw_start_8168,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		.region		= 2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		.align		= 8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		.intr_event	= SYSErr | LinkChg | RxOverflow |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
				  TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	},
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	[RTL_CFG_2] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		.hw_start	= rtl_hw_start_8101,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		.region		= 2,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		.align		= 8,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		.features	= 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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
/* Cfg9346_Unlock assumed. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
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
  1937
			    const struct rtl_cfg_info *cfg)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	unsigned msi = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	u8 cfg2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	if (cfg->features & RTL_FEATURE_MSI) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		if (pci_enable_msi(pdev)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
			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
  1946
		} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
			cfg2 |= MSIEnable;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
			msi = RTL_FEATURE_MSI;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	RTL_W8(Config2, cfg2);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	return msi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
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
  1956
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	if (tp->features & RTL_FEATURE_MSI) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		pci_disable_msi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		tp->features &= ~RTL_FEATURE_MSI;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
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
  1964
	.ndo_open		= rtl8169_open,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	.ndo_stop		= rtl8169_close,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
	.ndo_get_stats		= rtl8169_get_stats,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	.ndo_start_xmit		= rtl8169_start_xmit,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	.ndo_tx_timeout		= rtl8169_tx_timeout,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	.ndo_validate_addr	= eth_validate_addr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	.ndo_change_mtu		= rtl8169_change_mtu,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	.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
  1972
	.ndo_do_ioctl		= rtl8169_ioctl,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	.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
  1974
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	.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
  1976
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
#ifdef CONFIG_NET_POLL_CONTROLLER
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	.ndo_poll_controller	= rtl8169_netpoll,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
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
static int __devinit
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
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
  1985
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	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
  1987
	const unsigned int region = cfg->region;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
	struct rtl8169_private *tp;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	struct mii_if_info *mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	struct net_device *dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	void __iomem *ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	int rc;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	if (netif_msg_drv(&debug)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		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
  1997
		       MODULENAME, RTL8169_VERSION);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	dev = alloc_etherdev(sizeof (*tp));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	if (!dev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		if (netif_msg_drv(&debug))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
			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
  2004
		rc = -ENOMEM;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	SET_NETDEV_DEV(dev, &pdev->dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
	dev->netdev_ops = &rtl8169_netdev_ops;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
	tp->dev = dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	tp->pci_dev = pdev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
	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
  2014
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	mii = &tp->mii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	mii->dev = dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	mii->mdio_read = rtl_mdio_read;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	mii->mdio_write = rtl_mdio_write;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	mii->phy_id_mask = 0x1f;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	mii->reg_num_mask = 0x1f;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	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
  2022
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	/* 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
  2024
	rc = pci_enable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
			dev_err(&pdev->dev, "enable failure\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		goto err_out_free_dev_1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	rc = pci_set_mwi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	if (rc < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		goto err_out_disable_2;
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
	/* 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
  2036
	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
  2037
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
			dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
				"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
  2040
				region);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		rc = -ENODEV;
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
	/* check for weird/broken PCI region reporting */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	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
  2048
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
			dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
				"Invalid PCI region size(s), aborting\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		rc = -ENODEV;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		goto err_out_mwi_3;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	rc = pci_request_regions(pdev, MODULENAME);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
			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
  2060
		goto err_out_mwi_3;
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
	tp->cp_cmd = PCIMulRW | RxChkSum;
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
	if ((sizeof(dma_addr_t) > 4) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	    !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
  2067
		tp->cp_cmd |= PCIDAC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		dev->features |= NETIF_F_HIGHDMA;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		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
  2071
		if (rc < 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
			if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
				dev_err(&pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
					"DMA configuration failed.\n");
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
			goto err_out_free_res_4;
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
	}
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
	pci_set_master(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	/* ioremap MMIO region */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	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
  2084
	if (!ioaddr) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		if (netif_msg_probe(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
			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
  2087
		rc = -EIO;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		goto err_out_free_res_4;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	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
  2092
	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
  2093
		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
  2094
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	RTL_W16(IntrMask, 0x0000);
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
	/* Soft reset the chip. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	RTL_W8(ChipCmd, CmdReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
	/* 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
  2101
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		msleep_interruptible(1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	RTL_W16(IntrStatus, 0xffff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	/* Identify chip attached to board */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	rtl8169_get_mac_version(tp, ioaddr);
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
	rtl8169_print_mac_version(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	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
  2115
		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
  2116
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	if (i == ARRAY_SIZE(rtl_chip_info)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
		/* 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
  2120
		if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
			dev_printk(KERN_DEBUG, &pdev->dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
				"unknown chip version, assuming %s\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
				rtl_chip_info[0].name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
		i = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	tp->chipset = i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	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
  2135
		tp->features |= RTL_FEATURE_WOL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	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
  2137
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	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
  2140
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
		tp->set_speed = rtl8169_set_speed_tbi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
		tp->get_settings = rtl8169_gset_tbi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
		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
  2144
		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
  2145
		tp->link_ok = rtl8169_tbi_link_ok;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
		tp->do_ioctl = rtl_tbi_ioctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		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
  2149
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
		tp->set_speed = rtl8169_set_speed_xmii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
		tp->get_settings = rtl8169_gset_xmii;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
		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
  2153
		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
  2154
		tp->link_ok = rtl8169_xmii_link_ok;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
		tp->do_ioctl = rtl_xmii_ioctl;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	spin_lock_init(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
	tp->mmio_addr = ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	/* Get MAC address */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	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
  2164
		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
  2165
	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
  2166
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	dev->irq = pdev->irq;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	dev->base_addr = (unsigned long) ioaddr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	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
  2173
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
#ifdef CONFIG_R8169_VLAN
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	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
  2176
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	tp->align = cfg->align;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	tp->hw_start = cfg->hw_start;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	tp->intr_event = cfg->intr_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	tp->napi_event = cfg->napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	init_timer(&tp->timer);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	tp->timer.data = (unsigned long) dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	tp->timer.function = rtl8169_phy_timer;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
	// offer device to EtherCAT master module
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
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
	if (!tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
		rc = register_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
		if (rc < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
			goto err_out_msi_5;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	}
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
	pci_set_drvdata(pdev, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	if (netif_msg_probe(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		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
  2203
		       "%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
  2204
		       "XID %08x IRQ %d\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		       dev->name,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		       rtl_chip_info[tp->chipset].name,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		       dev->base_addr,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		       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
  2209
		       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
  2210
		       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
  2211
	}
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
	rtl8169_init_phy(dev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
1897
029345a0de52 Removed printk().
Florian Pose <fp@igh-essen.com>
parents: 1515
diff changeset
  2215
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2216
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2217
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2218
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2219
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2220
			goto err_out_msi_5;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  2221
		}
1515
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
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	return rc;
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
err_out_msi_5:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	rtl_disable_msi(pdev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	iounmap(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
err_out_free_res_4:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	pci_release_regions(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
err_out_mwi_3:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	pci_clear_mwi(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
err_out_disable_2:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	pci_disable_device(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
err_out_free_dev_1:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	free_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
}
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
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
  2242
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	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
  2244
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	flush_scheduled_work();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	if (tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		ecdev_close(tp->ecdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		ecdev_withdraw(tp->ecdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		unregister_netdev(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	rtl_disable_msi(pdev, tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	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
  2256
	pci_set_drvdata(pdev, NULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
}
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
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
  2260
				  struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	unsigned int mtu = dev->mtu;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
	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
  2265
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
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
  2268
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	int retval = -ENOMEM;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	rtl8169_set_rxbufsize(tp, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	 * 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
  2278
	 * pci_alloc_consistent provides more.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	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
  2281
					       &tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	if (!tp->TxDescArray)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	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
  2286
					       &tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	if (!tp->RxDescArray)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		goto err_free_tx_0;
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
	retval = rtl8169_init_ring(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	if (retval < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		goto err_free_rx_1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	INIT_DELAYED_WORK(&tp->task, NULL);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	smp_mb();
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
	if (!tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		retval = request_irq(dev->irq, rtl8169_interrupt,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
				(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
  2301
				dev->name, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		if (retval < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
			goto err_release_ring_2;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		napi_enable(&tp->napi);
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
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	rtl_hw_start(dev);
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
	rtl8169_request_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	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
  2313
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	return retval;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
err_release_ring_2:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
err_free_rx_1:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	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
  2320
			    tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
err_free_tx_0:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	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
  2323
			    tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
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
  2328
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	/* Disable interrupts */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	/* Reset the chipset */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	RTL_W8(ChipCmd, CmdReset);
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
	/* PCI commit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
	RTL_R8(ChipCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
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
  2340
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	u32 cfg = rtl8169_rx_config;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	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
  2345
	RTL_W32(RxConfig, cfg);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	/* 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
  2348
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		(InterFrameGap << TxInterFrameGapShift));
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
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
  2353
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	/* Soft reset the chip. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	RTL_W8(ChipCmd, CmdReset);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	/* 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
  2362
	for (i = 0; i < 100; i++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
		msleep_interruptible(1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	}
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
	tp->hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		netif_start_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
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
  2376
					 void __iomem *ioaddr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	 * 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
  2380
	 * 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
  2381
	 * 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
  2382
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	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
  2385
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	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
  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
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
  2390
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
	u16 cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	cmd = RTL_R16(CPlusCmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	RTL_W16(CPlusCmd, cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	return cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
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
  2399
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	/* Low hurts. Let's disable the filtering. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	RTL_W16(RxMaxSize, 16383);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
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
  2405
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	struct {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		u32 mac_version;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		u32 clk;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
		u32 val;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	} cfg2_info [] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 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
  2412
		{ 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
  2413
		{ 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
  2414
		{ 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
  2415
	}, *p = cfg2_info;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	u32 clk;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	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
  2421
		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
  2422
			RTL_W32(0x7c, p->val);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
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
  2429
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	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
  2435
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
		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
  2437
	}
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
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	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
  2441
	    (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
  2442
	    (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
  2443
	    (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
  2444
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
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
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	rtl_set_rx_max_size(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
	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
  2451
	    (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
  2452
	    (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
  2453
	    (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
  2454
		rtl_set_rx_tx_config_registers(tp);
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
	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
  2457
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	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
  2459
	    (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
  2460
		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
  2461
			"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
  2462
		tp->cp_cmd |= (1 << 14);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	}
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
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	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
  2468
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	 * Undocumented corner. Supposedly:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
	RTL_W16(IntrMitigate, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	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
  2476
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	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
  2478
	    (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
  2479
	    (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
  2480
	    (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
  2481
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		rtl_set_rx_tx_config_registers(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	}
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
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	/* 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
  2488
	RTL_R8(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	RTL_W32(RxMissed, 0);
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
	rtl_set_rx_mode(dev);
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
	/* no early-rx interrupts */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	/* 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
  2498
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		RTL_W16(IntrMask, tp->intr_event);
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
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
  2503
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
	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
  2505
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
	int cap = tp->pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		u16 ctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
		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
  2512
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		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
  2514
	}
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
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
  2518
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	u32 csi;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
struct ephy_info {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	unsigned int offset;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	u16 mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	u16 bits;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
};
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
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
  2532
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	u16 w;
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
	while (len-- > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		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
  2537
		rtl_ephy_write(ioaddr, e->offset, w);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
		e++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
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
  2543
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	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
  2545
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	int cap = tp->pcie_cap;
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
	if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		u16 ctl;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
		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
  2552
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		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
  2554
	}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
#define R8168_CPCMD_QUIRK_MASK (\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
	EnableBist | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	Mac_dbgo_oe | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	Force_rxflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	Force_txflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	Cxpl_dbg_sel | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	ASF | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	PktCntrDisable | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	Mac_dbgo_sel)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
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
  2569
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	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
  2571
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	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
  2573
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	rtl_tx_performance_tweak(pdev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		(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
  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_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
  2579
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	rtl_hw_start_8168bb(ioaddr, pdev);
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(EarlyTxThres, EarlyTxThld);
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_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
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
  2588
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	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
  2590
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	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
  2592
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
	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
  2594
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	rtl_disable_clock_request(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
	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
  2598
}
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
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
  2601
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	static struct ephy_info e_info_8168cp[] = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		{ 0x01, 0,	0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
		{ 0x02, 0x0800,	0x1000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
		{ 0x03, 0,	0x0042 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
		{ 0x06, 0x0080,	0x0000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
		{ 0x07, 0,	0x2000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	rtl_csi_access_enable(ioaddr);
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
	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
  2613
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
}
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
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
  2618
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	rtl_csi_access_enable(ioaddr);
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
	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
  2622
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	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
  2624
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	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
  2626
}
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
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
  2629
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	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
  2633
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	/* Magic. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	RTL_W8(DBG_REG, 0x20);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	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
  2640
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	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
  2642
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
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
  2645
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	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
  2647
		{ 0x02, 0x0800,	0x1000 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
		{ 0x03, 0,	0x0002 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
		{ 0x06, 0x0080,	0x0000 }
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
	};
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_csi_access_enable(ioaddr);
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(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
  2655
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
	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
  2657
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	__rtl_hw_start_8168cp(ioaddr, pdev);
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_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
  2662
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	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
  2664
		{ 0x01, 0,	0x0001 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
		{ 0x03, 0x0400,	0x0220 }
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	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
  2671
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
}
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
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
  2676
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	rtl_hw_start_8168c_2(ioaddr, pdev);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
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
  2681
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	rtl_csi_access_enable(ioaddr);
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
	__rtl_hw_start_8168cp(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
}
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
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
  2688
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
	rtl_disable_clock_request(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	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
  2696
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	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
  2698
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
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
  2701
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	RTL_W8(Cfg9346, Cfg9346_Unlock);
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
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
	rtl_set_rx_max_size(ioaddr);
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
	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
  2713
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	RTL_W16(CPlusCmd, tp->cp_cmd);
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
	RTL_W16(IntrMitigate, 0x5151);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	/* Work around for RxFIFO overflow. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	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
  2720
		tp->intr_event |= RxFIFOOver | PCSTimeout;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
		tp->intr_event &= ~RxOverflow;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	}
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
	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
  2725
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
	rtl_set_rx_mode(dev);
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
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
		(InterFrameGap << TxInterFrameGapShift));
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	RTL_R8(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
	case RTL_GIGA_MAC_VER_11:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
		rtl_hw_start_8168bb(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	case RTL_GIGA_MAC_VER_12:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	case RTL_GIGA_MAC_VER_17:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		rtl_hw_start_8168bef(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	case RTL_GIGA_MAC_VER_18:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		rtl_hw_start_8168cp_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	case RTL_GIGA_MAC_VER_19:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		rtl_hw_start_8168c_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	break;
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
	case RTL_GIGA_MAC_VER_20:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		rtl_hw_start_8168c_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
	case RTL_GIGA_MAC_VER_21:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		rtl_hw_start_8168c_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	case RTL_GIGA_MAC_VER_22:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		rtl_hw_start_8168c_4(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	break;
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
	case RTL_GIGA_MAC_VER_23:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
		rtl_hw_start_8168cp_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	case RTL_GIGA_MAC_VER_24:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		rtl_hw_start_8168cp_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
	case RTL_GIGA_MAC_VER_25:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		rtl_hw_start_8168d(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	break;
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
	default:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		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
  2777
			dev->name, tp->mac_version);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	}
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_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
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(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
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
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
}
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
#define R810X_CPCMD_QUIRK_MASK (\
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	EnableBist | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	Mac_dbgo_oe | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	Force_half_dup | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	Force_txflow_en | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	Cxpl_dbg_sel | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	ASF | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	PktCntrDisable | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	PCIDAC | \
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	PCIMulRW)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
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
  2804
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	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
  2806
		{ 0x01,	0, 0x6e65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
		{ 0x02,	0, 0x091f },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
		{ 0x03,	0, 0xc2f9 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
		{ 0x06,	0, 0xafb5 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
		{ 0x07,	0, 0x0e00 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		{ 0x19,	0, 0xec80 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
		{ 0x01,	0, 0x2e65 },
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		{ 0x01,	0, 0x6e65 }
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
	u8 cfg1;
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
	rtl_csi_access_enable(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	RTL_W8(DBG_REG, FIX_NAK_1);
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
	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
  2822
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	RTL_W8(Config1,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	       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
  2825
	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
  2826
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
	cfg1 = RTL_R8(Config1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		RTL_W8(Config1, cfg1 & ~LEDS0);
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
	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
  2832
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	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
  2834
}
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
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
  2837
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	rtl_csi_access_enable(ioaddr);
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
	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
  2841
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	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
  2844
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	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
  2846
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
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
  2849
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	rtl_hw_start_8102e_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
}
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
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
  2856
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	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
  2862
	    (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
  2863
		int cap = tp->pcie_cap;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
		if (cap) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
			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
  2867
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
		}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	switch (tp->mac_version) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	case RTL_GIGA_MAC_VER_07:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
		rtl_hw_start_8102e_1(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	case RTL_GIGA_MAC_VER_08:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
		rtl_hw_start_8102e_3(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		break;
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
	case RTL_GIGA_MAC_VER_09:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
		rtl_hw_start_8102e_2(ioaddr, pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	}
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
	RTL_W8(Cfg9346, Cfg9346_Unlock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	RTL_W8(EarlyTxThres, EarlyTxThld);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	rtl_set_rx_max_size(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	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
  2892
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	RTL_W16(IntrMitigate, 0x0000);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	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
  2898
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	rtl_set_rx_tx_config_registers(tp);
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
	RTL_W8(Cfg9346, Cfg9346_Lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	RTL_R8(IntrMask);
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
	rtl_set_rx_mode(dev);
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
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
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
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
		RTL_W16(IntrMask, tp->intr_event);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
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
  2917
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	int ret = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	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
  2922
		return -EINVAL;
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
	dev->mtu = new_mtu;
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
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	rtl8169_down(dev);
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
	rtl8169_set_rxbufsize(tp, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	ret = rtl8169_init_ring(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	if (ret < 0)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	napi_enable(&tp->napi);
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
	rtl_hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	rtl8169_request_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
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
  2948
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
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
  2954
				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
  2955
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	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
  2959
			 PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	dev_kfree_skb(*sk_buff);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	*sk_buff = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
	rtl8169_make_unusable_by_asic(desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
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
  2966
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	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
  2968
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	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
  2970
}
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
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
  2973
				       u32 rx_buf_sz)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
	desc->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
	wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	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
  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 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
  2981
					    struct net_device *dev,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
					    struct RxDesc *desc, int rx_buf_sz,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
					    unsigned int align)
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
	struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
	unsigned int pad;
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
	pad = align ? align : NET_IP_ALIGN;
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
	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
  2992
	if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		goto err_out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	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
  2996
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	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
  2998
				 PCI_DMA_FROMDEVICE);
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
	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
  3001
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	return skb;
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
err_out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	rtl8169_make_unusable_by_asic(desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
}
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
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
  3010
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	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
  3014
		if (tp->Rx_skbuff[i]) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
			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
  3016
					    tp->RxDescArray + i);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
		}
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
}
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
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
  3022
			   u32 start, u32 end)
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
	u32 cur;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	for (cur = start; end - cur != 0; cur++) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
		struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
		unsigned int i = cur % NUM_RX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
		WARN_ON((s32)(end - cur) < 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
		if (tp->Rx_skbuff[i])
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
			continue;
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
		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
  3036
					   tp->RxDescArray + i,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
					   tp->rx_buf_sz, tp->align);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
		if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
			break;
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
		tp->Rx_skbuff[i] = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	return cur - start;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
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
  3047
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	desc->opts1 |= cpu_to_le32(RingEnd);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
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
  3052
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	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
  3054
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
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
  3057
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	struct rtl8169_private *tp = netdev_priv(dev);
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_init_ring_indexes(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
	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
  3063
	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
  3064
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	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
  3066
		goto err_out;
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
	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
  3069
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
	return 0;
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
err_out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	return -ENOMEM;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
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
  3078
				 struct TxDesc *desc)
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
	unsigned int len = tx_skb->len;
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
	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
  3083
	desc->opts1 = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	desc->opts2 = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	desc->addr = 0x00;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
	tx_skb->len = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
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
  3090
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	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
  3094
		unsigned int entry = i % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
		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
  3096
		unsigned int len = tx_skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
		if (len) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
			struct sk_buff *skb = tx_skb->skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
			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
  3102
					     tp->TxDescArray + entry);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
			if (skb) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
				if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
					dev_kfree_skb(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
				tx_skb->skb = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
			tp->dev->stats.tx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	tp->cur_tx = tp->dirty_tx = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
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
  3115
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	struct rtl8169_private *tp = netdev_priv(dev);
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
	PREPARE_DELAYED_WORK(&tp->task, task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	schedule_delayed_work(&tp->task, 4);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
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
  3123
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	void __iomem *ioaddr = tp->mmio_addr;
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
	synchronize_irq(dev->irq);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	/* 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
  3130
	napi_disable(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
	rtl8169_irq_mask_and_ack(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	RTL_W16(IntrMask, tp->intr_event);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
	napi_enable(&tp->napi);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
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
  3140
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	struct rtl8169_private *tp =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
		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
  3143
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	int ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	rtnl_lock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
		goto out_unlock;
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_wait_for_quiescence(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	rtl8169_close(dev);
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
	ret = rtl8169_open(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	if (unlikely(ret < 0)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
		if (net_ratelimit() && netif_msg_drv(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
			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
  3158
			       " Rescheduling.\n", dev->name, ret);
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
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
	rtnl_unlock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
}
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
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
  3168
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
	struct rtl8169_private *tp =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		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
  3171
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	rtnl_lock();
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
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		goto out_unlock;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	rtl8169_wait_for_quiescence(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	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
  3181
	rtl8169_tx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	if (tp->dirty_rx == tp->cur_rx) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
		rtl8169_init_ring_indexes(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
		rtl_hw_start(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		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
  3188
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		if (net_ratelimit() && netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
			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
  3191
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		rtl8169_schedule_work(dev, rtl8169_reset_task);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
out_unlock:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
	rtnl_unlock();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
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
  3201
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
	if (tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	rtl8169_hw_reset(tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	/* 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
  3210
	rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
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
  3214
			      u32 opts1)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
	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
  3217
	unsigned int cur_frag, entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	struct TxDesc * uninitialized_var(txd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	entry = tp->cur_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	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
  3222
		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
  3223
		dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
		u32 status, len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
		void *addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
		entry = (entry + 1) % NUM_TX_DESC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
		txd = tp->TxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		len = frag->size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
		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
  3232
		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
  3233
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		/* anti gcc 2.95.3 bugware (sic) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
		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
  3236
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		txd->opts1 = cpu_to_le32(status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
		txd->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
		tp->tx_skb[entry].len = len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
	}
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
	if (cur_frag) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
		tp->tx_skb[entry].skb = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
		txd->opts1 |= cpu_to_le32(LastFrag);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	return cur_frag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
}
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
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
  3252
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	if (dev->features & NETIF_F_TSO) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		u32 mss = skb_shinfo(skb)->gso_size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
		if (mss)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
			return LargeSend | ((mss & MSSMask) << MSSShift);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
		const struct iphdr *ip = ip_hdr(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
		if (ip->protocol == IPPROTO_TCP)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
			return IPCS | TCPCS;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
		else if (ip->protocol == IPPROTO_UDP)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
			return IPCS | UDPCS;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
		WARN_ON(1);	/* we need a WARN() */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
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
  3272
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
	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
  3275
	struct TxDesc *txd = tp->TxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	dma_addr_t mapping;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	u32 status, len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	u32 opts1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	int ret = NETDEV_TX_OK;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	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
  3283
		if (netif_msg_drv(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
			printk(KERN_ERR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
			       "%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
  3286
			       dev->name);
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
		goto err_stop;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	}
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
	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
  3292
		goto err_stop;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	frags = rtl8169_xmit_frags(tp, skb, opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
	if (frags) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
		len = skb_headlen(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
		opts1 |= FirstFrag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		len = skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
		opts1 |= FirstFrag | LastFrag;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		tp->tx_skb[entry].skb = skb;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	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
  3307
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	tp->tx_skb[entry].len = len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
	txd->addr = cpu_to_le64(mapping);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
	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
  3311
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	wmb();
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
	/* anti gcc 2.95.3 bugware (sic) */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	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
  3316
	txd->opts1 = cpu_to_le32(status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
	dev->trans_start = jiffies;
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
	tp->cur_tx += frags + 1;
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
	smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	if (!tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
		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
  3328
			netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
			smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
			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
  3331
				netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
		}
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	return ret;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
err_stop:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
		netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	ret = NETDEV_TX_BUSY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
	dev->stats.tx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	goto out;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
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
  3347
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	u16 pci_status, pci_cmd;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	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
  3354
	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
  3355
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	if (netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
		printk(KERN_ERR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		       "%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
  3359
		       dev->name, pci_cmd, pci_status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	 * 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
  3364
	 * - it seems to work;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	 * - 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
  3366
	 * - it makes iop3xx happy.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	 * Feel free to adjust to your needs.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	if (pdev->broken_parity_status)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
		pci_cmd &= ~PCI_COMMAND_PARITY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
		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
  3374
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	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
  3376
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
	pci_write_config_word(pdev, PCI_STATUS,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
		pci_status & (PCI_STATUS_DETECTED_PARITY |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		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
  3380
		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
  3381
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	/* 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
  3383
	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
  3384
		if (netif_msg_intr(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
			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
  3386
		tp->cp_cmd &= ~PCIDAC;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		RTL_W16(CPlusCmd, tp->cp_cmd);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		dev->features &= ~NETIF_F_HIGHDMA;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	rtl8169_hw_reset(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
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
  3397
				 struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
				 void __iomem *ioaddr)
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
	unsigned int dirty_tx, tx_left;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	dirty_tx = tp->dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	tx_left = tp->cur_tx - dirty_tx;
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
	while (tx_left > 0) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
		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
  3408
		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
  3409
		u32 len = tx_skb->len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
		u32 status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
		rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		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
  3414
		if (status & DescOwn)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		dev->stats.tx_bytes += len;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
		dev->stats.tx_packets++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		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
  3421
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		if (status & LastFrag) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
			if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
				dev_kfree_skb_irq(tx_skb->skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
			tx_skb->skb = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		dirty_tx++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
		tx_left--;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
	if (tp->dirty_tx != dirty_tx) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
		tp->dirty_tx = dirty_tx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
		smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		if (!tp->ecdev && netif_queue_stopped(dev) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
			netif_wake_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
		 * 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
  3440
		 * 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
  3441
		 * 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
  3442
		 * it is slow enough). -- FR
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
		smp_rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
		if (tp->cur_tx != dirty_tx)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
			RTL_W8(TxPoll, NPQ);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
}
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
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
  3451
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
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
  3456
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
	u32 opts1 = le32_to_cpu(desc->opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
	u32 status = opts1 & RxProtoMask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
		skb->ip_summed = CHECKSUM_UNNECESSARY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	else
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
		skb->ip_summed = CHECKSUM_NONE;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
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
  3469
				       struct rtl8169_private *tp, int pkt_size,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
				       dma_addr_t addr)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	struct sk_buff *skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
	bool done = false;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	if (pkt_size >= rx_copybreak)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	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
  3479
	if (!skb)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	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
  3483
				    PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	skb_reserve(skb, NET_IP_ALIGN);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	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
  3486
	*sk_buff = skb;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	done = true;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	return done;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
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
  3493
				struct rtl8169_private *tp,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
				void __iomem *ioaddr, u32 budget)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	unsigned int cur_rx, rx_left;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
	unsigned int delta, count;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
	cur_rx = tp->cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	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
  3501
	rx_left = min(rx_left, budget);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	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
  3504
		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
  3505
		struct RxDesc *desc = tp->RxDescArray + entry;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
		u32 status;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
		rmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
		status = le32_to_cpu(desc->opts1);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
		if (status & DescOwn)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
			break;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
		if (unlikely(status & RxRES)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
			if (netif_msg_rx_err(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
				printk(KERN_INFO
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
				       "%s: Rx ERROR. status = %08x\n",
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
				       dev->name, status);
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
			dev->stats.rx_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
			if (status & (RxRWT | RxRUNT))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
				dev->stats.rx_length_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
			if (status & RxCRC)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
				dev->stats.rx_crc_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
			if (status & RxFOVF) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
				if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
					rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
				dev->stats.rx_fifo_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
			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
  3530
		} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
			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
  3532
			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
  3533
			int pkt_size = (status & 0x00001FFF) - 4;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
			struct pci_dev *pdev = tp->pci_dev;
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
			 * The driver does not support incoming fragmented
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
			 * 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
  3539
			 * sized frames.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
			 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
			if (unlikely(rtl8169_fragmented_frame(status))) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
				dev->stats.rx_dropped++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
				dev->stats.rx_length_errors++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
				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
  3545
				continue;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
			}
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
			rtl8169_rx_csum(skb, desc);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
			if (tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
				pci_dma_sync_single_for_cpu(pdev, addr, pkt_size,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
						PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
				ecdev_receive(tp->ecdev, skb->data, pkt_size);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
				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
  3557
						pkt_size, PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
				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
  3559
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
				// No need to detect link status as
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
				// long as frames are received: Reset watchdog.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
				tp->ec_watchdog_jiffies = jiffies;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
			} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
				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
  3565
					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
  3566
						pkt_size, PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
					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
  3568
				} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
					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
  3570
							 PCI_DMA_FROMDEVICE);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
					tp->Rx_skbuff[entry] = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
				}
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
				skb_put(skb, pkt_size);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
				skb->protocol = eth_type_trans(skb, dev);
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
				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
  3578
					netif_receive_skb(skb);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
			}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
			dev->stats.rx_bytes += pkt_size;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
			dev->stats.rx_packets++;
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
		/* Work around for AMD plateform. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
		    (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
  3588
			desc->opts2 = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
			cur_rx++;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
	}
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
	count = cur_rx - tp->cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	tp->cur_rx = cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	if (tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
		/* descriptors are cleaned up immediately. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
		tp->dirty_rx = tp->cur_rx;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
		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
  3601
		if (!delta && count && netif_msg_intr(tp))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
			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
  3603
		tp->dirty_rx += delta;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
		 * 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
  3607
		 * 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
  3608
		 * - 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
  3609
		 *   after refill ?
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
		 * - 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
  3611
		 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
		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
  3613
			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
  3614
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	return count;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
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
  3620
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
	struct net_device *dev = dev_instance;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	int handled = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	int status;
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
	status = RTL_R16(IntrStatus);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	/* 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
  3630
	if ((status == 0xffff) || !status)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
		goto out;
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
	handled = 1;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
	if (unlikely(!tp->ecdev && !netif_running(dev))) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
		rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
	status &= tp->intr_mask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
	RTL_W16(IntrStatus,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
		(status & RxFIFOOver) ? (status | RxOverflow) : status);
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
	if (!(status & tp->intr_event))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
		goto out;
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
	/* Work around for rx fifo overflow */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	if (unlikely(status & RxFIFOOver) &&
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
	    (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
  3650
		netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
		rtl8169_tx_timeout(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	}
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
	if (unlikely(status & SYSErr)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
		rtl8169_pcierr_interrupt(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	}
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
	if (status & LinkChg)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		rtl8169_check_link_status(dev, tp, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
	if (status & tp->napi_event) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
		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
  3665
		tp->intr_mask = ~tp->napi_event;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
		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
  3668
			__netif_rx_schedule(&tp->napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
		else if (netif_msg_intr(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
			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
  3671
			       dev->name, status);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
		}
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
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	return IRQ_RETVAL(handled);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
static void ec_poll(struct net_device *dev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
	rtl8169_interrupt(pdev->irq, dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
    if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
		rtl8169_phy_timer((unsigned long) dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
		tp->ec_watchdog_jiffies = jiffies;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
	}
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_poll(struct napi_struct *napi, int budget)
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 = container_of(napi, struct rtl8169_private, napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	struct net_device *dev = tp->dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
	int work_done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	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
  3701
	rtl8169_tx_interrupt(dev, tp, ioaddr);
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
	if (work_done < budget) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
		netif_rx_complete(napi);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
		tp->intr_mask = 0xffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
		/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
		 * 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
  3708
		 * 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
  3709
		 * 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
  3710
		 * write is safe - FR
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
		smp_wmb();
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
		RTL_W16(IntrMask, tp->intr_event);
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	return work_done;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
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
  3720
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
	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
  3724
		return;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	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
  3727
	RTL_W32(RxMissed, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
}
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
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
  3731
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	unsigned int intrmask;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	rtl8169_delete_timer(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	if (!tp->ecdev) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
		netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
		napi_disable(&tp->napi);
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
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
core_down:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
		spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
	rtl8169_rx_missed(dev, ioaddr);
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
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
		spin_unlock_irq(&tp->lock);
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
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
		synchronize_irq(dev->irq);
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
	/* 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
  3759
	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
  3760
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	/*
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	 * 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
  3763
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	 * Two paths lead here:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	 * 1) dev->close
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	 *    -> 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
  3767
	 *       IRQ handler. See rtl8169_interrupt for details.
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	 * 2) dev->change_mtu
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	 *    -> 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
  3770
	 *       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
  3771
	 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	 * 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
  3773
	 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	intrmask = RTL_R16(IntrMask);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
	if (intrmask && (intrmask != 0xffff))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
		goto core_down;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	rtl8169_tx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	rtl8169_rx_clear(tp);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
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
  3784
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	struct pci_dev *pdev = tp->pci_dev;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	/* update counters before going down */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	rtl8169_update_counters(dev);
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
	rtl8169_down(dev);
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
	if (!tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
		free_irq(dev->irq, dev);
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
	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
  3797
			    tp->RxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
	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
  3799
			    tp->TxPhyAddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	tp->TxDescArray = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
	tp->RxDescArray = NULL;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
	return 0;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
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
  3807
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	u32 mc_filter[2];	/* Multicast hash filter */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	int rx_mode;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	u32 tmp = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	if (dev->flags & IFF_PROMISC) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
		/* Unconditionally log net taps. */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
		if (netif_msg_link(tp)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
			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
  3819
			       dev->name);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
		rx_mode =
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
		    AcceptAllPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
		mc_filter[1] = mc_filter[0] = 0xffffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
	} 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
  3826
		   || (dev->flags & IFF_ALLMULTI)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
		/* 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
  3828
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
		mc_filter[1] = mc_filter[0] = 0xffffffff;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
	} else {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
		struct dev_mc_list *mclist;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
		unsigned int i;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
		rx_mode = AcceptBroadcast | AcceptMyPhys;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
		mc_filter[1] = mc_filter[0] = 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
		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
  3837
		     i++, mclist = mclist->next) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
			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
  3839
			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
  3840
			rx_mode |= AcceptMulticast;
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
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	tmp = rtl8169_rx_config | rx_mode |
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
	      (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
  3848
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	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
  3850
		u32 data = mc_filter[0];
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
		mc_filter[0] = swab32(mc_filter[1]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
		mc_filter[1] = swab32(data);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
	RTL_W32(MAR0 + 0, mc_filter[0]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
	RTL_W32(MAR0 + 4, mc_filter[1]);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	RTL_W32(RxConfig, tmp);
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
	spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
}
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
/**
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
 *  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
  3866
 *  @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
  3867
 *
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
 *  Get TX/RX statistics for rtl8169
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
 */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
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
  3871
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	unsigned long flags;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	if (netif_running(dev)) {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
		spin_lock_irqsave(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
		rtl8169_rx_missed(dev, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
		spin_unlock_irqrestore(&tp->lock, flags);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
	}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
	return &dev->stats;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
#ifdef CONFIG_PM
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
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
  3888
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	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
  3890
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	void __iomem *ioaddr = tp->mmio_addr;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
	if (tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
		return -EBUSY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
		goto out_pci_suspend;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	netif_device_detach(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
	netif_stop_queue(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
	spin_lock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
	rtl8169_asic_down(ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
	rtl8169_rx_missed(dev, ioaddr);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	spin_unlock_irq(&tp->lock);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
out_pci_suspend:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
	pci_save_state(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
	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
  3913
		(tp->features & RTL_FEATURE_WOL) ? 1 : 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	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
  3915
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
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
  3920
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
	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
  3922
	struct rtl8169_private *tp = netdev_priv(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	if (tp->ecdev)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
		return -EBUSY;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
	pci_set_power_state(pdev, PCI_D0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
	pci_restore_state(pdev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
	pci_enable_wake(pdev, PCI_D0, 0);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	if (!netif_running(dev))
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
		goto out;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	netif_device_attach(dev);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
	rtl8169_schedule_work(dev, rtl8169_reset_task);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
out:
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	return 0;
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
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
  3942
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
	rtl8169_suspend(pdev, PMSG_SUSPEND);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
#endif /* CONFIG_PM */
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
static struct pci_driver rtl8169_pci_driver = {
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
	.name		= MODULENAME,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
	.id_table	= rtl8169_pci_tbl,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	.probe		= rtl8169_init_one,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	.remove		= __devexit_p(rtl8169_remove_one),
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
#ifdef CONFIG_PM
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	.suspend	= rtl8169_suspend,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	.resume		= rtl8169_resume,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
	.shutdown	= rtl_shutdown,
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
#endif
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
};
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
static int __init rtl8169_init_module(void)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
	return pci_register_driver(&rtl8169_pci_driver);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
static void __exit rtl8169_cleanup_module(void)
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
{
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
	pci_unregister_driver(&rtl8169_pci_driver);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
}
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
module_init(rtl8169_init_module);
e722e0ac5d28 Added r8169 driver for 2.6.29.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
module_exit(rtl8169_cleanup_module);