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

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
2405
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
* r8169.c: RealTek 8169/8168/8101 ethernet driver.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
* Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
* Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
* Copyright (c) a lot of people too. Please respect their work.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
#include <linux/module.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
#include <linux/moduleparam.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/pci.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/netdevice.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/etherdevice.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/delay.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/ethtool.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/mii.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/if_vlan.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/crc32.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/in.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/ip.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/tcp.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/init.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/interrupt.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/dma-mapping.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/pm_runtime.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
#include <linux/firmware.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <linux/pci-aspm.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <linux/prefetch.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
#include <asm/system.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include <asm/io.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include <asm/irq.h>
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
#include "../globals.h"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include "ecdev.h"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define RTL8169_VERSION "2.3LK-NAPI"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#define MODULENAME "ec_r8169"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#define PFX MODULENAME ": "
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
#define FIRMWARE_8168D_1	"rtl_nic/rtl8168d-1.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#define FIRMWARE_8168D_2	"rtl_nic/rtl8168d-2.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#define FIRMWARE_8168E_1	"rtl_nic/rtl8168e-1.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
#define FIRMWARE_8168E_2	"rtl_nic/rtl8168e-2.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define FIRMWARE_8168E_3	"rtl_nic/rtl8168e-3.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
#define FIRMWARE_8168F_1	"rtl_nic/rtl8168f-1.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#define FIRMWARE_8168F_2	"rtl_nic/rtl8168f-2.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define FIRMWARE_8105E_1	"rtl_nic/rtl8105e-1.fw"
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#ifdef RTL8169_DEBUG
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
#define assert(expr) \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
	if (!(expr)) {					\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
		#expr,__FILE__,__func__,__LINE__);		\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
#define dprintk(fmt, args...) \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
#else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
#define assert(expr) do {} while (0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
#define dprintk(fmt, args...)	do {} while (0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
#endif /* RTL8169_DEBUG */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define R8169_MSG_DEFAULT \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define TX_BUFFS_AVAIL(tp) \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
static const int multicast_filter_limit = 32;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
/* MAC address length */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define MAC_ADDR_LEN	6
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define MAX_READ_REQUEST_SHIFT	12
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define R8169_REGS_SIZE		256
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define R8169_NAPI_WEIGHT	64
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL8169_TX_TIMEOUT	(6*HZ)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL8169_PHY_TIMEOUT	(10*HZ)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
#define RTL_EEPROM_SIG_ADDR	0x0000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
/* write/read MMIO register */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
#define RTL_R8(reg)		readb (ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
#define RTL_R16(reg)		readw (ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
#define RTL_R32(reg)		readl (ioaddr + (reg))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
enum mac_version {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_01 = 0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_02,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_03,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_04,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_05,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_06,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_07,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_08,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_09,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_10,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_11,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_12,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_13,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_14,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_15,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_16,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_17,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_18,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	RTL_GIGA_MAC_VER_19,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	RTL_GIGA_MAC_VER_20,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	RTL_GIGA_MAC_VER_21,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	RTL_GIGA_MAC_VER_22,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	RTL_GIGA_MAC_VER_23,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	RTL_GIGA_MAC_VER_24,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	RTL_GIGA_MAC_VER_25,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	RTL_GIGA_MAC_VER_26,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	RTL_GIGA_MAC_VER_27,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	RTL_GIGA_MAC_VER_28,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	RTL_GIGA_MAC_VER_29,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	RTL_GIGA_MAC_VER_30,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	RTL_GIGA_MAC_VER_31,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	RTL_GIGA_MAC_VER_32,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	RTL_GIGA_MAC_VER_33,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	RTL_GIGA_MAC_VER_34,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	RTL_GIGA_MAC_VER_35,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	RTL_GIGA_MAC_VER_36,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	RTL_GIGA_MAC_NONE   = 0xff,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
enum rtl_tx_desc_version {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	RTL_TD_0	= 0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	RTL_TD_1	= 1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
#define JUMBO_1K	ETH_DATA_LEN
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
#define JUMBO_4K	(4*1024 - ETH_HLEN - 2)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
#define JUMBO_6K	(6*1024 - ETH_HLEN - 2)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
#define JUMBO_7K	(7*1024 - ETH_HLEN - 2)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
#define JUMBO_9K	(9*1024 - ETH_HLEN - 2)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
#define _R(NAME,TD,FW,SZ,B) {	\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	.name = NAME,		\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	.txd_version = TD,	\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	.fw_name = FW,		\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	.jumbo_max = SZ,	\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	.jumbo_tx_csum = B	\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
static const struct {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	const char *name;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	enum rtl_tx_desc_version txd_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	const char *fw_name;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	u16 jumbo_max;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	bool jumbo_tx_csum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
} rtl_chip_infos[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
	/* PCI devices. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
	[RTL_GIGA_MAC_VER_01] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
		_R("RTL8169",		RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	[RTL_GIGA_MAC_VER_02] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
		_R("RTL8169s",		RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	[RTL_GIGA_MAC_VER_03] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
		_R("RTL8110s",		RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	[RTL_GIGA_MAC_VER_04] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
		_R("RTL8169sb/8110sb",	RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	[RTL_GIGA_MAC_VER_05] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	[RTL_GIGA_MAC_VER_06] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
		_R("RTL8169sc/8110sc",	RTL_TD_0, NULL, JUMBO_7K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	/* PCI-E devices. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	[RTL_GIGA_MAC_VER_07] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
		_R("RTL8102e",		RTL_TD_1, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	[RTL_GIGA_MAC_VER_08] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
		_R("RTL8102e",		RTL_TD_1, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	[RTL_GIGA_MAC_VER_09] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
		_R("RTL8102e",		RTL_TD_1, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	[RTL_GIGA_MAC_VER_10] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
		_R("RTL8101e",		RTL_TD_0, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	[RTL_GIGA_MAC_VER_11] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
		_R("RTL8168b/8111b",	RTL_TD_0, NULL, JUMBO_4K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	[RTL_GIGA_MAC_VER_12] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
		_R("RTL8168b/8111b",	RTL_TD_0, NULL, JUMBO_4K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	[RTL_GIGA_MAC_VER_13] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
		_R("RTL8101e",		RTL_TD_0, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	[RTL_GIGA_MAC_VER_14] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
		_R("RTL8100e",		RTL_TD_0, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	[RTL_GIGA_MAC_VER_15] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
		_R("RTL8100e",		RTL_TD_0, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	[RTL_GIGA_MAC_VER_16] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
		_R("RTL8101e",		RTL_TD_0, NULL, JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	[RTL_GIGA_MAC_VER_17] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
		_R("RTL8168b/8111b",	RTL_TD_1, NULL, JUMBO_4K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	[RTL_GIGA_MAC_VER_18] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	[RTL_GIGA_MAC_VER_19] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
		_R("RTL8168c/8111c",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	[RTL_GIGA_MAC_VER_20] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
		_R("RTL8168c/8111c",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	[RTL_GIGA_MAC_VER_21] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
		_R("RTL8168c/8111c",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	[RTL_GIGA_MAC_VER_22] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
		_R("RTL8168c/8111c",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	[RTL_GIGA_MAC_VER_23] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	[RTL_GIGA_MAC_VER_24] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
		_R("RTL8168cp/8111cp",	RTL_TD_1, NULL, JUMBO_6K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	[RTL_GIGA_MAC_VER_25] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	[RTL_GIGA_MAC_VER_26] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
		_R("RTL8168d/8111d",	RTL_TD_1, FIRMWARE_8168D_2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	[RTL_GIGA_MAC_VER_27] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL, JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	[RTL_GIGA_MAC_VER_28] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL, JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	[RTL_GIGA_MAC_VER_29] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
							JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	[RTL_GIGA_MAC_VER_30] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
		_R("RTL8105e",		RTL_TD_1, FIRMWARE_8105E_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
							JUMBO_1K, true),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	[RTL_GIGA_MAC_VER_31] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
		_R("RTL8168dp/8111dp",	RTL_TD_1, NULL, JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	[RTL_GIGA_MAC_VER_32] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	[RTL_GIGA_MAC_VER_33] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
		_R("RTL8168e/8111e",	RTL_TD_1, FIRMWARE_8168E_2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	[RTL_GIGA_MAC_VER_34] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
		_R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	[RTL_GIGA_MAC_VER_35] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
		_R("RTL8168f/8111f",	RTL_TD_1, FIRMWARE_8168F_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	[RTL_GIGA_MAC_VER_36] =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
		_R("RTL8168f/8111f",	RTL_TD_1, FIRMWARE_8168F_2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
							JUMBO_9K, false),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#undef _R
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
enum cfg_version {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	RTL_CFG_0 = 0x00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	RTL_CFG_1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	RTL_CFG_2
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
static void rtl_hw_start_8169(struct net_device *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
static void rtl_hw_start_8168(struct net_device *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
static void rtl_hw_start_8101(struct net_device *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4302), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	{ 0x0001,				0x8168,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	{0,},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
/* prevent driver from being loaded automatically */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
static int rx_buf_sz = 16383;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
static int use_dac;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
static struct {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	u32 msg_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
} debug = { -1 };
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
enum rtl_registers {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	MAC0		= 0,	/* Ethernet hardware address. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	MAC4		= 4,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	MAR0		= 8,	/* Multicast filter. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	CounterAddrLow		= 0x10,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	CounterAddrHigh		= 0x14,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	TxDescStartAddrLow	= 0x20,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	TxDescStartAddrHigh	= 0x24,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	TxHDescStartAddrLow	= 0x28,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	TxHDescStartAddrHigh	= 0x2c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	FLASH		= 0x30,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	ERSR		= 0x36,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	ChipCmd		= 0x37,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	TxPoll		= 0x38,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	IntrMask	= 0x3c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	IntrStatus	= 0x3e,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	TxConfig	= 0x40,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
#define	TXCFG_AUTO_FIFO			(1 << 7)	/* 8111e-vl */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
#define	TXCFG_EMPTY			(1 << 11)	/* 8111e-vl */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	RxConfig	= 0x44,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
#define	RX128_INT_EN			(1 << 15)	/* 8111c and later */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
#define	RX_MULTI_EN			(1 << 14)	/* 8111c only */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
#define	RXCFG_FIFO_SHIFT		13
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
					/* No threshold before first PCI xfer */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
#define	RX_FIFO_THRESH			(7 << RXCFG_FIFO_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
#define	RXCFG_DMA_SHIFT			8
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
					/* Unlimited maximum PCI burst. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
#define	RX_DMA_BURST			(7 << RXCFG_DMA_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	RxMissed	= 0x4c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	Cfg9346		= 0x50,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	Config0		= 0x51,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	Config1		= 0x52,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	Config2		= 0x53,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	Config3		= 0x54,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	Config4		= 0x55,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	Config5		= 0x56,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	MultiIntr	= 0x5c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	PHYAR		= 0x60,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	PHYstatus	= 0x6c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	RxMaxSize	= 0xda,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	CPlusCmd	= 0xe0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	IntrMitigate	= 0xe2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	RxDescAddrLow	= 0xe4,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	RxDescAddrHigh	= 0xe8,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	EarlyTxThres	= 0xec,	/* 8169. Unit of 32 bytes. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
#define NoEarlyTx	0x3f	/* Max value : no early transmit. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	MaxTxPacketSize	= 0xec,	/* 8101/8168. Unit of 128 bytes. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
#define TxPacketMax	(8064 >> 7)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
#define EarlySize	0x27
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	FuncEvent	= 0xf0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	FuncEventMask	= 0xf4,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	FuncPresetState	= 0xf8,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	FuncForceEvent	= 0xfc,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
enum rtl8110_registers {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	TBICSR			= 0x64,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	TBI_ANAR		= 0x68,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	TBI_LPAR		= 0x6a,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
enum rtl8168_8101_registers {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	CSIDR			= 0x64,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	CSIAR			= 0x68,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
#define	CSIAR_FLAG			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
#define	CSIAR_WRITE_CMD			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
#define	CSIAR_BYTE_ENABLE		0x0f
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
#define	CSIAR_BYTE_ENABLE_SHIFT		12
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
#define	CSIAR_ADDR_MASK			0x0fff
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	PMCH			= 0x6f,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	EPHYAR			= 0x80,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
#define	EPHYAR_FLAG			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
#define	EPHYAR_WRITE_CMD		0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
#define	EPHYAR_REG_MASK			0x1f
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
#define	EPHYAR_REG_SHIFT		16
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
#define	EPHYAR_DATA_MASK		0xffff
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	DLLPR			= 0xd0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
#define	PFM_EN				(1 << 6)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	DBG_REG			= 0xd1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
#define	FIX_NAK_1			(1 << 4)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
#define	FIX_NAK_2			(1 << 3)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	TWSI			= 0xd2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	MCU			= 0xd3,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
#define	NOW_IS_OOB			(1 << 7)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
#define	EN_NDP				(1 << 3)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
#define	EN_OOB_RESET			(1 << 2)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	EFUSEAR			= 0xdc,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
#define	EFUSEAR_FLAG			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
#define	EFUSEAR_WRITE_CMD		0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
#define	EFUSEAR_READ_CMD		0x00000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
#define	EFUSEAR_REG_MASK		0x03ff
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
#define	EFUSEAR_REG_SHIFT		8
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
#define	EFUSEAR_DATA_MASK		0xff
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
enum rtl8168_registers {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	LED_FREQ		= 0x1a,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	EEE_LED			= 0x1b,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	ERIDR			= 0x70,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	ERIAR			= 0x74,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
#define ERIAR_FLAG			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
#define ERIAR_WRITE_CMD			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
#define ERIAR_READ_CMD			0x00000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
#define ERIAR_ADDR_BYTE_ALIGN		4
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
#define ERIAR_TYPE_SHIFT		16
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
#define ERIAR_EXGMAC			(0x00 << ERIAR_TYPE_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
#define ERIAR_MSIX			(0x01 << ERIAR_TYPE_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
#define ERIAR_ASF			(0x02 << ERIAR_TYPE_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
#define ERIAR_MASK_SHIFT		12
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
#define ERIAR_MASK_0001			(0x1 << ERIAR_MASK_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
#define ERIAR_MASK_0011			(0x3 << ERIAR_MASK_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
#define ERIAR_MASK_1111			(0xf << ERIAR_MASK_SHIFT)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	EPHY_RXER_NUM		= 0x7c,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	OCPDR			= 0xb0,	/* OCP GPHY access */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
#define OCPDR_WRITE_CMD			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
#define OCPDR_READ_CMD			0x00000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
#define OCPDR_REG_MASK			0x7f
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
#define OCPDR_GPHY_REG_SHIFT		16
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
#define OCPDR_DATA_MASK			0xffff
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	OCPAR			= 0xb4,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
#define OCPAR_FLAG			0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
#define OCPAR_GPHY_WRITE_CMD		0x8000f060
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
#define OCPAR_GPHY_READ_CMD		0x0000f060
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	RDSAR1			= 0xd0,	/* 8168c only. Undocumented on 8168dp */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	MISC			= 0xf0,	/* 8168e only. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
#define TXPLA_RST			(1 << 29)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
#define PWM_EN				(1 << 22)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
enum rtl_register_content {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	/* InterruptStatusBits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	SYSErr		= 0x8000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	PCSTimeout	= 0x4000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	SWInt		= 0x0100,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	TxDescUnavail	= 0x0080,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	RxFIFOOver	= 0x0040,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	LinkChg		= 0x0020,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	RxOverflow	= 0x0010,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	TxErr		= 0x0008,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	TxOK		= 0x0004,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	RxErr		= 0x0002,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	RxOK		= 0x0001,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	/* RxStatusDesc */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	RxBOVF	= (1 << 24),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	RxFOVF	= (1 << 23),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
	RxRWT	= (1 << 22),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	RxRES	= (1 << 21),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	RxRUNT	= (1 << 20),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	RxCRC	= (1 << 19),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	/* ChipCmdBits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	StopReq		= 0x80,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	CmdReset	= 0x10,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	CmdRxEnb	= 0x08,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	CmdTxEnb	= 0x04,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	RxBufEmpty	= 0x01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	/* TXPoll register p.5 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	FSWInt		= 0x01,		/* Forced software interrupt */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	/* Cfg9346Bits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	Cfg9346_Lock	= 0x00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	Cfg9346_Unlock	= 0xc0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	/* rx_mode_bits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	AcceptErr	= 0x20,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	AcceptRunt	= 0x10,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	AcceptBroadcast	= 0x08,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	AcceptMulticast	= 0x04,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	AcceptMyPhys	= 0x02,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	AcceptAllPhys	= 0x01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
#define RX_CONFIG_ACCEPT_MASK		0x3f
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	/* TxConfigBits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	TxInterFrameGapShift = 24,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	/* Config1 register p.24 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	LEDS1		= (1 << 7),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	LEDS0		= (1 << 6),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	Speed_down	= (1 << 4),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	MEMMAP		= (1 << 3),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	IOMAP		= (1 << 2),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	VPD		= (1 << 1),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	PMEnable	= (1 << 0),	/* Power Management Enable */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	/* Config2 register p. 25 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	MSIEnable	= (1 << 5),	/* 8169 only. Reserved in the 8168. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	PCI_Clock_66MHz = 0x01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	PCI_Clock_33MHz = 0x00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	/* Config3 register p.25 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	Jumbo_En0	= (1 << 2),	/* 8168 only. Reserved in the 8168b */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	/* Config4 register */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
	Jumbo_En1	= (1 << 1),	/* 8168 only. Reserved in the 8168b */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	/* Config5 register p.27 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
	Spi_en		= (1 << 3),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	LanWake		= (1 << 1),	/* LanWake enable/disable */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	/* TBICSR p.28 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
	TBIReset	= 0x80000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	TBILoopback	= 0x40000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	TBINwEnable	= 0x20000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	TBINwRestart	= 0x10000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	TBILinkOk	= 0x02000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	TBINwComplete	= 0x01000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	/* CPlusCmd p.31 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
	EnableBist	= (1 << 15),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
	Normal_mode	= (1 << 13),	// unused
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	Force_half_dup	= (1 << 12),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	Force_rxflow_en	= (1 << 11),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	Force_txflow_en	= (1 << 10),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
	ASF		= (1 << 8),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	PktCntrDisable	= (1 << 7),	// 8168 8101
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
	Mac_dbgo_sel	= 0x001c,	// 8168
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	RxVlan		= (1 << 6),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	RxChkSum	= (1 << 5),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	PCIDAC		= (1 << 4),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	PCIMulRW	= (1 << 3),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	INTT_0		= 0x0000,	// 8168
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	INTT_1		= 0x0001,	// 8168
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	INTT_2		= 0x0002,	// 8168
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	INTT_3		= 0x0003,	// 8168
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	/* rtl8169_PHYstatus */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	TBI_Enable	= 0x80,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	TxFlowCtrl	= 0x40,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	RxFlowCtrl	= 0x20,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	_1000bpsF	= 0x10,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	_100bps		= 0x08,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	_10bps		= 0x04,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
	LinkStatus	= 0x02,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	FullDup		= 0x01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	/* _TBICSRBit */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	TBILinkOK	= 0x02000000,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	/* DumpCounterCommand */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	CounterDump	= 0x8,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
enum rtl_desc_bit {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	/* First doubleword. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	RingEnd		= (1 << 30), /* End of descriptor ring */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	FirstFrag	= (1 << 29), /* First segment of a packet */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	LastFrag	= (1 << 28), /* Final segment of a packet */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
/* Generic case. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
enum rtl_tx_desc_bit {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	/* First doubleword. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
	TD_LSO		= (1 << 27),		/* Large Send Offload */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
#define TD_MSS_MAX			0x07ffu	/* MSS value */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	/* Second doubleword. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	TxVlanTag	= (1 << 17),		/* Add VLAN tag */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
/* 8169, 8168b and 810x except 8102e. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
enum rtl_tx_desc_bit_0 {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	/* First doubleword. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
#define TD0_MSS_SHIFT			16	/* MSS position (11 bits) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	TD0_TCP_CS	= (1 << 16),		/* Calculate TCP/IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	TD0_UDP_CS	= (1 << 17),		/* Calculate UDP/IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	TD0_IP_CS	= (1 << 18),		/* Calculate IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
/* 8102e, 8168c and beyond. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
enum rtl_tx_desc_bit_1 {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	/* Second doubleword. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
#define TD1_MSS_SHIFT			18	/* MSS position (11 bits) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	TD1_IP_CS	= (1 << 29),		/* Calculate IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	TD1_TCP_CS	= (1 << 30),		/* Calculate TCP/IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	TD1_UDP_CS	= (1 << 31),		/* Calculate UDP/IP checksum */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
static const struct rtl_tx_desc_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	struct {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
		u32 udp;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
		u32 tcp;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	} checksum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
	u16 mss_shift;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	u16 opts_offset;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
} tx_desc_info [] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	[RTL_TD_0] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
		.checksum = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
			.udp	= TD0_IP_CS | TD0_UDP_CS,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
			.tcp	= TD0_IP_CS | TD0_TCP_CS
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
		},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
		.mss_shift	= TD0_MSS_SHIFT,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
		.opts_offset	= 0
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
	},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	[RTL_TD_1] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
		.checksum = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
			.udp	= TD1_IP_CS | TD1_UDP_CS,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
			.tcp	= TD1_IP_CS | TD1_TCP_CS
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
		},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
		.mss_shift	= TD1_MSS_SHIFT,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
		.opts_offset	= 1
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
enum rtl_rx_desc_bit {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	/* Rx private */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
#define RxProtoUDP	(PID1)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
#define RxProtoTCP	(PID0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
#define RxProtoIP	(PID1 | PID0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
#define RxProtoMask	RxProtoIP
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	IPFail		= (1 << 16), /* IP checksum failed */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	RxVlanTag	= (1 << 16), /* VLAN tag available */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
#define RsvdMask	0x3fffc000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
struct TxDesc {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	__le32 opts1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	__le32 opts2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
	__le64 addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
struct RxDesc {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
	__le32 opts1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	__le32 opts2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
	__le64 addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
struct ring_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	struct sk_buff	*skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	u32		len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	u8		__pad[sizeof(void *) - sizeof(u32)];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
enum features {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	RTL_FEATURE_WOL		= (1 << 0),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
	RTL_FEATURE_MSI		= (1 << 1),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	RTL_FEATURE_GMII	= (1 << 2),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
struct rtl8169_counters {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	__le64	tx_packets;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
	__le64	rx_packets;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	__le64	tx_errors;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
	__le32	rx_errors;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	__le16	rx_missed;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
	__le16	align_errors;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	__le32	tx_one_collision;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
	__le32	tx_multi_collision;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	__le64	rx_unicast;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	__le64	rx_broadcast;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
	__le32	rx_multicast;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	__le16	tx_aborted;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	__le16	tx_underun;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
struct rtl8169_private {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	void __iomem *mmio_addr;	/* memory map physical address */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	struct pci_dev *pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	struct net_device *dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	struct napi_struct napi;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
	spinlock_t lock;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	u32 msg_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	u16 txd_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	u16 mac_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	u32 dirty_rx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	u32 dirty_tx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
	dma_addr_t TxPhyAddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	dma_addr_t RxPhyAddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	void *Rx_databuff[NUM_RX_DESC];	/* Rx data buffers */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	struct timer_list timer;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
	u16 cp_cmd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
	u16 intr_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
	u16 napi_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	u16 intr_mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	struct mdio_ops {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
		void (*write)(void __iomem *, int, int);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		int (*read)(void __iomem *, int);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	} mdio_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	struct pll_power_ops {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		void (*down)(struct rtl8169_private *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		void (*up)(struct rtl8169_private *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	} pll_power_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
	struct jumbo_ops {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		void (*enable)(struct rtl8169_private *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		void (*disable)(struct rtl8169_private *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	} jumbo_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	void (*phy_reset_enable)(struct rtl8169_private *tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	void (*hw_start)(struct net_device *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
	unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	unsigned int (*link_ok)(void __iomem *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	struct delayed_work task;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	unsigned features;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
	struct mii_if_info mii;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	struct rtl8169_counters counters;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	u32 saved_wolopts;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	ec_device_t *ecdev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	unsigned long ec_watchdog_jiffies;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	u32 opts1_mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	struct rtl_fw {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		const struct firmware *fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
#define RTL_VER_SIZE		32
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
		char version[RTL_VER_SIZE];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
		struct rtl_fw_phy_action {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
			__le32 *code;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
			size_t size;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		} phy_action;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	} *rtl_fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
#define RTL_FIRMWARE_UNKNOWN	ERR_PTR(-EAGAIN)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver (EtherCAT)");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
module_param(use_dac, int, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
module_param_named(debug, debug.msg_enable, int, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
MODULE_LICENSE("GPL");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
MODULE_VERSION(EC_MASTER_VERSION);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
MODULE_FIRMWARE(FIRMWARE_8168D_1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
MODULE_FIRMWARE(FIRMWARE_8168D_2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
MODULE_FIRMWARE(FIRMWARE_8168E_1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
MODULE_FIRMWARE(FIRMWARE_8168E_2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
MODULE_FIRMWARE(FIRMWARE_8168E_3);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
MODULE_FIRMWARE(FIRMWARE_8105E_1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
MODULE_FIRMWARE(FIRMWARE_8168F_1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
MODULE_FIRMWARE(FIRMWARE_8168F_2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
static int rtl8169_open(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
				      struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
static int rtl8169_init_ring(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
static void rtl_hw_start(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
static int rtl8169_close(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
static void rtl_set_rx_mode(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
static void rtl8169_tx_timeout(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
				void __iomem *, u32 budget);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
static void rtl8169_down(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
static void rtl8169_rx_clear(struct rtl8169_private *tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
static void ec_poll(struct net_device *dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
static int rtl8169_poll(struct napi_struct *napi, int budget);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	int cap = pci_pcie_cap(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	if (cap) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		u16 ctl;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	RTL_W32(OCPAR, ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	for (i = 0; i < 20; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		if (RTL_R32(OCPAR) & OCPAR_FLAG)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	return RTL_R32(OCPDR);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
static void ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg, u32 data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	RTL_W32(OCPDR, data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	RTL_W32(OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	for (i = 0; i < 20; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
		if ((RTL_R32(OCPAR) & OCPAR_FLAG) == 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
static void rtl8168_oob_notify(struct rtl8169_private *tp, u8 cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	RTL_W8(ERIDR, cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	RTL_W32(ERIAR, 0x800010e8);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	msleep(2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	for (i = 0; i < 5; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
		if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	ocp_write(tp, 0x1, 0x30, 0x00000001);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
#define OOB_CMD_RESET		0x00
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
#define OOB_CMD_DRIVER_START	0x05
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
#define OOB_CMD_DRIVER_STOP	0x06
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
static u16 rtl8168_get_ocp_reg(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	return (tp->mac_version == RTL_GIGA_MAC_VER_31) ? 0xb8 : 0x10;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
static void rtl8168_driver_start(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
	u16 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_START);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
	reg = rtl8168_get_ocp_reg(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
	for (i = 0; i < 10; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		msleep(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
		if (ocp_read(tp, 0x0f, reg) & 0x00000800)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
static void rtl8168_driver_stop(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
	u16 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
	rtl8168_oob_notify(tp, OOB_CMD_DRIVER_STOP);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
	reg = rtl8168_get_ocp_reg(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
	for (i = 0; i < 10; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		msleep(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		if ((ocp_read(tp, 0x0f, reg) & 0x00000800) == 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
static int r8168dp_check_dash(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	u16 reg = rtl8168_get_ocp_reg(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
	return (ocp_read(tp, 0x0f, reg) & 0x00008000) ? 1 : 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
static void r8169_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	for (i = 20; i > 0; i--) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
		 * Check if the RTL8169 has completed writing to the specified
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
		 * MII register.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
		if (!(RTL_R32(PHYAR) & 0x80000000))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		udelay(25);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	 * According to hardware specs a 20us delay is required after write
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	 * complete indication, but before sending next command.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
	udelay(20);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
static int r8169_mdio_read(void __iomem *ioaddr, int reg_addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	int i, value = -1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	for (i = 20; i > 0; i--) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
		 * Check if the RTL8169 has completed retrieving data from
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
		 * the specified MII register.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
		if (RTL_R32(PHYAR) & 0x80000000) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
			value = RTL_R32(PHYAR) & 0xffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
		udelay(25);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	 * According to hardware specs a 20us delay is required after read
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	 * complete indication, but before sending next command.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	udelay(20);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
static void r8168dp_1_mdio_access(void __iomem *ioaddr, int reg_addr, u32 data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	RTL_W32(OCPDR, data |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
		((reg_addr & OCPDR_REG_MASK) << OCPDR_GPHY_REG_SHIFT));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	RTL_W32(OCPAR, OCPAR_GPHY_WRITE_CMD);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	RTL_W32(EPHY_RXER_NUM, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
		mdelay(1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
		if (!(RTL_R32(OCPAR) & OCPAR_FLAG))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
static void r8168dp_1_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	r8168dp_1_mdio_access(ioaddr, reg_addr, OCPDR_WRITE_CMD |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		(value & OCPDR_DATA_MASK));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
static int r8168dp_1_mdio_read(void __iomem *ioaddr, int reg_addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	r8168dp_1_mdio_access(ioaddr, reg_addr, OCPDR_READ_CMD);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	mdelay(1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	RTL_W32(OCPAR, OCPAR_GPHY_READ_CMD);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	RTL_W32(EPHY_RXER_NUM, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
		mdelay(1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
		if (RTL_R32(OCPAR) & OCPAR_FLAG)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	return RTL_R32(OCPDR) & OCPDR_DATA_MASK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
#define R8168DP_1_MDIO_ACCESS_BIT	0x00020000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
static void r8168dp_2_mdio_start(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	RTL_W32(0xd0, RTL_R32(0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
static void r8168dp_2_mdio_stop(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	RTL_W32(0xd0, RTL_R32(0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
static void r8168dp_2_mdio_write(void __iomem *ioaddr, int reg_addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	r8168dp_2_mdio_start(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	r8169_mdio_write(ioaddr, reg_addr, value);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	r8168dp_2_mdio_stop(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
static int r8168dp_2_mdio_read(void __iomem *ioaddr, int reg_addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	int value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	r8168dp_2_mdio_start(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	value = r8169_mdio_read(ioaddr, reg_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	r8168dp_2_mdio_stop(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
static void rtl_writephy(struct rtl8169_private *tp, int location, u32 val)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	tp->mdio_ops.write(tp->mmio_addr, location, val);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
static int rtl_readphy(struct rtl8169_private *tp, int location)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	return tp->mdio_ops.read(tp->mmio_addr, location);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
static void rtl_patchphy(struct rtl8169_private *tp, int reg_addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	rtl_writephy(tp, reg_addr, rtl_readphy(tp, reg_addr) | value);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
static void rtl_w1w0_phy(struct rtl8169_private *tp, int reg_addr, int p, int m)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	int val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	val = rtl_readphy(tp, reg_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	rtl_writephy(tp, reg_addr, (val | p) & ~m);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
			   int val)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	rtl_writephy(tp, location, val);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	return rtl_readphy(tp, location);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
		udelay(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	u16 value = 0xffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
		udelay(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	RTL_W32(CSIDR, value);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
		udelay(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	u32 value = ~0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
			value = RTL_R32(CSIDR);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
		udelay(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
static
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
void rtl_eri_write(void __iomem *ioaddr, int addr, u32 mask, u32 val, int type)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	BUG_ON((addr & 3) || (mask == 0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	RTL_W32(ERIDR, val);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	RTL_W32(ERIAR, ERIAR_WRITE_CMD | type | mask | addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
		if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
static u32 rtl_eri_read(void __iomem *ioaddr, int addr, int type)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	u32 value = ~0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	RTL_W32(ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
		if (RTL_R32(ERIAR) & ERIAR_FLAG) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
			value = RTL_R32(ERIDR);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
static void
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	u32 val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	val = rtl_eri_read(ioaddr, addr, type);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
struct exgmac_reg {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	u16 addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	u16 mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	u32 val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
static void rtl_write_exgmac_batch(void __iomem *ioaddr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
				   const struct exgmac_reg *r, int len)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	while (len-- > 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		rtl_eri_write(ioaddr, r->addr, r->mask, r->val, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
		r++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	u8 value = 0xff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	for (i = 0; i < 300; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
		if (RTL_R32(EFUSEAR) & EFUSEAR_FLAG) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
			value = RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	return value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	RTL_W16(IntrMask, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	RTL_W16(IntrStatus, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	RTL_R8(ChipCmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	return RTL_R32(TBICSR) & TBIReset;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
static unsigned int rtl8169_xmii_reset_pending(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	return rtl_readphy(tp, MII_BMCR) & BMCR_RESET;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	return RTL_R32(TBICSR) & TBILinkOk;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	return RTL_R8(PHYstatus) & LinkStatus;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
static void rtl8169_tbi_reset_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	unsigned int val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	val = rtl_readphy(tp, MII_BMCR) | BMCR_RESET;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	rtl_writephy(tp, MII_BMCR, val & 0xffff);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
static void rtl_link_chg_patch(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	if (!netif_running(dev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		if (RTL_R8(PHYstatus) & _1000bpsF) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
				      0x00000011, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
				      0x00000005, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		} else if (RTL_R8(PHYstatus) & _100bps) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
				      0x0000001f, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
				      0x00000005, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
				      0x0000001f, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
				      0x0000003f, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		/* Reset packet filter */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x00, 0x01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
			     ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
			     ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		   tp->mac_version == RTL_GIGA_MAC_VER_36) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		if (RTL_R8(PHYstatus) & _1000bpsF) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
				      0x00000011, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
				      0x00000005, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
			rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
				      0x0000001f, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
			rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
				      0x0000003f, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
static void __rtl8169_check_link_status(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
					struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
					void __iomem *ioaddr, bool pm)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
	if (tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	if (tp->link_ok(ioaddr)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		rtl_link_chg_patch(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		/* This is to cancel a scheduled suspend if there's one. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		if (pm)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
			pm_request_resume(&tp->pci_dev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		netif_carrier_on(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		if (net_ratelimit())
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
			netif_info(tp, ifup, dev, "link up\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		netif_carrier_off(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		netif_info(tp, ifdown, dev, "link down\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		if (pm)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
			pm_schedule_suspend(&tp->pci_dev->dev, 5000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
static void rtl8169_check_link_status(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
				      struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
				      void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	__rtl8169_check_link_status(dev, tp, ioaddr, false);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	u8 options;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	u32 wolopts = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	options = RTL_R8(Config1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	if (!(options & PMEnable))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	options = RTL_R8(Config3);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
	if (options & LinkUp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		wolopts |= WAKE_PHY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
	if (options & MagicPacket)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		wolopts |= WAKE_MAGIC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	options = RTL_R8(Config5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
	if (options & UWF)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		wolopts |= WAKE_UCAST;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
	if (options & BWF)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		wolopts |= WAKE_BCAST;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	if (options & MWF)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		wolopts |= WAKE_MCAST;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	return wolopts;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	wol->supported = WAKE_ANY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	wol->wolopts = __rtl8169_get_wol(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
	static const struct {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		u32 opt;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		u16 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		u8  mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	} cfg[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		{ WAKE_ANY,   Config1, PMEnable },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		{ WAKE_PHY,   Config3, LinkUp },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		{ WAKE_MAGIC, Config3, MagicPacket },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
		{ WAKE_UCAST, Config5, UWF },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
		{ WAKE_BCAST, Config5, BWF },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
		{ WAKE_MCAST, Config5, MWF },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
		{ WAKE_ANY,   Config5, LanWake }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
		if (wolopts & cfg[i].opt)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
			options |= cfg[i].mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		RTL_W8(cfg[i].reg, options);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	if (wol->wolopts)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		tp->features |= RTL_FEATURE_WOL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
		tp->features &= ~RTL_FEATURE_WOL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	__rtl8169_set_wol(tp, wol->wolopts);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	return rtl_chip_infos[tp->mac_version].fw_name;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
static void rtl8169_get_drvinfo(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
				struct ethtool_drvinfo *info)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	struct rtl_fw *rtl_fw = tp->rtl_fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	strlcpy(info->driver, MODULENAME, sizeof(info->driver));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
	strlcpy(info->version, RTL8169_VERSION, sizeof(info->version));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	strlcpy(info->fw_version, IS_ERR_OR_NULL(rtl_fw) ? "N/A" :
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
	       rtl_fw->version, sizeof(info->fw_version));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
static int rtl8169_get_regs_len(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	return R8169_REGS_SIZE;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
static int rtl8169_set_speed_tbi(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
				 u8 autoneg, u16 speed, u8 duplex, u32 ignored)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
	int ret = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	u32 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
	reg = RTL_R32(TBICSR);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	    (duplex == DUPLEX_FULL)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	} else if (autoneg == AUTONEG_ENABLE)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		netif_warn(tp, link, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
			   "incorrect speed setting refused in TBI mode\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		ret = -EOPNOTSUPP;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
	return ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
static int rtl8169_set_speed_xmii(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
				  u8 autoneg, u16 speed, u8 duplex, u32 adv)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	int giga_ctrl, bmcr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	int rc = -EINVAL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	if (autoneg == AUTONEG_ENABLE) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		int auto_nego;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		auto_nego = rtl_readphy(tp, MII_ADVERTISE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
				ADVERTISE_100HALF | ADVERTISE_100FULL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		if (adv & ADVERTISED_10baseT_Half)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
			auto_nego |= ADVERTISE_10HALF;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		if (adv & ADVERTISED_10baseT_Full)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
			auto_nego |= ADVERTISE_10FULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		if (adv & ADVERTISED_100baseT_Half)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
			auto_nego |= ADVERTISE_100HALF;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		if (adv & ADVERTISED_100baseT_Full)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
			auto_nego |= ADVERTISE_100FULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		giga_ctrl = rtl_readphy(tp, MII_CTRL1000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
		if (tp->mii.supports_gmii) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
			if (adv & ADVERTISED_1000baseT_Half)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
				giga_ctrl |= ADVERTISE_1000HALF;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
			if (adv & ADVERTISED_1000baseT_Full)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
				giga_ctrl |= ADVERTISE_1000FULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		} else if (adv & (ADVERTISED_1000baseT_Half |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
				  ADVERTISED_1000baseT_Full)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
			netif_info(tp, link, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
				   "PHY does not support 1000Mbps\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		rtl_writephy(tp, MII_ADVERTISE, auto_nego);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		rtl_writephy(tp, MII_CTRL1000, giga_ctrl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		giga_ctrl = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		if (speed == SPEED_10)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
			bmcr = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		else if (speed == SPEED_100)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
			bmcr = BMCR_SPEED100;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		if (duplex == DUPLEX_FULL)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			bmcr |= BMCR_FULLDPLX;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	rtl_writephy(tp, MII_BMCR, bmcr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
			rtl_writephy(tp, 0x17, 0x2138);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
			rtl_writephy(tp, 0x0e, 0x0260);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
			rtl_writephy(tp, 0x17, 0x2108);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
			rtl_writephy(tp, 0x0e, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	rc = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
static int rtl8169_set_speed(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
			     u8 autoneg, u16 speed, u8 duplex, u32 advertising)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	int ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
	if (ret < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	if (netif_running(dev) && (autoneg == AUTONEG_ENABLE) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
	    (advertising & ADVERTISED_1000baseT_Full)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
	return ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
	int ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
	del_timer_sync(&tp->timer);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	ret = rtl8169_set_speed(dev, cmd->autoneg, ethtool_cmd_speed(cmd),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
				cmd->duplex, cmd->advertising);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	return ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
static u32 rtl8169_fix_features(struct net_device *dev, u32 features)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	if (dev->mtu > TD_MSS_MAX)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
		features &= ~NETIF_F_ALL_TSO;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	if (dev->mtu > JUMBO_1K &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
	    !rtl_chip_infos[tp->mac_version].jumbo_tx_csum)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
		features &= ~NETIF_F_IP_CSUM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
	return features;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
static int rtl8169_set_features(struct net_device *dev, u32 features)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	if (features & NETIF_F_RXCSUM)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		tp->cp_cmd |= RxChkSum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
		tp->cp_cmd &= ~RxChkSum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	if (dev->features & NETIF_F_HW_VLAN_RX)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		tp->cp_cmd |= RxVlan;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		tp->cp_cmd &= ~RxVlan;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	RTL_W16(CPlusCmd, tp->cp_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	RTL_R16(CPlusCmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
				      struct sk_buff *skb)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	return (vlan_tx_tag_present(skb)) ?
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	u32 opts2 = le32_to_cpu(desc->opts2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	if (opts2 & RxVlanTag)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	desc->opts2 = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	u32 status;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	cmd->supported =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	cmd->port = PORT_FIBRE;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	cmd->transceiver = XCVR_INTERNAL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	status = RTL_R32(TBICSR);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
	cmd->autoneg = !!(status & TBINwEnable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	ethtool_cmd_speed_set(cmd, SPEED_1000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
	cmd->duplex = DUPLEX_FULL; /* Always set */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	return mii_ethtool_gset(&tp->mii, cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	int rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	rc = tp->get_settings(dev, cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
			     void *p)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	if (regs->len > R8169_REGS_SIZE)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		regs->len = R8169_REGS_SIZE;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	memcpy_fromio(p, tp->mmio_addr, regs->len);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
static u32 rtl8169_get_msglevel(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
	return tp->msg_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	tp->msg_enable = value;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	"tx_packets",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	"rx_packets",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	"tx_errors",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	"rx_errors",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
	"rx_missed",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	"align_errors",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	"tx_single_collisions",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	"tx_multi_collisions",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
	"unicast",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	"broadcast",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	"multicast",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	"tx_aborted",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	"tx_underrun",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	switch (sset) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	case ETH_SS_STATS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		return ARRAY_SIZE(rtl8169_gstrings);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		return -EOPNOTSUPP;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
static void rtl8169_update_counters(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
	struct rtl8169_counters *counters;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
	dma_addr_t paddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	u32 cmd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	int wait = 1000;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	 * Some chips are unable to dump tally counters when the receiver
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
	 * is disabled.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	counters = dma_alloc_coherent(d, sizeof(*counters), &paddr, GFP_KERNEL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	if (!counters)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	cmd = (u64)paddr & DMA_BIT_MASK(32);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	RTL_W32(CounterAddrLow, cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	RTL_W32(CounterAddrLow, cmd | CounterDump);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	while (wait--) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
			memcpy(&tp->counters, counters, sizeof(*counters));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		udelay(10);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
	RTL_W32(CounterAddrLow, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	RTL_W32(CounterAddrHigh, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	dma_free_coherent(d, sizeof(*counters), counters, paddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
static void rtl8169_get_ethtool_stats(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
				      struct ethtool_stats *stats, u64 *data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
	ASSERT_RTNL();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	rtl8169_update_counters(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	data[0] = le64_to_cpu(tp->counters.tx_packets);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
	data[1] = le64_to_cpu(tp->counters.rx_packets);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
	data[2] = le64_to_cpu(tp->counters.tx_errors);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	data[3] = le32_to_cpu(tp->counters.rx_errors);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	data[4] = le16_to_cpu(tp->counters.rx_missed);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	data[5] = le16_to_cpu(tp->counters.align_errors);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	data[12] = le16_to_cpu(tp->counters.tx_underun);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	switch(stringset) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	case ETH_SS_STATS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
static const struct ethtool_ops rtl8169_ethtool_ops = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	.get_drvinfo		= rtl8169_get_drvinfo,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	.get_regs_len		= rtl8169_get_regs_len,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	.get_link		= ethtool_op_get_link,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	.get_settings		= rtl8169_get_settings,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	.set_settings		= rtl8169_set_settings,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	.get_msglevel		= rtl8169_get_msglevel,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	.set_msglevel		= rtl8169_set_msglevel,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	.get_regs		= rtl8169_get_regs,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	.get_wol		= rtl8169_get_wol,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	.set_wol		= rtl8169_set_wol,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	.get_strings		= rtl8169_get_strings,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	.get_sset_count		= rtl8169_get_sset_count,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
				    struct net_device *dev, u8 default_version)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	 * The driver currently handles the 8168Bf and the 8168Be identically
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	 * but they can be identified more specifically through the test below
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	 * if needed:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	 * Same thing for the 8101Eb and the 8101Ec:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	static const struct rtl_mac_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		u32 mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		u32 val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		int mac_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	} mac_info[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
		/* 8168F family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
		{ 0x7cf00000, 0x48100000,	RTL_GIGA_MAC_VER_36 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
		{ 0x7cf00000, 0x48000000,	RTL_GIGA_MAC_VER_35 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		/* 8168E family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
		{ 0x7c800000, 0x2c800000,	RTL_GIGA_MAC_VER_34 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
		{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
		/* 8168D family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
		{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
		/* 8168DP family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
		{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		/* 8168C family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
		{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
		/* 8168B family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
		/* 8101 family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
		{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
		/* FIXME: where did these entries come from ? -- FR */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		/* 8110 family. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		/* Catch-all */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	const struct rtl_mac_info *p = mac_info;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	u32 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	reg = RTL_R32(TxConfig);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
	while ((reg & p->mask) != p->val)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		p++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	tp->mac_version = p->mac_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
		netif_notice(tp, probe, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
			     "unknown MAC, using family default\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		tp->mac_version = default_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
struct phy_reg {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	u16 reg;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	u16 val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
static void rtl_writephy_batch(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
			       const struct phy_reg *regs, int len)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
	while (len-- > 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		rtl_writephy(tp, regs->reg, regs->val);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		regs++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
#define PHY_READ		0x00000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
#define PHY_DATA_OR		0x10000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
#define PHY_DATA_AND		0x20000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
#define PHY_BJMPN		0x30000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
#define PHY_READ_EFUSE		0x40000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
#define PHY_READ_MAC_BYTE	0x50000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
#define PHY_WRITE_MAC_BYTE	0x60000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
#define PHY_CLEAR_READCOUNT	0x70000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
#define PHY_WRITE		0x80000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
#define PHY_READCOUNT_EQ_SKIP	0x90000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
#define PHY_COMP_EQ_SKIPN	0xa0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
#define PHY_COMP_NEQ_SKIPN	0xb0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
#define PHY_WRITE_PREVIOUS	0xc0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
#define PHY_SKIPN		0xd0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
#define PHY_DELAY_MS		0xe0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
#define PHY_WRITE_ERI_WORD	0xf0000000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
struct fw_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	u32	magic;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	char	version[RTL_VER_SIZE];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	__le32	fw_start;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	__le32	fw_len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	u8	chksum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
} __packed;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
#define FW_OPCODE_SIZE	sizeof(typeof(*((struct rtl_fw_phy_action *)0)->code))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
static bool rtl_fw_format_ok(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	const struct firmware *fw = rtl_fw->fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	struct fw_info *fw_info = (struct fw_info *)fw->data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
	struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	char *version = rtl_fw->version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	bool rc = false;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	if (fw->size < FW_OPCODE_SIZE)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
		goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	if (!fw_info->magic) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		size_t i, size, start;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		u8 checksum = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		if (fw->size < sizeof(*fw_info))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
		for (i = 0; i < fw->size; i++)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
			checksum += fw->data[i];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
		if (checksum != 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		start = le32_to_cpu(fw_info->fw_start);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		if (start > fw->size)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		size = le32_to_cpu(fw_info->fw_len);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
		if (size > (fw->size - start) / FW_OPCODE_SIZE)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		memcpy(version, fw_info->version, RTL_VER_SIZE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
		pa->code = (__le32 *)(fw->data + start);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		pa->size = size;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		if (fw->size % FW_OPCODE_SIZE)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		strlcpy(version, rtl_lookup_firmware_name(tp), RTL_VER_SIZE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		pa->code = (__le32 *)fw->data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		pa->size = fw->size / FW_OPCODE_SIZE;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	version[RTL_VER_SIZE - 1] = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	rc = true;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
static bool rtl_fw_data_ok(struct rtl8169_private *tp, struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
			   struct rtl_fw_phy_action *pa)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	bool rc = false;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	size_t index;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	for (index = 0; index < pa->size; index++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		u32 action = le32_to_cpu(pa->code[index]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		u32 regno = (action & 0x0fff0000) >> 16;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
		switch(action & 0xf0000000) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
		case PHY_READ:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
		case PHY_DATA_OR:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		case PHY_DATA_AND:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
		case PHY_READ_EFUSE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		case PHY_CLEAR_READCOUNT:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
		case PHY_WRITE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		case PHY_WRITE_PREVIOUS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
		case PHY_DELAY_MS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
		case PHY_BJMPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
			if (regno > index) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
				netif_err(tp, ifup, tp->dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
					  "Out of range of firmware\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
				goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		case PHY_READCOUNT_EQ_SKIP:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
			if (index + 2 >= pa->size) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
				netif_err(tp, ifup, tp->dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
					  "Out of range of firmware\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
				goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		case PHY_COMP_EQ_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		case PHY_COMP_NEQ_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		case PHY_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
			if (index + 1 + regno >= pa->size) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
				netif_err(tp, ifup, tp->dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
					  "Out of range of firmware\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
				goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		case PHY_READ_MAC_BYTE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		case PHY_WRITE_MAC_BYTE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		case PHY_WRITE_ERI_WORD:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
			netif_err(tp, ifup, tp->dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
				  "Invalid action 0x%08x\n", action);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
			goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	rc = true;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
static int rtl_check_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	int rc = -EINVAL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	if (!rtl_fw_format_ok(tp, rtl_fw)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
		netif_err(tp, ifup, dev, "invalid firwmare\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
		goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	if (rtl_fw_data_ok(tp, dev, &rtl_fw->phy_action))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		rc = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	u32 predata, count;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
	size_t index;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	predata = count = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	for (index = 0; index < pa->size; ) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		u32 action = le32_to_cpu(pa->code[index]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		u32 data = action & 0x0000ffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		u32 regno = (action & 0x0fff0000) >> 16;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		if (!action)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		switch(action & 0xf0000000) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		case PHY_READ:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
			predata = rtl_readphy(tp, regno);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
			count++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
		case PHY_DATA_OR:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
			predata |= data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
		case PHY_DATA_AND:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
			predata &= data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		case PHY_BJMPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
			index -= regno;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
		case PHY_READ_EFUSE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
			predata = rtl8168d_efuse_read(tp->mmio_addr, regno);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
		case PHY_CLEAR_READCOUNT:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
			count = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
		case PHY_WRITE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
			rtl_writephy(tp, regno, data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
		case PHY_READCOUNT_EQ_SKIP:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
			index += (count == data) ? 2 : 1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
		case PHY_COMP_EQ_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
			if (predata == data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
				index += regno;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
		case PHY_COMP_NEQ_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
			if (predata != data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
				index += regno;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
		case PHY_WRITE_PREVIOUS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
			rtl_writephy(tp, regno, predata);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
		case PHY_SKIPN:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
			index += regno + 1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
		case PHY_DELAY_MS:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
			mdelay(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
			index++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
		case PHY_READ_MAC_BYTE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		case PHY_WRITE_MAC_BYTE:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
		case PHY_WRITE_ERI_WORD:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
		default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
			BUG();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
static void rtl_release_firmware(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
	if (!IS_ERR_OR_NULL(tp->rtl_fw)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
		release_firmware(tp->rtl_fw->fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		kfree(tp->rtl_fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
static void rtl_apply_firmware(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	struct rtl_fw *rtl_fw = tp->rtl_fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	if (!IS_ERR_OR_NULL(rtl_fw))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
		rtl_phy_write_fw(tp, rtl_fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	if (rtl_readphy(tp, reg) != val)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
		rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		{ 0x06, 0x006e },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		{ 0x08, 0x0708 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
		{ 0x15, 0x4000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
		{ 0x18, 0x65c7 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
		{ 0x03, 0x00a1 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
		{ 0x02, 0x0008 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		{ 0x01, 0x0120 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
		{ 0x00, 0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		{ 0x04, 0x0800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		{ 0x04, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		{ 0x03, 0xff41 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		{ 0x02, 0xdf60 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		{ 0x01, 0x0140 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ 0x00, 0x0077 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ 0x04, 0x7800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		{ 0x04, 0x7000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		{ 0x03, 0x802f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
		{ 0x02, 0x4f02 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
		{ 0x01, 0x0409 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		{ 0x00, 0xf0f9 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		{ 0x04, 0x9800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		{ 0x04, 0x9000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
		{ 0x01, 0xff95 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
		{ 0x00, 0xba00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
		{ 0x04, 0xa800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
		{ 0x04, 0xa000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		{ 0x03, 0xff41 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
		{ 0x01, 0x0140 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
		{ 0x00, 0x00bb },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		{ 0x04, 0xb800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		{ 0x04, 0xb000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
		{ 0x03, 0xdf41 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
		{ 0x02, 0xdc60 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
		{ 0x01, 0x6340 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
		{ 0x00, 0x007d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
		{ 0x04, 0xd800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
		{ 0x04, 0xd000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		{ 0x01, 0x100a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
		{ 0x00, 0xa0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
		{ 0x04, 0xf800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
		{ 0x04, 0xf000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
		{ 0x0b, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		{ 0x00, 0x9200 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
static void rtl8169sb_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		{ 0x01, 0x90d0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
static void rtl8169scd_hw_phy_config_quirk(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	if ((pdev->subsystem_vendor != PCI_VENDOR_ID_GIGABYTE) ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	    (pdev->subsystem_device != 0xe000))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	rtl_writephy(tp, 0x1f, 0x0001);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	rtl_writephy(tp, 0x10, 0xf01b);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
static void rtl8169scd_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		{ 0x04, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
		{ 0x03, 0x00a1 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		{ 0x02, 0x0008 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
		{ 0x01, 0x0120 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
		{ 0x00, 0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		{ 0x04, 0x0800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		{ 0x04, 0x9000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		{ 0x03, 0x802f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		{ 0x02, 0x4f02 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		{ 0x01, 0x0409 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		{ 0x00, 0xf099 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		{ 0x04, 0x9800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		{ 0x04, 0xa000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
		{ 0x01, 0xff95 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		{ 0x00, 0xba00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		{ 0x04, 0xa800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
		{ 0x04, 0xf000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		{ 0x01, 0x101a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		{ 0x00, 0xa0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		{ 0x04, 0xf800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		{ 0x04, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
		{ 0x10, 0xf41b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		{ 0x14, 0xfb54 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
		{ 0x18, 0xf5c7 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	rtl8169scd_hw_phy_config_quirk(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
static void rtl8169sce_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		{ 0x04, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		{ 0x03, 0x00a1 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		{ 0x02, 0x0008 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		{ 0x01, 0x0120 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
		{ 0x00, 0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		{ 0x04, 0x0800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		{ 0x04, 0x9000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
		{ 0x03, 0x802f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
		{ 0x02, 0x4f02 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		{ 0x01, 0x0409 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
		{ 0x00, 0xf099 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
		{ 0x04, 0x9800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
		{ 0x04, 0xa000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		{ 0x01, 0xff95 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
		{ 0x00, 0xba00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
		{ 0x04, 0xa800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
		{ 0x04, 0xf000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
		{ 0x01, 0x101a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
		{ 0x00, 0xa0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
		{ 0x04, 0xf800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		{ 0x04, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
		{ 0x0b, 0x8480 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		{ 0x18, 0x67c7 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		{ 0x04, 0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
		{ 0x03, 0x002f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		{ 0x02, 0x4360 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		{ 0x01, 0x0109 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		{ 0x00, 0x3022 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		{ 0x04, 0x2800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
static void rtl8168bb_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		{ 0x10, 0xf41b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
	rtl_writephy(tp, 0x1f, 0x0001);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	rtl_patchphy(tp, 0x16, 1 << 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
static void rtl8168bef_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x10, 0xf41b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
static void rtl8168cp_1_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		{ 0x1d, 0x0f00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		{ 0x0c, 0x1ec8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
static void rtl8168cp_2_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
		{ 0x1d, 0x3d98 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	rtl_patchphy(tp, 0x14, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	rtl_patchphy(tp, 0x0d, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
static void rtl8168c_1_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		{ 0x12, 0x2300 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
		{ 0x00, 0x88d4 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
		{ 0x01, 0x82b1 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		{ 0x03, 0x7002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		{ 0x08, 0x9e30 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		{ 0x09, 0x01f0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
		{ 0x0a, 0x5500 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
		{ 0x0c, 0x00c8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
		{ 0x12, 0xc096 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		{ 0x16, 0x000a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		{ 0x09, 0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
		{ 0x09, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	rtl_patchphy(tp, 0x14, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	rtl_patchphy(tp, 0x0d, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
static void rtl8168c_2_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		{ 0x12, 0x2300 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
		{ 0x03, 0x802f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		{ 0x02, 0x4f02 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		{ 0x01, 0x0409 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		{ 0x00, 0xf099 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		{ 0x04, 0x9800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		{ 0x04, 0x9000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		{ 0x1d, 0x3d98 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
		{ 0x0c, 0x7eb8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
		{ 0x06, 0x0761 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
		{ 0x16, 0x0f0a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	rtl_patchphy(tp, 0x16, 1 << 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	rtl_patchphy(tp, 0x14, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	rtl_patchphy(tp, 0x0d, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
static void rtl8168c_3_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		{ 0x12, 0x2300 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		{ 0x1d, 0x3d98 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		{ 0x0c, 0x7eb8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		{ 0x06, 0x5461 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		{ 0x16, 0x0f0a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	rtl_patchphy(tp, 0x16, 1 << 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	rtl_patchphy(tp, 0x14, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	rtl_patchphy(tp, 0x0d, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
static void rtl8168c_4_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	rtl8168c_3_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	static const struct phy_reg phy_reg_init_0[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
		/* Channel Estimation */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
		{ 0x06, 0x4064 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
		{ 0x07, 0x2863 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
		{ 0x08, 0x059c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
		{ 0x09, 0x26b4 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
		{ 0x0a, 0x6a19 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		{ 0x0b, 0xdcc8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
		{ 0x10, 0xf06d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
		{ 0x14, 0x7f68 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
		{ 0x18, 0x7fd9 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
		{ 0x1c, 0xf0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
		{ 0x1d, 0x3d9c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
		{ 0x12, 0xf49f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
		{ 0x13, 0x070b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
		{ 0x1a, 0x05ad },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
		{ 0x14, 0x94c0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		 * Tx Error Issue
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
		 * Enhance line driver power
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
		{ 0x06, 0x5561 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		{ 0x05, 0x8332 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
		{ 0x06, 0x5561 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		 * Can not link to 1Gbps with bad cable
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		 * Decrease SNR threshold form 21.07dB to 19.04dB
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
		{ 0x0d, 0xf880 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	 * Rx Error Issue
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	 * Fine Tune Switching regulator parameter
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	rtl_w1w0_phy(tp, 0x0b, 0x0010, 0x00ef);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	rtl_w1w0_phy(tp, 0x0c, 0xa200, 0x5d00);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
		static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
			{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
			{ 0x05, 0x669a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
			{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
			{ 0x05, 0x8330 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
			{ 0x06, 0x669a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
			{ 0x1f, 0x0002 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
		};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
		int val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
		val = rtl_readphy(tp, 0x0d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
		if ((val & 0x00ff) != 0x006c) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
			static const u32 set[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
				0x0065, 0x0066, 0x0067, 0x0068,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
				0x0069, 0x006a, 0x006b, 0x006c
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
			};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
			int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
			rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
			val &= 0xff00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
			for (i = 0; i < ARRAY_SIZE(set); i++)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
				rtl_writephy(tp, 0x0d, val | set[i]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
		static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
			{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
			{ 0x05, 0x6662 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
			{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
			{ 0x05, 0x8330 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
			{ 0x06, 0x6662 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	/* RSET couple improve */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	rtl_patchphy(tp, 0x0d, 0x0300);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	rtl_patchphy(tp, 0x0f, 0x0010);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	/* Fine tune PLL performance */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	rtl_w1w0_phy(tp, 0x02, 0x0100, 0x0600);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	rtl_w1w0_phy(tp, 0x03, 0x0000, 0xe000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
	rtl_writephy(tp, 0x05, 0x001b);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	static const struct phy_reg phy_reg_init_0[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
		/* Channel Estimation */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
		{ 0x06, 0x4064 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
		{ 0x07, 0x2863 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
		{ 0x08, 0x059c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
		{ 0x09, 0x26b4 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
		{ 0x0a, 0x6a19 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
		{ 0x0b, 0xdcc8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
		{ 0x10, 0xf06d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
		{ 0x14, 0x7f68 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
		{ 0x18, 0x7fd9 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
		{ 0x1c, 0xf0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
		{ 0x1d, 0x3d9c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
		{ 0x12, 0xf49f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
		{ 0x13, 0x070b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
		{ 0x1a, 0x05ad },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
		{ 0x14, 0x94c0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
		 * Tx Error Issue
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
		 * Enhance line driver power
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
		{ 0x06, 0x5561 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		{ 0x05, 0x8332 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
		{ 0x06, 0x5561 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
		 * Can not link to 1Gbps with bad cable
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
		 * Decrease SNR threshold form 21.07dB to 19.04dB
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
		{ 0x0d, 0xf880 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	rtl_writephy_batch(tp, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	if (rtl8168d_efuse_read(ioaddr, 0x01) == 0xb1) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
		static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
			{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
			{ 0x05, 0x669a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
			{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
			{ 0x05, 0x8330 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
			{ 0x06, 0x669a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
			{ 0x1f, 0x0002 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
		};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
		int val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
		val = rtl_readphy(tp, 0x0d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		if ((val & 0x00ff) != 0x006c) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
			static const u32 set[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
				0x0065, 0x0066, 0x0067, 0x0068,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
				0x0069, 0x006a, 0x006b, 0x006c
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
			};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
			int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
			rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
			val &= 0xff00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
			for (i = 0; i < ARRAY_SIZE(set); i++)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
				rtl_writephy(tp, 0x0d, val | set[i]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
		static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
			{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
			{ 0x05, 0x2642 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
			{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
			{ 0x05, 0x8330 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
			{ 0x06, 0x2642 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
		};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
		rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
	/* Fine tune PLL performance */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	rtl_w1w0_phy(tp, 0x02, 0x0100, 0x0600);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	rtl_w1w0_phy(tp, 0x03, 0x0000, 0xe000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	/* Switching regulator Slew rate */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	rtl_patchphy(tp, 0x0f, 0x0017);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
	rtl_writephy(tp, 0x05, 0x001b);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
static void rtl8168d_3_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
		{ 0x10, 0x0008 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		{ 0x0d, 0x006c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
		{ 0x0d, 0xf880 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		{ 0x0b, 0xa4d8 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		{ 0x09, 0x281c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		{ 0x07, 0x2883 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		{ 0x0a, 0x6b35 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
		{ 0x1d, 0x3da4 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		{ 0x1c, 0xeffd },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		{ 0x14, 0x7f52 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		{ 0x18, 0x7fc6 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		{ 0x08, 0x0601 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		{ 0x06, 0x4063 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		{ 0x10, 0xf074 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		{ 0x13, 0x0789 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
		{ 0x12, 0xf4bd },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
		{ 0x1a, 0x04fd },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
		{ 0x14, 0x84b0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		{ 0x00, 0x9200 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		{ 0x01, 0x0340 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		{ 0x04, 0x4000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		{ 0x03, 0x1d21 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		{ 0x02, 0x0c32 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		{ 0x01, 0x0200 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		{ 0x00, 0x5554 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		{ 0x04, 0x4800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		{ 0x04, 0x4000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
		{ 0x04, 0xf000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
		{ 0x03, 0xdf01 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		{ 0x02, 0xdf20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		{ 0x01, 0x101a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
		{ 0x00, 0xa0ff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
		{ 0x04, 0xf800 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		{ 0x04, 0xf000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		{ 0x1e, 0x0023 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
		{ 0x16, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
		{ 0x17, 0x0cc0 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
		{ 0x1e, 0x002d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		{ 0x18, 0x0040 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	rtl_patchphy(tp, 0x0d, 1 << 5);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
		/* Enable Delay cap */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		{ 0x05, 0x8b80 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
		{ 0x06, 0xc896 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
		/* Channel estimation fine tune */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
		{ 0x0b, 0x6c20 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
		{ 0x07, 0x2872 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		{ 0x1c, 0xefff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
		{ 0x14, 0x6420 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		/* Update PFM & 10M TX idle timer */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		{ 0x1e, 0x002f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		{ 0x15, 0x1919 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		{ 0x1e, 0x00ac },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		{ 0x18, 0x0006 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
	rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	/* DCO enable for 10M IDLE Power */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	rtl_writephy(tp, 0x1e, 0x0023);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
	/* For impedance matching */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	rtl_w1w0_phy(tp, 0x08, 0x8000, 0x7f00);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	/* PHY auto speed down */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	rtl_writephy(tp, 0x1e, 0x002d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	rtl_w1w0_phy(tp, 0x18, 0x0050, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	rtl_writephy(tp, 0x05, 0x8b86);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	rtl_writephy(tp, 0x05, 0x8b85);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	rtl_writephy(tp, 0x1e, 0x0020);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	rtl_w1w0_phy(tp, 0x15, 0x0000, 0x1100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	rtl_writephy(tp, 0x1f, 0x0006);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	rtl_writephy(tp, 0x00, 0x5a00);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
	rtl_writephy(tp, 0x0d, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
	rtl_writephy(tp, 0x0e, 0x003c);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
	rtl_writephy(tp, 0x0d, 0x4007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	rtl_writephy(tp, 0x0e, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	rtl_writephy(tp, 0x0d, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
		/* Enable Delay cap */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
		{ 0x1f, 0x0004 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		{ 0x1e, 0x00ac },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
		{ 0x18, 0x0006 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
		{ 0x1f, 0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
		/* Channel estimation fine tune */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
		{ 0x09, 0xa20f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
		/* Green Setting */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
		{ 0x05, 0x8b5b },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
		{ 0x06, 0x9222 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
		{ 0x05, 0x8b6d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
		{ 0x06, 0x8000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
		{ 0x05, 0x8b76 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
		{ 0x06, 0x8000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
	/* For 4-corner performance improve */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	rtl_writephy(tp, 0x05, 0x8b80);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	/* PHY auto speed down */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	rtl_writephy(tp, 0x1f, 0x0004);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
	rtl_writephy(tp, 0x1e, 0x002d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	/* improve 10M EEE waveform */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
	rtl_writephy(tp, 0x05, 0x8b86);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	/* Improve 2-pair detection performance */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	rtl_writephy(tp, 0x05, 0x8b85);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
	/* EEE setting */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	rtl_w1w0_eri(tp->mmio_addr, 0x1b0, ERIAR_MASK_1111, 0x0000, 0x0003,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
		     ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	rtl_writephy(tp, 0x05, 0x8b85);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	rtl_writephy(tp, 0x1f, 0x0004);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
	rtl_writephy(tp, 0x1e, 0x0020);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
	rtl_w1w0_phy(tp, 0x15, 0x0000, 0x0100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	rtl_writephy(tp, 0x1f, 0x0002);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	rtl_writephy(tp, 0x0d, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	rtl_writephy(tp, 0x0e, 0x003c);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	rtl_writephy(tp, 0x0d, 0x4007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	rtl_writephy(tp, 0x0e, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	rtl_writephy(tp, 0x0d, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	/* Green feature */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	rtl_writephy(tp, 0x1f, 0x0003);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		/* Channel estimation fine tune */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		{ 0x09, 0xa20f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		/* Modify green table for giga & fnet */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
		{ 0x05, 0x8b55 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
		{ 0x06, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
		{ 0x05, 0x8b5e },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
		{ 0x06, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
		{ 0x05, 0x8b67 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
		{ 0x06, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
		{ 0x05, 0x8b70 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
		{ 0x06, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
		{ 0x1f, 0x0007 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
		{ 0x1e, 0x0078 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
		{ 0x17, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
		{ 0x19, 0x00fb },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
		/* Modify green table for 10M */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
		{ 0x05, 0x8b79 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
		{ 0x06, 0xaa00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
		/* Disable hiimpedance detection (RTCT) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
		{ 0x01, 0x328a },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	/* For 4-corner performance improve */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
	rtl_writephy(tp, 0x05, 0x8b80);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
	rtl_w1w0_phy(tp, 0x06, 0x0006, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	/* PHY auto speed down */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
	rtl_writephy(tp, 0x1e, 0x002d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
	rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	/* Improve 10M EEE waveform */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	rtl_writephy(tp, 0x05, 0x8b86);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
	/* Improve 2-pair detection performance */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	rtl_writephy(tp, 0x05, 0x8b85);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
	rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
	rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
	/* For 4-corner performance improve */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
	rtl_writephy(tp, 0x05, 0x8b80);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	rtl_w1w0_phy(tp, 0x06, 0x0006, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	/* PHY auto speed down */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	rtl_writephy(tp, 0x1f, 0x0007);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	rtl_writephy(tp, 0x1e, 0x002d);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
	/* Improve 10M EEE waveform */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	rtl_writephy(tp, 0x1f, 0x0005);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	rtl_writephy(tp, 0x05, 0x8b86);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
		{ 0x1f, 0x0003 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
		{ 0x08, 0x441d },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
		{ 0x01, 0x9100 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
	rtl_patchphy(tp, 0x11, 1 << 12);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
	rtl_patchphy(tp, 0x19, 1 << 13);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	rtl_patchphy(tp, 0x10, 1 << 15);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
	static const struct phy_reg phy_reg_init[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
		{ 0x1f, 0x0005 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
		{ 0x1a, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
		{ 0x1f, 0x0004 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
		{ 0x1c, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
		{ 0x1f, 0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
		{ 0x1f, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
		{ 0x15, 0x7701 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
		{ 0x1f, 0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	/* Disable ALDPS before ram code */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	rtl_writephy(tp, 0x18, 0x0310);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
	msleep(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	rtl_apply_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
static void rtl_hw_phy_config(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
	rtl8169_print_mac_version(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
	case RTL_GIGA_MAC_VER_01:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
	case RTL_GIGA_MAC_VER_02:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
	case RTL_GIGA_MAC_VER_03:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
		rtl8169s_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
	case RTL_GIGA_MAC_VER_04:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
		rtl8169sb_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
	case RTL_GIGA_MAC_VER_05:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
		rtl8169scd_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	case RTL_GIGA_MAC_VER_06:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		rtl8169sce_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
	case RTL_GIGA_MAC_VER_07:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
	case RTL_GIGA_MAC_VER_08:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	case RTL_GIGA_MAC_VER_09:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
		rtl8102e_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
		rtl8168bb_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
		rtl8168bef_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
		rtl8168bef_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
		rtl8168cp_1_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
		rtl8168c_1_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
		rtl8168c_2_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		rtl8168c_3_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
		rtl8168c_4_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
		rtl8168cp_2_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
		rtl8168d_1_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
		rtl8168d_2_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
		rtl8168d_3_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
		rtl8168d_4_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	case RTL_GIGA_MAC_VER_29:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
	case RTL_GIGA_MAC_VER_30:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
		rtl8105e_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
		/* None. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
		rtl8168e_1_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	case RTL_GIGA_MAC_VER_34:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
		rtl8168e_2_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	case RTL_GIGA_MAC_VER_35:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		rtl8168f_1_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	case RTL_GIGA_MAC_VER_36:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		rtl8168f_2_hw_phy_config(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
static void rtl8169_phy_timer(unsigned long __opaque)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	struct net_device *dev = (struct net_device *)__opaque;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
	struct timer_list *timer = &tp->timer;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
		spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	if (tp->phy_reset_pending(tp)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
		 * A busy loop could burn quite a few cycles on nowadays CPU.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
		 * Let's delay the execution of the timer for a few ticks.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
		timeout = HZ/10;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
		goto out_mod_timer;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	if (tp->link_ok(ioaddr))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		goto out_unlock;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	netif_warn(tp, link, dev, "PHY reset until link up\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
	tp->phy_reset_enable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
out_mod_timer:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		mod_timer(timer, jiffies + timeout);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
out_unlock:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
		spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
#ifdef CONFIG_NET_POLL_CONTROLLER
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
 * Polling 'interrupt' - used by things like netconsole to send skbs
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
 * without having to re-enable interrupts. It's not called while
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
 * the interrupt routine is executing.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
static void rtl8169_netpoll(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
	disable_irq(pdev->irq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	rtl8169_interrupt(pdev->irq, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
	enable_irq(pdev->irq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
#endif
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
				  void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
	iounmap(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
	pci_release_regions(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
	pci_clear_mwi(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
	pci_disable_device(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	free_netdev(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
static void rtl8169_phy_reset(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
			      struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
	tp->phy_reset_enable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
		if (!tp->phy_reset_pending(tp))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
			return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
		msleep(1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	netif_err(tp, link, dev, "PHY reset failed\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
static bool rtl_tbi_enabled(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	return (tp->mac_version == RTL_GIGA_MAC_VER_01) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	    (RTL_R8(PHYstatus) & TBI_Enable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	rtl_hw_phy_config(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
		RTL_W8(0x82, 0x01);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		RTL_W8(0x82, 0x01);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		rtl_writephy(tp, 0x0b, 0x0000); //w 0x0b 15 0 0
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
	rtl8169_phy_reset(dev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
			  ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
			  ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
			  (tp->mii.supports_gmii ?
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
			   ADVERTISED_1000baseT_Half |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
			   ADVERTISED_1000baseT_Full : 0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	if (rtl_tbi_enabled(tp))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
		netif_info(tp, link, dev, "TBI auto-negotiating\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	u32 high;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
	u32 low;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	high = addr[4] | (addr[5] << 8);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
	RTL_W32(MAC4, high);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
	RTL_R32(MAC4);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	RTL_W32(MAC0, low);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	RTL_R32(MAC0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
		const struct exgmac_reg e[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
			{ .addr = 0xe0, ERIAR_MASK_1111, .val = low },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
			{ .addr = 0xe4, ERIAR_MASK_1111, .val = high },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
			{ .addr = 0xf0, ERIAR_MASK_1111, .val = low << 16 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
			{ .addr = 0xf4, ERIAR_MASK_1111, .val = high << 16 |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
								low  >> 16 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
		rtl_write_exgmac_batch(ioaddr, e, ARRAY_SIZE(e));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
static int rtl_set_mac_address(struct net_device *dev, void *p)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	struct sockaddr *addr = p;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	if (!is_valid_ether_addr(addr->sa_data))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		return -EADDRNOTAVAIL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	rtl_rar_set(tp, dev->dev_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	struct mii_ioctl_data *data = if_mii(ifr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
static int rtl_xmii_ioctl(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
			  struct mii_ioctl_data *data, int cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
	switch (cmd) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	case SIOCGMIIPHY:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		data->phy_id = 32; /* Internal PHY */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	case SIOCGMIIREG:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		data->val_out = rtl_readphy(tp, data->reg_num & 0x1f);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
	case SIOCSMIIREG:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
		rtl_writephy(tp, data->reg_num & 0x1f, data->val_in);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	return -EOPNOTSUPP;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
	return -EOPNOTSUPP;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
static const struct rtl_cfg_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	void (*hw_start)(struct net_device *);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	unsigned int region;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	unsigned int align;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	u16 intr_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	u16 napi_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	unsigned features;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	u8 default_ver;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
} rtl_cfg_infos [] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
	[RTL_CFG_0] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
		.hw_start	= rtl_hw_start_8169,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		.region		= 1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
		.align		= 0,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		.intr_event	= SYSErr | LinkChg | RxOverflow |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
		.features	= RTL_FEATURE_GMII,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
		.default_ver	= RTL_GIGA_MAC_VER_01,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
	},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
	[RTL_CFG_1] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		.hw_start	= rtl_hw_start_8168,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
		.region		= 2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
		.align		= 8,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
		.intr_event	= SYSErr | LinkChg | RxOverflow |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
				  TxErr | TxOK | RxOK | RxErr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
		.default_ver	= RTL_GIGA_MAC_VER_11,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	},
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
	[RTL_CFG_2] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
		.hw_start	= rtl_hw_start_8101,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
		.region		= 2,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		.align		= 8,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
		.features	= RTL_FEATURE_MSI,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
		.default_ver	= RTL_GIGA_MAC_VER_13,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
/* Cfg9346_Unlock assumed. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
static unsigned rtl_try_msi(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
			    const struct rtl_cfg_info *cfg)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
	unsigned msi = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
	u8 cfg2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	if (cfg->features & RTL_FEATURE_MSI) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
		if (pci_enable_msi(tp->pci_dev)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
			netif_info(tp, hw, tp->dev, "no MSI. Back to INTx.\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
		} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
			cfg2 |= MSIEnable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
			msi = RTL_FEATURE_MSI;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
		RTL_W8(Config2, cfg2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
	return msi;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	if (tp->features & RTL_FEATURE_MSI) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
		pci_disable_msi(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
		tp->features &= ~RTL_FEATURE_MSI;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
static const struct net_device_ops rtl8169_netdev_ops = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
	.ndo_open		= rtl8169_open,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	.ndo_stop		= rtl8169_close,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	.ndo_get_stats		= rtl8169_get_stats,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
	.ndo_start_xmit		= rtl8169_start_xmit,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	.ndo_tx_timeout		= rtl8169_tx_timeout,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
	.ndo_validate_addr	= eth_validate_addr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
	.ndo_change_mtu		= rtl8169_change_mtu,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	.ndo_fix_features	= rtl8169_fix_features,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	.ndo_set_features	= rtl8169_set_features,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	.ndo_set_mac_address	= rtl_set_mac_address,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	.ndo_do_ioctl		= rtl8169_ioctl,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	.ndo_set_rx_mode	= rtl_set_rx_mode,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
#ifdef CONFIG_NET_POLL_CONTROLLER
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	.ndo_poll_controller	= rtl8169_netpoll,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
#endif
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
	struct mdio_ops *ops = &tp->mdio_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
		ops->write	= r8168dp_1_mdio_write;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
		ops->read	= r8168dp_1_mdio_read;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
		ops->write	= r8168dp_2_mdio_write;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
		ops->read	= r8168dp_2_mdio_read;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
		ops->write	= r8169_mdio_write;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
		ops->read	= r8169_mdio_read;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
	case RTL_GIGA_MAC_VER_29:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
	case RTL_GIGA_MAC_VER_30:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	case RTL_GIGA_MAC_VER_34:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
		RTL_W32(RxConfig, RTL_R32(RxConfig) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
	if (!(__rtl8169_get_wol(tp) & WAKE_ANY))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
		return false;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	rtl_writephy(tp, MII_BMCR, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	rtl_wol_suspend_quirk(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
	return true;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
static void r810x_phy_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
	rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
static void r810x_phy_power_up(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
	rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
static void r810x_pll_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
	if (rtl_wol_pll_power_down(tp))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
	r810x_phy_power_down(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
static void r810x_pll_power_up(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
	r810x_phy_power_up(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
static void r8168_phy_power_up(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		rtl_writephy(tp, 0x0e, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
	rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
static void r8168_phy_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	rtl_writephy(tp, 0x1f, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
		rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
		rtl_writephy(tp, 0x0e, 0x0200);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
		rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
static void r8168_pll_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
	    r8168dp_check_dash(tp)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
	if ((tp->mac_version == RTL_GIGA_MAC_VER_23 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
	     tp->mac_version == RTL_GIGA_MAC_VER_24) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
	    (RTL_R16(CPlusCmd) & ASF)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
	    tp->mac_version == RTL_GIGA_MAC_VER_33)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
		rtl_ephy_write(ioaddr, 0x19, 0xff64);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	if (rtl_wol_pll_power_down(tp))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
	r8168_phy_power_down(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
static void r8168_pll_power_up(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
	     tp->mac_version == RTL_GIGA_MAC_VER_31) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
	    r8168dp_check_dash(tp)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	r8168_phy_power_up(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
static void rtl_generic_op(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
			   void (*op)(struct rtl8169_private *))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
	if (op)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
		op(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
static void rtl_pll_power_down(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
	rtl_generic_op(tp, tp->pll_power_ops.down);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
static void rtl_pll_power_up(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
	rtl_generic_op(tp, tp->pll_power_ops.up);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	struct pll_power_ops *ops = &tp->pll_power_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	case RTL_GIGA_MAC_VER_07:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
	case RTL_GIGA_MAC_VER_08:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	case RTL_GIGA_MAC_VER_09:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
	case RTL_GIGA_MAC_VER_10:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	case RTL_GIGA_MAC_VER_16:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
	case RTL_GIGA_MAC_VER_29:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
	case RTL_GIGA_MAC_VER_30:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
		ops->down	= r810x_pll_power_down;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
		ops->up		= r810x_pll_power_up;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	case RTL_GIGA_MAC_VER_34:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	case RTL_GIGA_MAC_VER_35:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	case RTL_GIGA_MAC_VER_36:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
		ops->down	= r8168_pll_power_down;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
		ops->up		= r8168_pll_power_up;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
		ops->down	= NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
		ops->up		= NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
static void rtl_init_rxcfg(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	case RTL_GIGA_MAC_VER_01:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
	case RTL_GIGA_MAC_VER_02:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	case RTL_GIGA_MAC_VER_03:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
	case RTL_GIGA_MAC_VER_04:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	case RTL_GIGA_MAC_VER_05:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	case RTL_GIGA_MAC_VER_06:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	case RTL_GIGA_MAC_VER_10:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	case RTL_GIGA_MAC_VER_13:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
	case RTL_GIGA_MAC_VER_14:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
	case RTL_GIGA_MAC_VER_15:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	case RTL_GIGA_MAC_VER_16:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
		RTL_W32(RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
		RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		RTL_W32(RxConfig, RX128_INT_EN | RX_DMA_BURST);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
	rtl_generic_op(tp, tp->jumbo_ops.enable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
static void rtl_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	rtl_generic_op(tp, tp->jumbo_ops.disable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
	RTL_W8(Config4, RTL_R8(Config4) | Jumbo_En1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
	rtl_tx_performance_tweak(tp->pci_dev, 0x2 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	RTL_W8(Config4, RTL_R8(Config4) & ~Jumbo_En1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
	rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	RTL_W8(MaxTxPacketSize, 0x3f);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
	RTL_W8(Config4, RTL_R8(Config4) | 0x01);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
	pci_write_config_byte(pdev, 0x79, 0x20);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	RTL_W8(MaxTxPacketSize, 0x0c);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
	RTL_W8(Config4, RTL_R8(Config4) & ~0x01);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	pci_write_config_byte(pdev, 0x79, 0x50);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
static void r8168b_0_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	rtl_tx_performance_tweak(tp->pci_dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
		(0x2 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
static void r8168b_0_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
	rtl_tx_performance_tweak(tp->pci_dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
	r8168b_0_hw_jumbo_enable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	RTL_W8(Config4, RTL_R8(Config4) | (1 << 0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	r8168b_0_hw_jumbo_disable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
static void __devinit rtl_init_jumbo_ops(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	struct jumbo_ops *ops = &tp->jumbo_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
		ops->disable	= r8168b_0_hw_jumbo_disable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
		ops->enable	= r8168b_0_hw_jumbo_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
		ops->disable	= r8168b_1_hw_jumbo_disable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
		ops->enable	= r8168b_1_hw_jumbo_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	case RTL_GIGA_MAC_VER_18: /* Wild guess. Needs info from Realtek. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
	case RTL_GIGA_MAC_VER_21: /* Wild guess. Needs info from Realtek. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
		ops->disable	= r8168c_hw_jumbo_disable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
		ops->enable	= r8168c_hw_jumbo_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
		ops->disable	= r8168dp_hw_jumbo_disable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
		ops->enable	= r8168dp_hw_jumbo_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
	case RTL_GIGA_MAC_VER_31: /* Wild guess. Needs info from Realtek. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
	case RTL_GIGA_MAC_VER_34:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
		ops->disable	= r8168e_hw_jumbo_disable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		ops->enable	= r8168e_hw_jumbo_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
	 * No action needed for jumbo frames with 8169.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
	 * No jumbo for 810x at all.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
		ops->disable	= NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3944
		ops->enable	= NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3945
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3946
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3947
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3948
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3949
static void rtl_hw_reset(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3950
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3951
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3952
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3953
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3954
	/* Soft reset the chip. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3955
	RTL_W8(ChipCmd, CmdReset);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3956
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3957
	/* Check that the chip has finished the reset. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3958
	for (i = 0; i < 100; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3959
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3960
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3963
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3964
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3965
static int __devinit
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3966
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3967
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3968
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3969
	const unsigned int region = cfg->region;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3970
	struct rtl8169_private *tp;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3971
	struct mii_if_info *mii;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3972
	struct net_device *dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3973
	void __iomem *ioaddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3974
	int chipset, i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3975
	int rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3976
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3977
	if (netif_msg_drv(&debug)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3978
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3979
		       MODULENAME, RTL8169_VERSION);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3980
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3981
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3982
	dev = alloc_etherdev(sizeof (*tp));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3983
	if (!dev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3984
		if (netif_msg_drv(&debug))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3985
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3986
		rc = -ENOMEM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3987
		goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3988
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
	SET_NETDEV_DEV(dev, &pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	dev->netdev_ops = &rtl8169_netdev_ops;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	tp->dev = dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
	tp->pci_dev = pdev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3996
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
	mii = &tp->mii;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
	mii->dev = dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
	mii->mdio_read = rtl_mdio_read;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
	mii->mdio_write = rtl_mdio_write;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
	mii->phy_id_mask = 0x1f;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
	mii->reg_num_mask = 0x1f;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
	/* disable ASPM completely as that cause random device stop working
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	 * problems as well as full system hangs for some PCIe devices users */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
	pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
				     PCIE_LINK_STATE_CLKPM);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4011
	rc = pci_enable_device(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4012
	if (rc < 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4013
		netif_err(tp, probe, dev, "enable failure\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4014
		goto err_out_free_dev_1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4015
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4016
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4017
	if (pci_set_mwi(pdev) < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4018
		netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4019
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4020
	/* make sure PCI base addr 1 is MMIO */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4021
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4022
		netif_err(tp, probe, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4023
			  "region #%d not an MMIO resource, aborting\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4024
			  region);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4025
		rc = -ENODEV;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4026
		goto err_out_mwi_2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4027
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4028
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4029
	/* check for weird/broken PCI region reporting */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4030
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4031
		netif_err(tp, probe, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4032
			  "Invalid PCI region size(s), aborting\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4033
		rc = -ENODEV;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4034
		goto err_out_mwi_2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4035
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4036
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4037
	rc = pci_request_regions(pdev, MODULENAME);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4038
	if (rc < 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4039
		netif_err(tp, probe, dev, "could not request regions\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4040
		goto err_out_mwi_2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4041
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4042
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4043
	tp->cp_cmd = RxChkSum;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4044
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4045
	if ((sizeof(dma_addr_t) > 4) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4046
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4047
		tp->cp_cmd |= PCIDAC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4048
		dev->features |= NETIF_F_HIGHDMA;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4049
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4050
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4051
		if (rc < 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4052
			netif_err(tp, probe, dev, "DMA configuration failed\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4053
			goto err_out_free_res_3;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4054
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4055
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4056
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4057
	/* ioremap MMIO region */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4058
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4059
	if (!ioaddr) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4060
		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4061
		rc = -EIO;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4062
		goto err_out_free_res_3;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4063
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4064
	tp->mmio_addr = ioaddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4065
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4066
	if (!pci_is_pcie(pdev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4067
		netif_info(tp, probe, dev, "not PCI Express\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4068
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4069
	/* Identify chip attached to board */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4070
	rtl8169_get_mac_version(tp, dev, cfg->default_ver);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4071
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4072
	rtl_init_rxcfg(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4073
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4074
	RTL_W16(IntrMask, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4075
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4076
	rtl_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4077
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4078
	RTL_W16(IntrStatus, 0xffff);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4079
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4080
	pci_set_master(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4081
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4082
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4083
	 * Pretend we are using VLANs; This bypasses a nasty bug where
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4084
	 * Interrupts stop flowing on high load on 8110SCd controllers.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4085
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4086
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4087
		tp->cp_cmd |= RxVlan;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4088
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4089
	rtl_init_mdio_ops(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4090
	rtl_init_pll_power_ops(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4091
	rtl_init_jumbo_ops(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4092
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4093
	rtl8169_print_mac_version(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4094
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4095
	chipset = tp->mac_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4096
	tp->txd_version = rtl_chip_infos[chipset].txd_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4097
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4098
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4099
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4100
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4101
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4102
		tp->features |= RTL_FEATURE_WOL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4103
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4104
		tp->features |= RTL_FEATURE_WOL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4105
	tp->features |= rtl_try_msi(tp, cfg);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4106
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4107
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4108
	if (rtl_tbi_enabled(tp)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4109
		tp->set_speed = rtl8169_set_speed_tbi;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4110
		tp->get_settings = rtl8169_gset_tbi;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4111
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4112
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4113
		tp->link_ok = rtl8169_tbi_link_ok;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4114
		tp->do_ioctl = rtl_tbi_ioctl;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4115
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4116
		tp->set_speed = rtl8169_set_speed_xmii;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4117
		tp->get_settings = rtl8169_gset_xmii;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4118
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4119
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4120
		tp->link_ok = rtl8169_xmii_link_ok;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4121
		tp->do_ioctl = rtl_xmii_ioctl;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4122
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4123
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4124
	spin_lock_init(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4125
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4126
	/* Get MAC address */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4127
	for (i = 0; i < MAC_ADDR_LEN; i++)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4128
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4129
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4130
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4131
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4132
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4133
	dev->irq = pdev->irq;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4134
	dev->base_addr = (unsigned long) ioaddr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4135
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4136
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4137
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4138
	/* don't enable SG, IP_CSUM and TSO by default - it might not work
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4139
	 * properly for all devices */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4140
	dev->features |= NETIF_F_RXCSUM |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4141
		NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4142
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4143
	dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4144
		NETIF_F_RXCSUM | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4145
	dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4146
		NETIF_F_HIGHDMA;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4147
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4148
	if (tp->mac_version == RTL_GIGA_MAC_VER_05)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4149
		/* 8110SCd requires hardware Rx VLAN - disallow toggling */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4150
		dev->hw_features &= ~NETIF_F_HW_VLAN_RX;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4151
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4152
	tp->intr_mask = 0xffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4153
	tp->hw_start = cfg->hw_start;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4154
	tp->intr_event = cfg->intr_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4155
	tp->napi_event = cfg->napi_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4156
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4157
	tp->opts1_mask = (tp->mac_version != RTL_GIGA_MAC_VER_01) ?
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4158
		~(RxBOVF | RxFOVF) : ~0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4159
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4160
	init_timer(&tp->timer);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4161
	tp->timer.data = (unsigned long) dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4162
	tp->timer.function = rtl8169_phy_timer;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4163
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4164
	tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4165
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4166
	// offer device to EtherCAT master module
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4167
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4168
	tp->ec_watchdog_jiffies = jiffies;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4169
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4170
	if (!tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4171
		rc = register_netdev(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4172
		if (rc < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4173
			goto err_out_msi_4;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4174
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4175
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4176
	pci_set_drvdata(pdev, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4177
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4178
	netif_info(tp, probe, dev, "%s at 0x%lx, %pM, XID %08x IRQ %d\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4179
		   rtl_chip_infos[chipset].name, dev->base_addr, dev->dev_addr,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4180
		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), dev->irq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4181
	if (rtl_chip_infos[chipset].jumbo_max != JUMBO_1K) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4182
		netif_info(tp, probe, dev, "jumbo features [frames: %d bytes, "
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4183
			   "tx checksumming: %s]\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4184
			   rtl_chip_infos[chipset].jumbo_max,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4185
			   rtl_chip_infos[chipset].jumbo_tx_csum ? "ok" : "ko");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4186
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4187
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4188
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4189
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4190
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4191
		rtl8168_driver_start(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4192
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4193
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4194
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4195
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4196
	if (pci_dev_run_wake(pdev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4197
		pm_runtime_put_noidle(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4198
2582
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4199
	if (tp->ecdev) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4200
		rc = ecdev_open(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4201
		if (rc) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4202
			ecdev_withdraw(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4203
			goto err_out_msi_4;
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4204
		}
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4205
	}
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4206
	else {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2405
diff changeset
  4207
		netif_carrier_off(dev);
2405
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4208
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4209
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4210
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4211
	return rc;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4212
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4213
err_out_msi_4:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4214
	rtl_disable_msi(pdev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4215
	iounmap(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4216
err_out_free_res_3:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4217
	pci_release_regions(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4218
err_out_mwi_2:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4219
	pci_clear_mwi(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4220
	pci_disable_device(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4221
err_out_free_dev_1:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4222
	free_netdev(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4223
	goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4224
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4225
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4226
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4227
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4228
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4229
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4230
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4231
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4232
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4233
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4234
		rtl8168_driver_stop(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4235
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4236
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4237
	cancel_delayed_work_sync(&tp->task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4238
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4239
	if (tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4240
		ecdev_close(tp->ecdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4241
		ecdev_withdraw(tp->ecdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4242
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4243
		unregister_netdev(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4244
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4245
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4246
	rtl_release_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4247
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4248
	if (pci_dev_run_wake(pdev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4249
		pm_runtime_get_noresume(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4250
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4251
	/* restore original MAC address */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4252
	rtl_rar_set(tp, dev->perm_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4253
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4254
	rtl_disable_msi(pdev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4255
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4256
	pci_set_drvdata(pdev, NULL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4257
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4258
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4259
static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4260
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4261
	struct rtl_fw *rtl_fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4262
	const char *name;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4263
	int rc = -ENOMEM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4264
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4265
	name = rtl_lookup_firmware_name(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4266
	if (!name)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4267
		goto out_no_firmware;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4268
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4269
	rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4270
	if (!rtl_fw)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4271
		goto err_warn;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4272
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4273
	rc = request_firmware(&rtl_fw->fw, name, &tp->pci_dev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4274
	if (rc < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4275
		goto err_free;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4276
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4277
	rc = rtl_check_firmware(tp, rtl_fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4278
	if (rc < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4279
		goto err_release_firmware;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4280
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4281
	tp->rtl_fw = rtl_fw;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4282
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4283
	return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4284
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4285
err_release_firmware:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4286
	release_firmware(rtl_fw->fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4287
err_free:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4288
	kfree(rtl_fw);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4289
err_warn:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4290
	netif_warn(tp, ifup, tp->dev, "unable to load firmware patch %s (%d)\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4291
		   name, rc);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4292
out_no_firmware:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4293
	tp->rtl_fw = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4294
	goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4295
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4296
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4297
static void rtl_request_firmware(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4298
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4299
	if (IS_ERR(tp->rtl_fw))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4300
		rtl_request_uncached_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4301
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4302
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4303
static int rtl8169_open(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4304
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4305
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4306
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4307
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4308
	int retval = -ENOMEM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4309
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4310
	pm_runtime_get_sync(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4311
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4312
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4313
	 * Rx and Tx desscriptors needs 256 bytes alignment.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4314
	 * dma_alloc_coherent provides more.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4315
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4316
	tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4317
					     &tp->TxPhyAddr, GFP_KERNEL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4318
	if (!tp->TxDescArray)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4319
		goto err_pm_runtime_put;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4320
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4321
	tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4322
					     &tp->RxPhyAddr, GFP_KERNEL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4323
	if (!tp->RxDescArray)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4324
		goto err_free_tx_0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4325
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4326
	retval = rtl8169_init_ring(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4327
	if (retval < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4328
		goto err_free_rx_1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4329
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4330
	INIT_DELAYED_WORK(&tp->task, NULL);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4331
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4332
	smp_mb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4333
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4334
	rtl_request_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4335
	if (!tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4336
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4337
		retval = request_irq(dev->irq, rtl8169_interrupt,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4338
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4339
				dev->name, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4340
		if (retval < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4341
		goto err_release_fw_2;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4342
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4343
		napi_enable(&tp->napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4344
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4345
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4346
	rtl8169_init_phy(dev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4347
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4348
	rtl8169_set_features(dev, dev->features);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4349
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4350
	rtl_pll_power_up(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4351
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4352
	rtl_hw_start(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4353
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4354
	tp->saved_wolopts = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4355
	pm_runtime_put_noidle(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4356
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4357
	rtl8169_check_link_status(dev, tp, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4358
out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4359
	return retval;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4360
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4361
err_release_fw_2:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4362
	rtl_release_firmware(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4363
	rtl8169_rx_clear(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4364
err_free_rx_1:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4365
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4366
			  tp->RxPhyAddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4367
	tp->RxDescArray = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4368
err_free_tx_0:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4369
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4370
			  tp->TxPhyAddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4371
	tp->TxDescArray = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4372
err_pm_runtime_put:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4373
	pm_runtime_put_noidle(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4374
	goto out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4375
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4376
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4377
static void rtl_rx_close(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4378
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4379
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4380
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4381
	RTL_W32(RxConfig, RTL_R32(RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4382
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4383
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4384
static void rtl8169_hw_reset(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4385
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4386
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4387
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4388
	/* Disable interrupts */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4389
	rtl8169_irq_mask_and_ack(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4390
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4391
	rtl_rx_close(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4392
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4393
	if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4394
	    tp->mac_version == RTL_GIGA_MAC_VER_28 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4395
	    tp->mac_version == RTL_GIGA_MAC_VER_31) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4396
		while (RTL_R8(TxPoll) & NPQ)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4397
			udelay(20);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4398
	} else if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4399
	           tp->mac_version == RTL_GIGA_MAC_VER_35 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4400
	           tp->mac_version == RTL_GIGA_MAC_VER_36) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4401
		RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4402
		while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4403
			udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4404
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4405
		RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4406
		udelay(100);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4407
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4408
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4409
	rtl_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4410
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4411
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4412
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4413
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4414
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4415
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4416
	/* Set DMA burst size and Interframe Gap Time */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4417
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4418
		(InterFrameGap << TxInterFrameGapShift));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4419
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4420
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4421
static void rtl_hw_start(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4422
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4423
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4424
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4425
	tp->hw_start(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4426
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4427
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4428
		netif_start_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4429
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4430
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4431
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4432
					 void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4433
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4434
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4435
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4436
	 * register to be written before TxDescAddrLow to work.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4437
	 * Switching from MMIO to I/O access fixes the issue as well.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4438
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4439
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4440
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4441
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4442
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4443
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4444
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4445
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4446
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4447
	u16 cmd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4448
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4449
	cmd = RTL_R16(CPlusCmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4450
	RTL_W16(CPlusCmd, cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4451
	return cmd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4452
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4453
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4454
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4455
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4456
	/* Low hurts. Let's disable the filtering. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4457
	RTL_W16(RxMaxSize, rx_buf_sz + 1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4458
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4459
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4460
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4461
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4462
	static const struct rtl_cfg2_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4463
		u32 mac_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4464
		u32 clk;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4465
		u32 val;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4466
	} cfg2_info [] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4467
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4468
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4469
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4470
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4471
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4472
	const struct rtl_cfg2_info *p = cfg2_info;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4473
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4474
	u32 clk;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4475
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4476
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4477
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4478
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4479
			RTL_W32(0x7c, p->val);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4480
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4481
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4482
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4483
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4484
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4485
static void rtl_hw_start_8169(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4486
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4487
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4488
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4489
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4490
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4491
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4492
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4493
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4494
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4495
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4496
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4497
	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4498
	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4499
	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4500
	    tp->mac_version == RTL_GIGA_MAC_VER_04)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4501
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4502
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4503
	rtl_init_rxcfg(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4504
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4505
	RTL_W8(EarlyTxThres, NoEarlyTx);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4506
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4507
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4508
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4509
	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4510
	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4511
	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4512
	    tp->mac_version == RTL_GIGA_MAC_VER_04)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4513
		rtl_set_rx_tx_config_registers(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4514
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4515
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4516
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4517
	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4518
	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4519
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4520
			"Bit-3 and bit-14 MUST be 1\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4521
		tp->cp_cmd |= (1 << 14);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4522
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4523
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4524
	RTL_W16(CPlusCmd, tp->cp_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4525
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4526
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4527
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4528
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4529
	 * Undocumented corner. Supposedly:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4530
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4531
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4532
	RTL_W16(IntrMitigate, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4533
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4534
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4535
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4536
	if (tp->mac_version != RTL_GIGA_MAC_VER_01 &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4537
	    tp->mac_version != RTL_GIGA_MAC_VER_02 &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4538
	    tp->mac_version != RTL_GIGA_MAC_VER_03 &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4539
	    tp->mac_version != RTL_GIGA_MAC_VER_04) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4540
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4541
		rtl_set_rx_tx_config_registers(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4542
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4543
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4544
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4545
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4546
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4547
	RTL_R8(IntrMask);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4548
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4549
	RTL_W32(RxMissed, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4550
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4551
	rtl_set_rx_mode(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4552
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4553
	/* no early-rx interrupts */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4554
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4555
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4556
	/* Enable all known interrupts by setting the interrupt mask. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4557
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4558
		RTL_W16(IntrMask, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4559
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4560
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4561
static void rtl_csi_access_enable(void __iomem *ioaddr, u32 bits)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4562
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4563
	u32 csi;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4564
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4565
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4566
	rtl_csi_write(ioaddr, 0x070c, csi | bits);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4567
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4568
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4569
static void rtl_csi_access_enable_1(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4570
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4571
	rtl_csi_access_enable(ioaddr, 0x17000000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4572
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4573
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4574
static void rtl_csi_access_enable_2(void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4575
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4576
	rtl_csi_access_enable(ioaddr, 0x27000000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4577
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4578
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4579
struct ephy_info {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4580
	unsigned int offset;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4581
	u16 mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4582
	u16 bits;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4583
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4584
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4585
static void rtl_ephy_init(void __iomem *ioaddr, const struct ephy_info *e, int len)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4586
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4587
	u16 w;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4588
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4589
	while (len-- > 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4590
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4591
		rtl_ephy_write(ioaddr, e->offset, w);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4592
		e++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4593
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4594
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4595
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4596
static void rtl_disable_clock_request(struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4597
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4598
	int cap = pci_pcie_cap(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4599
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4600
	if (cap) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4601
		u16 ctl;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4602
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4603
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4604
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4605
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4606
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4607
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4608
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4609
static void rtl_enable_clock_request(struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4610
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4611
	int cap = pci_pcie_cap(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4612
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4613
	if (cap) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4614
		u16 ctl;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4615
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4616
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4617
		ctl |= PCI_EXP_LNKCTL_CLKREQ_EN;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4618
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4619
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4620
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4621
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4622
#define R8168_CPCMD_QUIRK_MASK (\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4623
	EnableBist | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4624
	Mac_dbgo_oe | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4625
	Force_half_dup | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4626
	Force_rxflow_en | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4627
	Force_txflow_en | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4628
	Cxpl_dbg_sel | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4629
	ASF | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4630
	PktCntrDisable | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4631
	Mac_dbgo_sel)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4632
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4633
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4634
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4635
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4636
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4637
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4638
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4639
	rtl_tx_performance_tweak(pdev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4640
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4641
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4642
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4643
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4644
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4645
	rtl_hw_start_8168bb(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4646
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4647
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4648
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4649
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4650
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4651
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4652
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4653
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4654
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4655
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4656
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4657
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4658
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4659
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4660
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4661
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4662
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4663
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4664
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4665
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4666
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4667
	static const struct ephy_info e_info_8168cp[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4668
		{ 0x01, 0,	0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4669
		{ 0x02, 0x0800,	0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4670
		{ 0x03, 0,	0x0042 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4671
		{ 0x06, 0x0080,	0x0000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4672
		{ 0x07, 0,	0x2000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4673
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4674
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4675
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4676
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4677
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4678
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4679
	__rtl_hw_start_8168cp(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4680
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4681
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4682
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4683
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4684
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4685
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4686
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4687
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4688
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4689
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4690
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4691
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4692
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4693
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4694
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4695
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4696
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4697
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4698
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4699
	/* Magic. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4700
	RTL_W8(DBG_REG, 0x20);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4701
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4702
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4703
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4704
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4705
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4706
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4707
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4708
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4709
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4710
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4711
	static const struct ephy_info e_info_8168c_1[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4712
		{ 0x02, 0x0800,	0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4713
		{ 0x03, 0,	0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4714
		{ 0x06, 0x0080,	0x0000 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4715
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4716
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4717
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4718
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4719
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4720
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4721
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4722
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4723
	__rtl_hw_start_8168cp(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4724
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4725
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4726
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4727
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4728
	static const struct ephy_info e_info_8168c_2[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4729
		{ 0x01, 0,	0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4730
		{ 0x03, 0x0400,	0x0220 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4731
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4732
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4733
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4734
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4735
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4736
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4737
	__rtl_hw_start_8168cp(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4738
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4739
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4740
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4741
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4742
	rtl_hw_start_8168c_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4743
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4744
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4745
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4746
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4747
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4748
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4749
	__rtl_hw_start_8168cp(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4750
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4751
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4752
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4753
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4754
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4755
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4756
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4757
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4758
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4759
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4760
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4761
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4762
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4763
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4764
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4765
static void rtl_hw_start_8168dp(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4766
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4767
	rtl_csi_access_enable_1(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4768
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4769
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4770
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4771
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4772
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4773
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4774
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4775
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4776
static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4777
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4778
	static const struct ephy_info e_info_8168d_4[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4779
		{ 0x0b, ~0,	0x48 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4780
		{ 0x19, 0x20,	0x50 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4781
		{ 0x0c, ~0,	0x20 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4782
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4783
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4784
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4785
	rtl_csi_access_enable_1(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4786
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4787
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4788
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4789
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4790
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4791
	for (i = 0; i < ARRAY_SIZE(e_info_8168d_4); i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4792
		const struct ephy_info *e = e_info_8168d_4 + i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4793
		u16 w;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4794
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4795
		w = rtl_ephy_read(ioaddr, e->offset);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4796
		rtl_ephy_write(ioaddr, 0x03, (w & e->mask) | e->bits);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4797
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4798
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4799
	rtl_enable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4800
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4801
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4802
static void rtl_hw_start_8168e_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4803
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4804
	static const struct ephy_info e_info_8168e_1[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4805
		{ 0x00, 0x0200,	0x0100 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4806
		{ 0x00, 0x0000,	0x0004 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4807
		{ 0x06, 0x0002,	0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4808
		{ 0x06, 0x0000,	0x0030 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4809
		{ 0x07, 0x0000,	0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4810
		{ 0x00, 0x0000,	0x0020 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4811
		{ 0x03, 0x5800,	0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4812
		{ 0x03, 0x0000,	0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4813
		{ 0x01, 0x0800,	0x1000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4814
		{ 0x07, 0x0000,	0x4000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4815
		{ 0x1e, 0x0000,	0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4816
		{ 0x19, 0xffff,	0xfe6c },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4817
		{ 0x0a, 0x0000,	0x0040 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4818
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4819
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4820
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4821
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4822
	rtl_ephy_init(ioaddr, e_info_8168e_1, ARRAY_SIZE(e_info_8168e_1));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4823
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4824
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4825
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4826
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4827
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4828
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4829
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4830
	/* Reset tx FIFO pointer */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4831
	RTL_W32(MISC, RTL_R32(MISC) | TXPLA_RST);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4832
	RTL_W32(MISC, RTL_R32(MISC) & ~TXPLA_RST);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4833
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4834
	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4835
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4836
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4837
static void rtl_hw_start_8168e_2(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4838
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4839
	static const struct ephy_info e_info_8168e_2[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4840
		{ 0x09, 0x0000,	0x0080 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4841
		{ 0x19, 0x0000,	0x0224 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4842
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4843
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4844
	rtl_csi_access_enable_1(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4845
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4846
	rtl_ephy_init(ioaddr, e_info_8168e_2, ARRAY_SIZE(e_info_8168e_2));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4847
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4848
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4849
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4850
	rtl_eri_write(ioaddr, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4851
	rtl_eri_write(ioaddr, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4852
	rtl_eri_write(ioaddr, 0xc8, ERIAR_MASK_1111, 0x00100002, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4853
	rtl_eri_write(ioaddr, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4854
	rtl_eri_write(ioaddr, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4855
	rtl_eri_write(ioaddr, 0xd0, ERIAR_MASK_1111, 0x07ff0060, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4856
	rtl_w1w0_eri(ioaddr, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4857
	rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4858
		     ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4859
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4860
	RTL_W8(MaxTxPacketSize, EarlySize);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4861
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4862
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4863
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4864
	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4865
	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4866
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4867
	/* Adjust EEE LED frequency */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4868
	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4869
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4870
	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4871
	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4872
	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4873
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4874
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4875
static void rtl_hw_start_8168f_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4876
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4877
	static const struct ephy_info e_info_8168f_1[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4878
		{ 0x06, 0x00c0,	0x0020 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4879
		{ 0x08, 0x0001,	0x0002 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4880
		{ 0x09, 0x0000,	0x0080 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4881
		{ 0x19, 0x0000,	0x0224 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4882
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4883
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4884
	rtl_csi_access_enable_1(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4885
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4886
	rtl_ephy_init(ioaddr, e_info_8168f_1, ARRAY_SIZE(e_info_8168f_1));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4887
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4888
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4889
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4890
	rtl_eri_write(ioaddr, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4891
	rtl_eri_write(ioaddr, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4892
	rtl_eri_write(ioaddr, 0xc8, ERIAR_MASK_1111, 0x00100002, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4893
	rtl_eri_write(ioaddr, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4894
	rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x00, 0x01, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4895
	rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4896
	rtl_w1w0_eri(ioaddr, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4897
	rtl_w1w0_eri(ioaddr, 0x1d0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4898
	rtl_eri_write(ioaddr, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4899
	rtl_eri_write(ioaddr, 0xd0, ERIAR_MASK_1111, 0x00000060, ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4900
	rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4901
		     ERIAR_EXGMAC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4902
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4903
	RTL_W8(MaxTxPacketSize, EarlySize);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4904
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4905
	rtl_disable_clock_request(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4906
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4907
	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4908
	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4909
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4910
	/* Adjust EEE LED frequency */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4911
	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4912
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4913
	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4914
	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4915
	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4916
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4917
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4918
static void rtl_hw_start_8168(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4919
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4920
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4921
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4922
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4923
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4924
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4925
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4926
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4927
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4928
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4929
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4930
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4931
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4932
	RTL_W16(CPlusCmd, tp->cp_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4933
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4934
	RTL_W16(IntrMitigate, 0x5151);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4935
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4936
	/* Work around for RxFIFO overflow. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4937
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4938
		tp->intr_event |= RxFIFOOver | PCSTimeout;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4939
		tp->intr_event &= ~RxOverflow;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4940
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4941
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4942
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4943
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4944
	rtl_set_rx_mode(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4945
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4946
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4947
		(InterFrameGap << TxInterFrameGapShift));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4948
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4949
	RTL_R8(IntrMask);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4950
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4951
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4952
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4953
		rtl_hw_start_8168bb(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4954
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4955
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4956
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4957
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4958
		rtl_hw_start_8168bef(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4959
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4960
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4961
	case RTL_GIGA_MAC_VER_18:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4962
		rtl_hw_start_8168cp_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4963
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4964
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4965
	case RTL_GIGA_MAC_VER_19:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4966
		rtl_hw_start_8168c_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4967
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4968
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4969
	case RTL_GIGA_MAC_VER_20:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4970
		rtl_hw_start_8168c_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4971
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4972
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4973
	case RTL_GIGA_MAC_VER_21:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4974
		rtl_hw_start_8168c_3(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4975
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4976
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4977
	case RTL_GIGA_MAC_VER_22:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4978
		rtl_hw_start_8168c_4(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4979
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4980
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4981
	case RTL_GIGA_MAC_VER_23:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4982
		rtl_hw_start_8168cp_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4983
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4984
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4985
	case RTL_GIGA_MAC_VER_24:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4986
		rtl_hw_start_8168cp_3(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4987
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4988
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4989
	case RTL_GIGA_MAC_VER_25:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4990
	case RTL_GIGA_MAC_VER_26:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4991
	case RTL_GIGA_MAC_VER_27:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4992
		rtl_hw_start_8168d(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4993
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4994
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4995
	case RTL_GIGA_MAC_VER_28:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4996
		rtl_hw_start_8168d_4(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4997
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4998
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4999
	case RTL_GIGA_MAC_VER_31:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5000
		rtl_hw_start_8168dp(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5001
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5002
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5003
	case RTL_GIGA_MAC_VER_32:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5004
	case RTL_GIGA_MAC_VER_33:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5005
		rtl_hw_start_8168e_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5006
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5007
	case RTL_GIGA_MAC_VER_34:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5008
		rtl_hw_start_8168e_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5009
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5010
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5011
	case RTL_GIGA_MAC_VER_35:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5012
	case RTL_GIGA_MAC_VER_36:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5013
		rtl_hw_start_8168f_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5014
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5015
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5016
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5017
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5018
			dev->name, tp->mac_version);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5019
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5020
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5021
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5022
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5023
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5024
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5025
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5026
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5027
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5028
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5029
		RTL_W16(IntrMask, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5030
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5031
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5032
#define R810X_CPCMD_QUIRK_MASK (\
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5033
	EnableBist | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5034
	Mac_dbgo_oe | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5035
	Force_half_dup | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5036
	Force_rxflow_en | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5037
	Force_txflow_en | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5038
	Cxpl_dbg_sel | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5039
	ASF | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5040
	PktCntrDisable | \
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5041
	Mac_dbgo_sel)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5042
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5043
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5044
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5045
	static const struct ephy_info e_info_8102e_1[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5046
		{ 0x01,	0, 0x6e65 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5047
		{ 0x02,	0, 0x091f },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5048
		{ 0x03,	0, 0xc2f9 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5049
		{ 0x06,	0, 0xafb5 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5050
		{ 0x07,	0, 0x0e00 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5051
		{ 0x19,	0, 0xec80 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5052
		{ 0x01,	0, 0x2e65 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5053
		{ 0x01,	0, 0x6e65 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5054
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5055
	u8 cfg1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5056
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5057
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5058
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5059
	RTL_W8(DBG_REG, FIX_NAK_1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5060
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5061
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5062
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5063
	RTL_W8(Config1,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5064
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5065
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5066
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5067
	cfg1 = RTL_R8(Config1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5068
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5069
		RTL_W8(Config1, cfg1 & ~LEDS0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5070
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5071
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5072
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5073
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5074
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5075
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5076
	rtl_csi_access_enable_2(ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5077
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5078
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5079
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5080
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5081
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5082
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5083
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5084
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5085
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5086
	rtl_hw_start_8102e_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5087
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5088
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5089
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5090
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5091
static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5092
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5093
	static const struct ephy_info e_info_8105e_1[] = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5094
		{ 0x07,	0, 0x4000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5095
		{ 0x19,	0, 0x0200 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5096
		{ 0x19,	0, 0x0020 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5097
		{ 0x1e,	0, 0x2000 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5098
		{ 0x03,	0, 0x0001 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5099
		{ 0x19,	0, 0x0100 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5100
		{ 0x19,	0, 0x0004 },
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5101
		{ 0x0a,	0, 0x0020 }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5102
	};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5103
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5104
	/* Force LAN exit from ASPM if Rx/Tx are not idle */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5105
	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5106
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5107
	/* Disable Early Tally Counter */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5108
	RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5109
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5110
	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5111
	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5112
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5113
	rtl_ephy_init(ioaddr, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5114
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5115
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5116
static void rtl_hw_start_8105e_2(void __iomem *ioaddr, struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5117
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5118
	rtl_hw_start_8105e_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5119
	rtl_ephy_write(ioaddr, 0x1e, rtl_ephy_read(ioaddr, 0x1e) | 0x8000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5120
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5121
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5122
static void rtl_hw_start_8101(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5123
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5124
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5125
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5126
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5127
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5128
	if (tp->mac_version >= RTL_GIGA_MAC_VER_30) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5129
		tp->intr_event &= ~RxFIFOOver;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5130
		tp->napi_event &= ~RxFIFOOver;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5131
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5132
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5133
	if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5134
	    tp->mac_version == RTL_GIGA_MAC_VER_16) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5135
		int cap = pci_pcie_cap(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5136
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5137
		if (cap) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5138
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5139
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5140
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5141
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5142
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5143
	RTL_W8(Cfg9346, Cfg9346_Unlock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5144
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5145
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5146
	case RTL_GIGA_MAC_VER_07:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5147
		rtl_hw_start_8102e_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5148
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5149
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5150
	case RTL_GIGA_MAC_VER_08:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5151
		rtl_hw_start_8102e_3(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5152
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5153
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5154
	case RTL_GIGA_MAC_VER_09:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5155
		rtl_hw_start_8102e_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5156
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5157
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5158
	case RTL_GIGA_MAC_VER_29:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5159
		rtl_hw_start_8105e_1(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5160
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5161
	case RTL_GIGA_MAC_VER_30:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5162
		rtl_hw_start_8105e_2(ioaddr, pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5163
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5164
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5165
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5166
	RTL_W8(Cfg9346, Cfg9346_Lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5167
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5168
	RTL_W8(MaxTxPacketSize, TxPacketMax);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5169
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5170
	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5171
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5172
	tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5173
	RTL_W16(CPlusCmd, tp->cp_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5174
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5175
	RTL_W16(IntrMitigate, 0x0000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5176
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5177
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5178
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5179
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5180
	rtl_set_rx_tx_config_registers(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5181
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5182
	RTL_R8(IntrMask);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5183
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5184
	rtl_set_rx_mode(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5185
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5186
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5187
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5188
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5189
		RTL_W16(IntrMask, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5190
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5191
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5192
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5193
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5194
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5195
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5196
	if (new_mtu < ETH_ZLEN ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5197
	    new_mtu > rtl_chip_infos[tp->mac_version].jumbo_max)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5198
		return -EINVAL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5199
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5200
	if (new_mtu > ETH_DATA_LEN)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5201
		rtl_hw_jumbo_enable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5202
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5203
		rtl_hw_jumbo_disable(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5204
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5205
	dev->mtu = new_mtu;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5206
	netdev_update_features(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5207
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5208
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5209
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5210
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5211
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5212
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5213
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5214
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5215
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5216
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5217
static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5218
				     void **data_buff, struct RxDesc *desc)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5219
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5220
	dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5221
			 DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5222
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5223
	kfree(*data_buff);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5224
	*data_buff = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5225
	rtl8169_make_unusable_by_asic(desc);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5226
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5227
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5228
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5229
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5230
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5231
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5232
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5233
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5234
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5235
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5236
				       u32 rx_buf_sz)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5237
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5238
	desc->addr = cpu_to_le64(mapping);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5239
	wmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5240
	rtl8169_mark_to_asic(desc, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5241
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5242
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5243
static inline void *rtl8169_align(void *data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5244
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5245
	return (void *)ALIGN((long)data, 16);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5246
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5247
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5248
static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5249
					     struct RxDesc *desc)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5250
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5251
	void *data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5252
	dma_addr_t mapping;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5253
	struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5254
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5255
	int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5256
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5257
	data = kmalloc_node(rx_buf_sz, GFP_KERNEL, node);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5258
	if (!data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5259
		return NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5260
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5261
	if (rtl8169_align(data) != data) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5262
		kfree(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5263
		data = kmalloc_node(rx_buf_sz + 15, GFP_KERNEL, node);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5264
		if (!data)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5265
			return NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5266
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5267
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5268
	mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5269
				 DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5270
	if (unlikely(dma_mapping_error(d, mapping))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5271
		if (net_ratelimit())
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5272
			netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5273
		goto err_out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5274
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5275
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5276
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5277
	return data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5278
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5279
err_out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5280
	kfree(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5281
	return NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5282
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5283
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5284
static void rtl8169_rx_clear(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5285
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5286
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5287
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5288
	for (i = 0; i < NUM_RX_DESC; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5289
		if (tp->Rx_databuff[i]) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5290
			rtl8169_free_rx_databuff(tp, tp->Rx_databuff + i,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5291
					    tp->RxDescArray + i);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5292
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5293
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5294
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5295
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5296
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5297
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5298
	desc->opts1 |= cpu_to_le32(RingEnd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5299
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5300
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5301
static int rtl8169_rx_fill(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5302
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5303
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5304
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5305
	for (i = 0; i < NUM_RX_DESC; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5306
		void *data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5307
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5308
		if (tp->Rx_databuff[i])
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5309
			continue;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5310
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5311
		data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5312
		if (!data) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5313
			rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5314
			goto err_out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5315
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5316
		tp->Rx_databuff[i] = data;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5317
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5318
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5319
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5320
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5321
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5322
err_out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5323
	rtl8169_rx_clear(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5324
	return -ENOMEM;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5325
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5326
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5327
static int rtl8169_init_ring(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5328
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5329
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5330
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5331
	rtl8169_init_ring_indexes(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5332
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5333
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5334
	memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5335
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5336
	return rtl8169_rx_fill(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5337
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5338
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5339
static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5340
				 struct TxDesc *desc)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5341
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5342
	unsigned int len = tx_skb->len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5343
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5344
	dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5345
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5346
	desc->opts1 = 0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5347
	desc->opts2 = 0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5348
	desc->addr = 0x00;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5349
	tx_skb->len = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5350
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5351
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5352
static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5353
				   unsigned int n)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5354
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5355
	unsigned int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5356
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5357
	for (i = 0; i < n; i++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5358
		unsigned int entry = (start + i) % NUM_TX_DESC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5359
		struct ring_info *tx_skb = tp->tx_skb + entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5360
		unsigned int len = tx_skb->len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5361
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5362
		if (len) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5363
			struct sk_buff *skb = tx_skb->skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5364
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5365
			rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5366
					     tp->TxDescArray + entry);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5367
			if (skb) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5368
				tp->dev->stats.tx_dropped++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5369
				if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5370
					dev_kfree_skb(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5371
				tx_skb->skb = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5372
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5373
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5374
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5375
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5376
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5377
static void rtl8169_tx_clear(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5378
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5379
	rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5380
	tp->cur_tx = tp->dirty_tx = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5381
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5382
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5383
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5384
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5385
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5386
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5387
	PREPARE_DELAYED_WORK(&tp->task, task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5388
	schedule_delayed_work(&tp->task, 4);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5389
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5390
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5391
static void rtl8169_wait_for_quiescence(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5392
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5393
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5394
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5395
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5396
	synchronize_irq(dev->irq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5397
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5398
	/* Wait for any pending NAPI task to complete */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5399
	napi_disable(&tp->napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5400
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5401
	rtl8169_irq_mask_and_ack(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5402
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5403
	tp->intr_mask = 0xffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5404
	RTL_W16(IntrMask, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5405
	napi_enable(&tp->napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5406
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5407
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5408
static void rtl8169_reinit_task(struct work_struct *work)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5409
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5410
	struct rtl8169_private *tp =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5411
		container_of(work, struct rtl8169_private, task.work);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5412
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5413
	int ret;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5414
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5415
	rtnl_lock();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5416
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5417
	if (!netif_running(dev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5418
		goto out_unlock;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5419
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5420
	rtl8169_wait_for_quiescence(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5421
	rtl8169_close(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5422
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5423
	ret = rtl8169_open(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5424
	if (unlikely(ret < 0)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5425
		if (net_ratelimit())
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5426
			netif_err(tp, drv, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5427
				  "reinit failure (status = %d). Rescheduling\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5428
				  ret);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5429
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5430
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5431
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5432
out_unlock:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5433
	rtnl_unlock();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5434
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5435
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5436
static void rtl8169_reset_task(struct work_struct *work)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5437
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5438
	struct rtl8169_private *tp =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5439
		container_of(work, struct rtl8169_private, task.work);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5440
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5441
	int i;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5442
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5443
	rtnl_lock();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5444
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5445
	if (!netif_running(dev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5446
		goto out_unlock;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5447
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5448
	rtl8169_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5449
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5450
	rtl8169_wait_for_quiescence(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5451
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5452
	for (i = 0; i < NUM_RX_DESC; i++)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5453
		rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5454
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5455
	rtl8169_tx_clear(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5456
	rtl8169_init_ring_indexes(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5457
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5458
	rtl_hw_start(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5459
	netif_wake_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5460
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5461
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5462
out_unlock:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5463
	rtnl_unlock();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5464
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5465
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5466
static void rtl8169_tx_timeout(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5467
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5468
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5469
	if (tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5470
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5471
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5472
	rtl8169_schedule_work(dev, rtl8169_reset_task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5473
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5474
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5475
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5476
			      u32 *opts)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5477
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5478
	struct skb_shared_info *info = skb_shinfo(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5479
	unsigned int cur_frag, entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5480
	struct TxDesc * uninitialized_var(txd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5481
	struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5482
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5483
	entry = tp->cur_tx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5484
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5485
		const skb_frag_t *frag = info->frags + cur_frag;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5486
		dma_addr_t mapping;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5487
		u32 status, len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5488
		void *addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5489
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5490
		entry = (entry + 1) % NUM_TX_DESC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5491
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5492
		txd = tp->TxDescArray + entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5493
		len = skb_frag_size(frag);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5494
		addr = skb_frag_address(frag);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5495
		mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5496
		if (unlikely(dma_mapping_error(d, mapping))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5497
			if (net_ratelimit())
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5498
				netif_err(tp, drv, tp->dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5499
					  "Failed to map TX fragments DMA!\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5500
			goto err_out;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5501
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5502
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5503
		/* Anti gcc 2.95.3 bugware (sic) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5504
		status = opts[0] | len |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5505
			(RingEnd * !((entry + 1) % NUM_TX_DESC));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5506
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5507
		txd->opts1 = cpu_to_le32(status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5508
		txd->opts2 = cpu_to_le32(opts[1]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5509
		txd->addr = cpu_to_le64(mapping);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5510
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5511
		tp->tx_skb[entry].len = len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5512
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5513
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5514
	if (cur_frag) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5515
		tp->tx_skb[entry].skb = skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5516
		txd->opts1 |= cpu_to_le32(LastFrag);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5517
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5518
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5519
	return cur_frag;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5520
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5521
err_out:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5522
	rtl8169_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5523
	return -EIO;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5524
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5525
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5526
static inline void rtl8169_tso_csum(struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5527
				    struct sk_buff *skb, u32 *opts)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5528
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5529
	const struct rtl_tx_desc_info *info = tx_desc_info + tp->txd_version;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5530
	u32 mss = skb_shinfo(skb)->gso_size;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5531
	int offset = info->opts_offset;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5532
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5533
	if (mss) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5534
		opts[0] |= TD_LSO;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5535
		opts[offset] |= min(mss, TD_MSS_MAX) << info->mss_shift;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5536
	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5537
		const struct iphdr *ip = ip_hdr(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5538
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5539
		if (ip->protocol == IPPROTO_TCP)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5540
			opts[offset] |= info->checksum.tcp;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5541
		else if (ip->protocol == IPPROTO_UDP)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5542
			opts[offset] |= info->checksum.udp;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5543
		else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5544
			WARN_ON_ONCE(1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5545
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5546
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5547
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5548
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5549
				      struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5550
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5551
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5552
	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5553
	struct TxDesc *txd = tp->TxDescArray + entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5554
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5555
	struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5556
	dma_addr_t mapping;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5557
	u32 status, len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5558
	u32 opts[2];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5559
	int frags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5560
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5561
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5562
		netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5563
		goto err_stop_0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5564
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5565
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5566
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5567
		goto err_stop_0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5568
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5569
	len = skb_headlen(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5570
	mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5571
	if (unlikely(dma_mapping_error(d, mapping))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5572
		if (net_ratelimit())
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5573
			netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5574
		goto err_dma_0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5575
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5576
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5577
	tp->tx_skb[entry].len = len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5578
	txd->addr = cpu_to_le64(mapping);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5579
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5580
	opts[1] = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5581
	opts[0] = DescOwn;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5582
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5583
	rtl8169_tso_csum(tp, skb, opts);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5584
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5585
	frags = rtl8169_xmit_frags(tp, skb, opts);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5586
	if (frags < 0)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5587
		goto err_dma_1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5588
	else if (frags)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5589
		opts[0] |= FirstFrag;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5590
	else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5591
		opts[0] |= FirstFrag | LastFrag;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5592
		tp->tx_skb[entry].skb = skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5593
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5594
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5595
	txd->opts2 = cpu_to_le32(opts[1]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5596
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5597
	wmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5598
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5599
	/* Anti gcc 2.95.3 bugware (sic) */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5600
	status = opts[0] | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5601
	txd->opts1 = cpu_to_le32(status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5602
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5603
	tp->cur_tx += frags + 1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5604
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5605
	wmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5606
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5607
	RTL_W8(TxPoll, NPQ);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5608
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5609
	if (!tp->ecdev && TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5610
		netif_stop_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5611
		smp_rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5612
		if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5613
			netif_wake_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5614
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5615
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5616
	return NETDEV_TX_OK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5617
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5618
err_dma_1:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5619
	rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5620
err_dma_0:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5621
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5622
	  dev_kfree_skb(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5623
	dev->stats.tx_dropped++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5624
	return NETDEV_TX_OK;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5625
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5626
err_stop_0:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5627
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5628
		netif_stop_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5629
	dev->stats.tx_dropped++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5630
	return NETDEV_TX_BUSY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5631
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5632
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5633
static void rtl8169_pcierr_interrupt(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5634
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5635
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5636
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5637
	u16 pci_status, pci_cmd;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5638
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5639
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5640
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5641
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5642
	netif_err(tp, intr, dev, "PCI error (cmd = 0x%04x, status = 0x%04x)\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5643
		  pci_cmd, pci_status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5644
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5645
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5646
	 * The recovery sequence below admits a very elaborated explanation:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5647
	 * - it seems to work;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5648
	 * - I did not see what else could be done;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5649
	 * - it makes iop3xx happy.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5650
	 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5651
	 * Feel free to adjust to your needs.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5652
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5653
	if (pdev->broken_parity_status)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5654
		pci_cmd &= ~PCI_COMMAND_PARITY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5655
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5656
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5657
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5658
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5659
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5660
	pci_write_config_word(pdev, PCI_STATUS,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5661
		pci_status & (PCI_STATUS_DETECTED_PARITY |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5662
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5663
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5664
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5665
	/* The infamous DAC f*ckup only happens at boot time */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5666
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5667
		void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5668
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5669
		netif_info(tp, intr, dev, "disabling PCI DAC\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5670
		tp->cp_cmd &= ~PCIDAC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5671
		RTL_W16(CPlusCmd, tp->cp_cmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5672
		dev->features &= ~NETIF_F_HIGHDMA;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5673
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5674
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5675
	rtl8169_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5676
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5677
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5678
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5679
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5680
static void rtl8169_tx_interrupt(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5681
				 struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5682
				 void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5683
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5684
	unsigned int dirty_tx, tx_left;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5685
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5686
	dirty_tx = tp->dirty_tx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5687
	smp_rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5688
	tx_left = tp->cur_tx - dirty_tx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5689
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5690
	while (tx_left > 0) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5691
		unsigned int entry = dirty_tx % NUM_TX_DESC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5692
		struct ring_info *tx_skb = tp->tx_skb + entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5693
		u32 status;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5694
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5695
		rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5696
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5697
		if (status & DescOwn)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5698
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5699
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5700
		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5701
				     tp->TxDescArray + entry);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5702
		if (status & LastFrag) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5703
			dev->stats.tx_packets++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5704
			dev->stats.tx_bytes += tx_skb->skb->len;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5705
			if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5706
				dev_kfree_skb(tx_skb->skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5707
			tx_skb->skb = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5708
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5709
		dirty_tx++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5710
		tx_left--;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5711
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5712
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5713
	if (tp->dirty_tx != dirty_tx) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5714
		tp->dirty_tx = dirty_tx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5715
		smp_wmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5716
		if (!tp->ecdev && netif_queue_stopped(dev) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5717
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5718
			netif_wake_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5719
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5720
		/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5721
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5722
		 * too close. Let's kick an extra TxPoll request when a burst
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5723
		 * of start_xmit activity is detected (if it is not detected,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5724
		 * it is slow enough). -- FR
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5725
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5726
		smp_rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5727
		if (tp->cur_tx != dirty_tx)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5728
			RTL_W8(TxPoll, NPQ);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5729
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5730
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5731
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5732
static inline int rtl8169_fragmented_frame(u32 status)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5733
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5734
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5735
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5736
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5737
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5738
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5739
	u32 status = opts1 & RxProtoMask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5740
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5741
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5742
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5743
		skb->ip_summed = CHECKSUM_UNNECESSARY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5744
	else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5745
		skb_checksum_none_assert(skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5746
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5747
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5748
static struct sk_buff *rtl8169_try_rx_copy(void *data,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5749
					   struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5750
					   int pkt_size,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5751
					   dma_addr_t addr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5752
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5753
	struct sk_buff *skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5754
	struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5755
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5756
	data = rtl8169_align(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5757
	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5758
	prefetch(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5759
	skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5760
	if (skb)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5761
		memcpy(skb->data, data, pkt_size);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5762
	dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5763
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5764
	return skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5765
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5766
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5767
static int rtl8169_rx_interrupt(struct net_device *dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5768
				struct rtl8169_private *tp,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5769
				void __iomem *ioaddr, u32 budget)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5770
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5771
	unsigned int cur_rx, rx_left;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5772
	unsigned int count;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5773
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5774
	cur_rx = tp->cur_rx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5775
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5776
	rx_left = min(rx_left, budget);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5777
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5778
	for (; rx_left > 0; rx_left--, cur_rx++) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5779
		unsigned int entry = cur_rx % NUM_RX_DESC;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5780
		struct RxDesc *desc = tp->RxDescArray + entry;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5781
		u32 status;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5782
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5783
		rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5784
		status = le32_to_cpu(desc->opts1) & tp->opts1_mask;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5785
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5786
		if (status & DescOwn)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5787
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5788
		if (unlikely(status & RxRES)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5789
			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5790
				   status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5791
			dev->stats.rx_errors++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5792
			if (status & (RxRWT | RxRUNT))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5793
				dev->stats.rx_length_errors++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5794
			if (status & RxCRC)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5795
				dev->stats.rx_crc_errors++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5796
			if (status & RxFOVF) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5797
				if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5798
					rtl8169_schedule_work(dev, rtl8169_reset_task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5799
				dev->stats.rx_fifo_errors++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5800
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5801
			rtl8169_mark_to_asic(desc, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5802
		} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5803
			struct sk_buff *skb;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5804
			dma_addr_t addr = le64_to_cpu(desc->addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5805
			int pkt_size = (status & 0x00003fff) - 4;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5806
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5807
			/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5808
			 * The driver does not support incoming fragmented
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5809
			 * frames. They are seen as a symptom of over-mtu
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5810
			 * sized frames.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5811
			 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5812
			if (unlikely(rtl8169_fragmented_frame(status))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5813
				dev->stats.rx_dropped++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5814
				dev->stats.rx_length_errors++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5815
				rtl8169_mark_to_asic(desc, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5816
				continue;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5817
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5818
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5819
			if (tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5820
			    struct device *d = &tp->pci_dev->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5821
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5822
			    /* reusing parts of rtl8169_try_rx_copy() */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5823
			    tp->Rx_databuff[entry] = rtl8169_align(tp->Rx_databuff[entry]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5824
			    dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5825
			    prefetch(tp->Rx_databuff[entry]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5826
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5827
			    ecdev_receive(tp->ecdev, tp->Rx_databuff[entry], pkt_size);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5828
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5829
			    dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5830
			    rtl8169_mark_to_asic(desc, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5831
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5832
			    rtl8169_rx_csum(tp->Rx_databuff[entry], status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5833
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5834
			    // No need to detect link status as
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5835
			    // long as frames are received: Reset watchdog.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5836
			    tp->ec_watchdog_jiffies = jiffies;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5837
			} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5838
			    skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5839
						      tp, pkt_size, addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5840
			    rtl8169_mark_to_asic(desc, rx_buf_sz);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5841
			    if (!skb) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5842
				    dev->stats.rx_dropped++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5843
				    continue;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5844
			    }
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5845
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5846
			    rtl8169_rx_csum(skb, status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5847
			    skb_put(skb, pkt_size);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5848
			    skb->protocol = eth_type_trans(skb, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5849
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5850
			    rtl8169_rx_vlan_tag(desc, skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5851
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5852
			    napi_gro_receive(&tp->napi, skb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5853
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5854
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5855
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5856
			dev->stats.rx_bytes += pkt_size;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5857
			dev->stats.rx_packets++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5858
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5859
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5860
		/* Work around for AMD plateform. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5861
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5862
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5863
			desc->opts2 = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5864
			cur_rx++;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5865
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5866
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5867
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5868
	count = cur_rx - tp->cur_rx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5869
	tp->cur_rx = cur_rx;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5870
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5871
	tp->dirty_rx += count;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5872
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5873
	return count;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5874
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5875
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5876
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5877
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5878
	struct net_device *dev = dev_instance;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5879
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5880
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5881
	int handled = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5882
	int status;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5883
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5884
	/* loop handling interrupts until we have no new ones or
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5885
	 * we hit a invalid/hotplug case.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5886
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5887
	status = RTL_R16(IntrStatus);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5888
	while (status && status != 0xffff) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5889
		status &= tp->intr_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5890
		if (!status)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5891
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5892
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5893
		handled = 1;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5894
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5895
		/* Handle all of the error cases first. These will reset
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5896
		 * the chip, so just exit the loop.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5897
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5898
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5899
			rtl8169_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5900
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5901
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5902
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5903
		if (unlikely(!tp->ecdev && (status & RxFIFOOver))) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5904
			switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5905
			/* Work around for rx fifo overflow */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5906
			case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5907
				netif_stop_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5908
				rtl8169_tx_timeout(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5909
				goto done;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5910
			default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5911
				break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5912
			}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5913
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5914
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5915
		if (unlikely(status & SYSErr)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5916
			rtl8169_pcierr_interrupt(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5917
			break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5918
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5919
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5920
		if (status & LinkChg)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5921
			__rtl8169_check_link_status(dev, tp, ioaddr, true);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5922
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5923
		/* We need to see the lastest version of tp->intr_mask to
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5924
		 * avoid ignoring an MSI interrupt and having to wait for
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5925
		 * another event which may never come.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5926
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5927
		smp_rmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5928
		if (status & tp->intr_mask & tp->napi_event) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5929
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5930
			tp->intr_mask = ~tp->napi_event;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5931
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5932
			if (likely(napi_schedule_prep(&tp->napi)))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5933
				__napi_schedule(&tp->napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5934
			else
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5935
				netif_info(tp, intr, dev,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5936
					   "interrupt %04x in poll\n", status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5937
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5938
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5939
		/* We only get a new MSI interrupt when all active irq
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5940
		 * sources on the chip have been acknowledged. So, ack
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5941
		 * everything we've seen and check if new sources have become
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5942
		 * active to avoid blocking all interrupts from the chip.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5943
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5944
		RTL_W16(IntrStatus,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5945
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5946
		status = RTL_R16(IntrStatus);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5947
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5948
done:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5949
	return IRQ_RETVAL(handled);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5950
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5951
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5952
static void ec_poll(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5953
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5954
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5955
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5956
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5957
	rtl8169_interrupt(pdev->irq, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5958
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5959
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5960
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5961
	if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5962
		rtl8169_phy_timer((unsigned long) dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5963
		tp->ec_watchdog_jiffies = jiffies;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5964
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5965
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5966
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5967
static int rtl8169_poll(struct napi_struct *napi, int budget)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5968
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5969
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5970
	struct net_device *dev = tp->dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5971
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5972
	int work_done;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5973
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5974
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5975
	rtl8169_tx_interrupt(dev, tp, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5976
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5977
	if (work_done < budget) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5978
		napi_complete(napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5979
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5980
		/* We need for force the visibility of tp->intr_mask
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5981
		 * for other CPUs, as we can loose an MSI interrupt
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5982
		 * and potentially wait for a retransmit timeout if we don't.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5983
		 * The posted write to IntrMask is safe, as it will
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5984
		 * eventually make it to the chip and we won't loose anything
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5985
		 * until it does.
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5986
		 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5987
		tp->intr_mask = 0xffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5988
		wmb();
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5989
		RTL_W16(IntrMask, tp->intr_event);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5990
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5991
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5992
	return work_done;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5993
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5994
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5995
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5996
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5997
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5998
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  5999
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6000
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6001
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6002
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6003
	RTL_W32(RxMissed, 0);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6004
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6005
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6006
static void rtl8169_down(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6007
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6008
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6009
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6010
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6011
	if (!tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6012
	    del_timer_sync(&tp->timer);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6013
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6014
		netif_stop_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6015
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6016
		napi_disable(&tp->napi);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6017
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6018
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6019
	if (!tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6020
		spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6021
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6022
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6023
	rtl8169_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6024
	/*
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6025
	 * At this point device interrupts can not be enabled in any function,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6026
	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6027
	 * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6028
	 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6029
	rtl8169_rx_missed(dev, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6030
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6031
	if (!tp->ecdev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6032
		spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6033
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6034
		synchronize_irq(dev->irq);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6035
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6036
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6037
	/* Give a racing hard_start_xmit a few cycles to complete. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6038
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6039
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6040
	rtl8169_tx_clear(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6041
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6042
	rtl8169_rx_clear(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6043
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6044
	rtl_pll_power_down(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6045
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6046
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6047
static int rtl8169_close(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6048
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6049
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6050
	struct pci_dev *pdev = tp->pci_dev;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6051
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6052
	pm_runtime_get_sync(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6053
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6054
	/* Update counters before going down */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6055
	rtl8169_update_counters(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6056
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6057
	rtl8169_down(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6058
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6059
	if (!tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6060
		free_irq(dev->irq, dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6061
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6062
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6063
			  tp->RxPhyAddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6064
	dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6065
			  tp->TxPhyAddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6066
	tp->TxDescArray = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6067
	tp->RxDescArray = NULL;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6068
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6069
	pm_runtime_put_sync(&pdev->dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6070
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6071
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6072
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6073
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6074
static void rtl_set_rx_mode(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6075
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6076
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6077
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6078
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6079
	u32 mc_filter[2];	/* Multicast hash filter */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6080
	int rx_mode;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6081
	u32 tmp = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6082
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6083
	if (dev->flags & IFF_PROMISC) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6084
		/* Unconditionally log net taps. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6085
		netif_notice(tp, link, dev, "Promiscuous mode enabled\n");
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6086
		rx_mode =
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6087
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6088
		    AcceptAllPhys;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6089
		mc_filter[1] = mc_filter[0] = 0xffffffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6090
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6091
		   (dev->flags & IFF_ALLMULTI)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6092
		/* Too many to filter perfectly -- accept all multicasts. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6093
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6094
		mc_filter[1] = mc_filter[0] = 0xffffffff;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6095
	} else {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6096
		struct netdev_hw_addr *ha;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6097
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6098
		rx_mode = AcceptBroadcast | AcceptMyPhys;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6099
		mc_filter[1] = mc_filter[0] = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6100
		netdev_for_each_mc_addr(ha, dev) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6101
			int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6102
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6103
			rx_mode |= AcceptMulticast;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6104
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6105
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6106
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6107
	spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6108
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6109
	tmp = (RTL_R32(RxConfig) & ~RX_CONFIG_ACCEPT_MASK) | rx_mode;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6110
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6111
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6112
		u32 data = mc_filter[0];
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6113
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6114
		mc_filter[0] = swab32(mc_filter[1]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6115
		mc_filter[1] = swab32(data);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6116
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6117
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6118
	RTL_W32(MAR0 + 4, mc_filter[1]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6119
	RTL_W32(MAR0 + 0, mc_filter[0]);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6120
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6121
	RTL_W32(RxConfig, tmp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6122
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6123
	spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6124
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6125
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6126
/**
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6127
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6128
 *  @dev: The Ethernet Device to get statistics for
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6129
 *
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6130
 *  Get TX/RX statistics for rtl8169
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6131
 */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6132
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6133
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6134
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6135
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6136
	unsigned long flags;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6137
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6138
	if (netif_running(dev)) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6139
		spin_lock_irqsave(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6140
		rtl8169_rx_missed(dev, ioaddr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6141
		spin_unlock_irqrestore(&tp->lock, flags);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6142
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6143
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6144
	return &dev->stats;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6145
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6146
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6147
static void rtl8169_net_suspend(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6148
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6149
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6150
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6151
	if (!netif_running(dev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6152
		return;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6153
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6154
	rtl_pll_power_down(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6155
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6156
	netif_device_detach(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6157
	netif_stop_queue(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6158
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6159
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6160
#ifdef CONFIG_PM
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6161
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6162
static int rtl8169_suspend(struct device *device)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6163
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6164
	struct pci_dev *pdev = to_pci_dev(device);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6165
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6166
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6167
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6168
	if (tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6169
		return -EBUSY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6170
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6171
	rtl8169_net_suspend(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6172
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6173
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6174
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6175
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6176
static void __rtl8169_resume(struct net_device *dev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6177
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6178
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6179
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6180
	netif_device_attach(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6181
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6182
	rtl_pll_power_up(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6183
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6184
	rtl8169_schedule_work(dev, rtl8169_reset_task);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6185
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6186
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6187
static int rtl8169_resume(struct device *device)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6188
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6189
	struct pci_dev *pdev = to_pci_dev(device);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6190
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6191
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6192
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6193
	rtl8169_init_phy(dev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6194
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6195
	if (tp->ecdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6196
		return -EBUSY;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6197
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6198
	if (netif_running(dev))
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6199
		__rtl8169_resume(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6200
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6201
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6202
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6203
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6204
static int rtl8169_runtime_suspend(struct device *device)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6205
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6206
	struct pci_dev *pdev = to_pci_dev(device);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6207
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6208
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6209
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6210
	if (!tp->TxDescArray)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6211
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6212
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6213
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6214
	tp->saved_wolopts = __rtl8169_get_wol(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6215
	__rtl8169_set_wol(tp, WAKE_ANY);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6216
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6217
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6218
	rtl8169_net_suspend(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6219
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6220
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6221
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6222
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6223
static int rtl8169_runtime_resume(struct device *device)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6224
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6225
	struct pci_dev *pdev = to_pci_dev(device);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6226
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6227
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6228
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6229
	if (!tp->TxDescArray)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6230
		return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6231
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6232
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6233
	__rtl8169_set_wol(tp, tp->saved_wolopts);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6234
	tp->saved_wolopts = 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6235
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6236
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6237
	rtl8169_init_phy(dev, tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6238
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6239
	__rtl8169_resume(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6240
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6241
	return 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6242
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6243
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6244
static int rtl8169_runtime_idle(struct device *device)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6245
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6246
	struct pci_dev *pdev = to_pci_dev(device);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6247
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6248
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6249
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6250
	return tp->TxDescArray ? -EBUSY : 0;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6251
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6252
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6253
static const struct dev_pm_ops rtl8169_pm_ops = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6254
	.suspend		= rtl8169_suspend,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6255
	.resume			= rtl8169_resume,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6256
	.freeze			= rtl8169_suspend,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6257
	.thaw			= rtl8169_resume,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6258
	.poweroff		= rtl8169_suspend,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6259
	.restore		= rtl8169_resume,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6260
	.runtime_suspend	= rtl8169_runtime_suspend,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6261
	.runtime_resume		= rtl8169_runtime_resume,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6262
	.runtime_idle		= rtl8169_runtime_idle,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6263
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6264
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6265
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6266
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6267
#else /* !CONFIG_PM */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6268
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6269
#define RTL8169_PM_OPS	NULL
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6270
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6271
#endif /* !CONFIG_PM */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6272
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6273
static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6274
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6275
	void __iomem *ioaddr = tp->mmio_addr;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6276
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6277
	/* WoL fails with 8168b when the receiver is disabled. */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6278
	switch (tp->mac_version) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6279
	case RTL_GIGA_MAC_VER_11:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6280
	case RTL_GIGA_MAC_VER_12:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6281
	case RTL_GIGA_MAC_VER_17:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6282
		pci_clear_master(tp->pci_dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6283
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6284
		RTL_W8(ChipCmd, CmdRxEnb);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6285
		/* PCI commit */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6286
		RTL_R8(ChipCmd);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6287
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6288
	default:
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6289
		break;
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6290
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6291
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6292
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6293
static void rtl_shutdown(struct pci_dev *pdev)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6294
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6295
	struct net_device *dev = pci_get_drvdata(pdev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6296
	struct rtl8169_private *tp = netdev_priv(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6297
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6298
	rtl8169_net_suspend(dev);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6299
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6300
	/* Restore original MAC address */
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6301
	rtl_rar_set(tp, dev->perm_addr);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6302
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6303
	spin_lock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6304
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6305
	rtl8169_hw_reset(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6306
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6307
	spin_unlock_irq(&tp->lock);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6308
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6309
	if (system_state == SYSTEM_POWER_OFF) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6310
		if (__rtl8169_get_wol(tp) & WAKE_ANY) {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6311
			rtl_wol_suspend_quirk(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6312
			rtl_wol_shutdown_quirk(tp);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6313
		}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6314
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6315
		pci_wake_from_d3(pdev, true);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6316
		pci_set_power_state(pdev, PCI_D3hot);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6317
	}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6318
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6319
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6320
static struct pci_driver rtl8169_pci_driver = {
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6321
	.name		= MODULENAME,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6322
	.id_table	= rtl8169_pci_tbl,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6323
	.probe		= rtl8169_init_one,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6324
	.remove		= __devexit_p(rtl8169_remove_one),
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6325
	.shutdown	= rtl_shutdown,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6326
	.driver.pm	= RTL8169_PM_OPS,
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6327
};
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6328
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6329
static int __init rtl8169_init_module(void)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6330
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6331
	return pci_register_driver(&rtl8169_pci_driver);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6332
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6333
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6334
static void __exit rtl8169_cleanup_module(void)
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6335
{
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6336
	pci_unregister_driver(&rtl8169_pci_driver);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6337
}
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6338
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6339
module_init(rtl8169_init_module);
214be3e0640e Added r8169 driver for kernel 3.2 (thanks to J. Kunz).
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  6340
module_exit(rtl8169_cleanup_module);