devices/r8169-2.6.31-ethercat.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 10:12:55 -0400
changeset 2625 e25af8bd3957
parent 2589 2b9c78543663
permissions -rw-r--r--
Eoe mac address now derived from unique mac.
The EoE MAC address is now derived from the NIC part of the first global
unique MAC address of the linked list of available network interfaces or
otherwise the MAC address used by the EtherCAT master. The EoE MAC address
will get the format 02:NIC:NIC:NIC:RP:RP where NIC comes from the unique MAC
address (if available) and RP is the ring position of the EoE slave.
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 * vim: noexpandtab
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/module.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/moduleparam.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/pci.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/netdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/etherdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/delay.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/ethtool.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/mii.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/if_vlan.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/crc32.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/in.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/ip.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/tcp.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/init.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/dma-mapping.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "../globals.h"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "ecdev.h"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define RTL8169_VERSION "2.3LK-NAPI"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define MODULENAME "ec_r8169"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define PFX MODULENAME ": "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#ifdef RTL8169_DEBUG
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define assert(expr) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	if (!(expr)) {					\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
		#expr,__FILE__,__func__,__LINE__);		\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define dprintk(fmt, args...) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define assert(expr) do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define dprintk(fmt, args...)	do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#endif /* RTL8169_DEBUG */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define R8169_MSG_DEFAULT \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define TX_BUFFS_AVAIL(tp) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
static const int multicast_filter_limit = 32;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
/* MAC address length */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
#define MAC_ADDR_LEN	6
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
#define MAX_READ_REQUEST_SHIFT	12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define R8169_REGS_SIZE		256
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define R8169_NAPI_WEIGHT	64
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RTL8169_TX_TIMEOUT	(6*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define RTL8169_PHY_TIMEOUT	(10*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define RTL_EEPROM_SIG_ADDR	0x0000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
/* write/read MMIO register */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R8(reg)		readb (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_R16(reg)		readw (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
enum mac_version {
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
    98
	RTL_GIGA_MAC_NONE   = 0x00,
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_25 = 0x19  // 8168D
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
#define _R(NAME,MAC,MASK) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
static const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	const char *name;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	u8 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
} rtl_chip_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
#undef _R
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
enum cfg_version {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	RTL_CFG_0 = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	RTL_CFG_1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	RTL_CFG_2
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
static void rtl_hw_start_8169(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
static void rtl_hw_start_8168(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
static void rtl_hw_start_8101(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
static struct pci_device_id rtl8169_pci_tbl[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	{ 0x0001,				0x8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
	{0,},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
/* prevent driver from being loaded automatically */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
static int rx_copybreak = 200;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
static int use_dac;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
} debug = { -1 };
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
enum rtl_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	MAC0		= 0,	/* Ethernet hardware address. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	MAC4		= 4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	MAR0		= 8,	/* Multicast filter. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	CounterAddrLow		= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	CounterAddrHigh		= 0x14,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	TxDescStartAddrLow	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	TxDescStartAddrHigh	= 0x24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	TxHDescStartAddrLow	= 0x28,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxHDescStartAddrHigh	= 0x2c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	FLASH		= 0x30,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	ERSR		= 0x36,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	ChipCmd		= 0x37,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	TxPoll		= 0x38,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	IntrMask	= 0x3c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	IntrStatus	= 0x3e,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxConfig	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	RxConfig	= 0x44,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	RxMissed	= 0x4c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	Cfg9346		= 0x50,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	Config0		= 0x51,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	Config1		= 0x52,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Config2		= 0x53,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config3		= 0x54,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config4		= 0x55,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config5		= 0x56,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	MultiIntr	= 0x5c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	PHYAR		= 0x60,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	PHYstatus	= 0x6c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	RxMaxSize	= 0xda,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	CPlusCmd	= 0xe0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	IntrMitigate	= 0xe2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxDescAddrLow	= 0xe4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	RxDescAddrHigh	= 0xe8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	EarlyTxThres	= 0xec,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	FuncEvent	= 0xf0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	FuncEventMask	= 0xf4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	FuncPresetState	= 0xf8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncForceEvent	= 0xfc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
enum rtl8110_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	TBICSR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	TBI_ANAR		= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	TBI_LPAR		= 0x6a,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
enum rtl8168_8101_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	CSIDR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	CSIAR			= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
#define	CSIAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
#define	CSIAR_WRITE_CMD			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
#define	CSIAR_BYTE_ENABLE		0x0f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_BYTE_ENABLE_SHIFT		12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_ADDR_MASK			0x0fff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	EPHYAR			= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	EPHYAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
#define	EPHYAR_WRITE_CMD		0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
#define	EPHYAR_REG_MASK			0x1f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_REG_SHIFT		16
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_DATA_MASK		0xffff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	DBG_REG			= 0xd1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	FIX_NAK_1			(1 << 4)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	FIX_NAK_2			(1 << 3)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
enum rtl_register_content {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	/* InterruptStatusBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	SYSErr		= 0x8000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	PCSTimeout	= 0x4000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	SWInt		= 0x0100,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	TxDescUnavail	= 0x0080,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	RxFIFOOver	= 0x0040,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	LinkChg		= 0x0020,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	RxOverflow	= 0x0010,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	TxErr		= 0x0008,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	TxOK		= 0x0004,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	RxErr		= 0x0002,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	RxOK		= 0x0001,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	/* RxStatusDesc */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxFOVF	= (1 << 23),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	RxRWT	= (1 << 22),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	RxRES	= (1 << 21),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxRUNT	= (1 << 20),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	RxCRC	= (1 << 19),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	/* ChipCmdBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	CmdReset	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	CmdRxEnb	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	CmdTxEnb	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	RxBufEmpty	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	/* TXPoll register p.5 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	FSWInt		= 0x01,		/* Forced software interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	/* Cfg9346Bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	Cfg9346_Lock	= 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	Cfg9346_Unlock	= 0xc0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	/* rx_mode_bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	AcceptErr	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	AcceptRunt	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	AcceptBroadcast	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	AcceptMulticast	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	AcceptMyPhys	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	AcceptAllPhys	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	/* RxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	RxCfgFIFOShift	= 13,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	RxCfgDMAShift	=  8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	/* TxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	TxInterFrameGapShift = 24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	/* Config1 register p.24 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	LEDS1		= (1 << 7),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	LEDS0		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	Speed_down	= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	MEMMAP		= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	IOMAP		= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	VPD		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	PMEnable	= (1 << 0),	/* Power Management Enable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	/* Config2 register p. 25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	PCI_Clock_66MHz = 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	PCI_Clock_33MHz = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	/* Config3 register p.25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	/* Config5 register p.27 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	LanWake		= (1 << 1),	/* LanWake enable/disable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	/* TBICSR p.28 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	TBIReset	= 0x80000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	TBILoopback	= 0x40000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	TBINwEnable	= 0x20000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	TBINwRestart	= 0x10000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	TBILinkOk	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	TBINwComplete	= 0x01000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	/* CPlusCmd p.31 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	EnableBist	= (1 << 15),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	Normal_mode	= (1 << 13),	// unused
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	Force_half_dup	= (1 << 12),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	Force_rxflow_en	= (1 << 11),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	Force_txflow_en	= (1 << 10),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	ASF		= (1 << 8),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	PktCntrDisable	= (1 << 7),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	Mac_dbgo_sel	= 0x001c,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	RxVlan		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	RxChkSum	= (1 << 5),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	PCIDAC		= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	PCIMulRW	= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	INTT_0		= 0x0000,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	INTT_1		= 0x0001,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	INTT_2		= 0x0002,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	INTT_3		= 0x0003,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	/* rtl8169_PHYstatus */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	TBI_Enable	= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	TxFlowCtrl	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	RxFlowCtrl	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	_1000bpsF	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	_100bps		= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	_10bps		= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	LinkStatus	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	FullDup		= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	/* _TBICSRBit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	TBILinkOK	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	/* DumpCounterCommand */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	CounterDump	= 0x8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
enum desc_status_bit {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	RingEnd		= (1 << 30), /* End of descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	FirstFrag	= (1 << 29), /* First segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	LastFrag	= (1 << 28), /* Final segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	/* Tx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	MSSShift	= 16,        /* MSS value position */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	IPCS		= (1 << 18), /* Calculate IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	/* Rx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
#define RxProtoUDP	(PID1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
#define RxProtoTCP	(PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
#define RxProtoIP	(PID1 | PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
#define RxProtoMask	RxProtoIP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	IPFail		= (1 << 16), /* IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	RxVlanTag	= (1 << 16), /* VLAN tag available */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
#define RsvdMask	0x3fffc000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
struct TxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
struct RxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
struct ring_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	struct sk_buff	*skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	u32		len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	u8		__pad[sizeof(void *) - sizeof(u32)];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
enum features {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	RTL_FEATURE_WOL		= (1 << 0),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	RTL_FEATURE_MSI		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	RTL_FEATURE_GMII	= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   443
struct rtl8169_counters {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   444
	__le64	tx_packets;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   445
	__le64	rx_packets;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   446
	__le64	tx_errors;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   447
	__le32	rx_errors;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   448
	__le16	rx_missed;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   449
	__le16	align_errors;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   450
	__le32	tx_one_collision;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   451
	__le32	tx_multi_collision;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   452
	__le64	rx_unicast;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   453
	__le64	rx_broadcast;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   454
	__le32	rx_multicast;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   455
	__le16	tx_aborted;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   456
	__le16	tx_underun;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   457
};
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   458
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
struct rtl8169_private {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	void __iomem *mmio_addr;	/* memory map physical address */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	struct pci_dev *pci_dev;	/* Index of PCI device */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	struct napi_struct napi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	spinlock_t lock;		/* spin lock flag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	int chipset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	u32 dirty_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	u32 dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	dma_addr_t TxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	dma_addr_t RxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	unsigned align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	unsigned rx_buf_sz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	struct timer_list timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	u16 cp_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	u16 intr_mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	int phy_1000_ctrl_reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	struct vlan_group *vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
	void (*phy_reset_enable)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	unsigned int (*phy_reset_pending)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	unsigned int (*link_ok)(void __iomem *);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   495
	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	int pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
	struct delayed_work task;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
	unsigned features;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	struct mii_if_info mii;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   501
	struct rtl8169_counters counters;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	ec_device_t *ecdev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	unsigned long ec_watchdog_jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
MODULE_DESCRIPTION("EtherCAT-capable RealTek RTL-8169 Gigabit Ethernet driver");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
module_param(rx_copybreak, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
module_param(use_dac, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
module_param_named(debug, debug.msg_enable, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
MODULE_LICENSE("GPL");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
MODULE_VERSION(EC_MASTER_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
static int rtl8169_open(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
static int rtl8169_init_ring(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
static void rtl_hw_start(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
static int rtl8169_close(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
static void rtl_set_rx_mode(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
static void rtl8169_tx_timeout(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
				void __iomem *, u32 budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
static void rtl8169_down(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
static void rtl8169_rx_clear(struct rtl8169_private *tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
static void ec_poll(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
static int rtl8169_poll(struct napi_struct *napi, int budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
static const unsigned int rtl8169_rx_config =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
		 * Check if the RTL8169 has completed writing to the specified
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
		 * MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		if (!(RTL_R32(PHYAR) & 0x80000000))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
static int mdio_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	int i, value = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
		 * Check if the RTL8169 has completed retrieving data from
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
		 * the specified MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
		if (RTL_R32(PHYAR) & 0x80000000) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
			value = RTL_R32(PHYAR) & 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
			   int val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	mdio_write(ioaddr, location, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	return mdio_read(ioaddr, location);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
	u16 value = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	RTL_W32(CSIDR, value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	u32 value = ~0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
			value = RTL_R32(CSIDR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
static void rtl8169_asic_down(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	RTL_W8(ChipCmd, 0x00);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	return RTL_R32(TBICSR) & TBIReset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	return RTL_R32(TBICSR) & TBILinkOk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	return RTL_R8(PHYstatus) & LinkStatus;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	unsigned int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
static void rtl8169_check_link_status(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
				      struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
				      void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
    if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
		spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
		if (tp->link_ok(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
			netif_carrier_on(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
			if (netif_msg_ifup(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
				printk(KERN_INFO PFX "%s: link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
			if (netif_msg_ifdown(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
				printk(KERN_INFO PFX "%s: link down\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
			netif_carrier_off(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
		spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	u8 options;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	wol->wolopts = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	wol->supported = WAKE_ANY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	options = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	if (!(options & PMEnable))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
	options = RTL_R8(Config3);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	if (options & LinkUp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
		wol->wolopts |= WAKE_PHY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	if (options & MagicPacket)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
		wol->wolopts |= WAKE_MAGIC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	options = RTL_R8(Config5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	if (options & UWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		wol->wolopts |= WAKE_UCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	if (options & BWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		wol->wolopts |= WAKE_BCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	if (options & MWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		wol->wolopts |= WAKE_MCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		u32 opt;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
		u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
		u8  mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	} cfg[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		{ WAKE_ANY,   Config1, PMEnable },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		{ WAKE_PHY,   Config3, LinkUp },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		{ WAKE_MAGIC, Config3, MagicPacket },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		{ WAKE_UCAST, Config5, UWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
		{ WAKE_BCAST, Config5, BWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		{ WAKE_MCAST, Config5, MWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
		{ WAKE_ANY,   Config5, LanWake }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		if (wol->wolopts & cfg[i].opt)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
			options |= cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
		RTL_W8(cfg[i].reg, options);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	if (wol->wolopts)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		tp->features |= RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
		tp->features &= ~RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
static void rtl8169_get_drvinfo(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
				struct ethtool_drvinfo *info)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	strcpy(info->driver, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	strcpy(info->version, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	strcpy(info->bus_info, pci_name(tp->pci_dev));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
static int rtl8169_get_regs_len(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	return R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
static int rtl8169_set_speed_tbi(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
				 u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	reg = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	    (duplex == DUPLEX_FULL)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	} else if (autoneg == AUTONEG_ENABLE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
			printk(KERN_WARNING "%s: "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
			       "incorrect speed setting refused in TBI mode\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
		ret = -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
static int rtl8169_set_speed_xmii(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
				  u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	void __iomem *ioaddr = tp->mmio_addr;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   857
	int giga_ctrl, bmcr;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
	if (autoneg == AUTONEG_ENABLE) {
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   860
		int auto_nego;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   861
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   862
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   865
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   866
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   867
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   868
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   869
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   870
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   871
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   872
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   873
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   874
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   875
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   876
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   877
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   878
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   880
		} else if (netif_msg_link(tp)) {
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		}
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   884
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   885
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   886
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   887
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   888
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   889
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   890
			/*
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   891
			 * Wake up the PHY.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   892
			 * Vendor specific (0x1f) and reserved (0x0e) MII
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   893
			 * registers.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   894
			 */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   895
			mdio_write(ioaddr, 0x1f, 0x0000);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   896
			mdio_write(ioaddr, 0x0e, 0x0000);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   897
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   898
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   899
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   900
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   901
	} else {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   902
		giga_ctrl = 0;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   903
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   904
		if (speed == SPEED_10)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   905
			bmcr = 0;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   906
		else if (speed == SPEED_100)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   907
			bmcr = BMCR_SPEED100;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   908
		else
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   909
			return -EINVAL;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   910
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   911
		if (duplex == DUPLEX_FULL)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   912
			bmcr |= BMCR_FULLDPLX;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   913
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
		mdio_write(ioaddr, 0x1f, 0x0000);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   915
	}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   916
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	tp->phy_1000_ctrl_reg = giga_ctrl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   919
	mdio_write(ioaddr, MII_BMCR, bmcr);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   920
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   921
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   922
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   923
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   924
			mdio_write(ioaddr, 0x17, 0x2138);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   925
			mdio_write(ioaddr, 0x0e, 0x0260);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   926
		} else {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   927
			mdio_write(ioaddr, 0x17, 0x2108);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   928
			mdio_write(ioaddr, 0x0e, 0x0000);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   929
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   930
	}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
   931
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
static int rtl8169_set_speed(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
			     u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	ret = tp->set_speed(dev, autoneg, speed, duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
static u32 rtl8169_get_rx_csum(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	return tp->cp_cmd & RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	if (data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
		tp->cp_cmd |= RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		tp->cp_cmd &= ~RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
static void rtl8169_vlan_rx_register(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
				     struct vlan_group *grp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	tp->vlgrp = grp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	if (tp->vlgrp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
		tp->cp_cmd |= RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
		tp->cp_cmd &= ~RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	u32 opts2 = le32_to_cpu(desc->opts2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	struct vlan_group *vlgrp = tp->vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
	if (vlgrp && (opts2 & RxVlanTag)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
		vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
		ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	} else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
		ret = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
#else /* !CONFIG_R8169_VLAN */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	return -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	cmd->supported =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
	cmd->port = PORT_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	cmd->transceiver = XCVR_INTERNAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	status = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	cmd->autoneg = !!(status & TBINwEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	cmd->speed = SPEED_1000;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
	cmd->duplex = DUPLEX_FULL; /* Always set */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	return mii_ethtool_gset(&tp->mii, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	rc = tp->get_settings(dev, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
			     void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	if (regs->len > R8169_REGS_SIZE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
		regs->len = R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	memcpy_fromio(p, tp->mmio_addr, regs->len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
static u32 rtl8169_get_msglevel(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	return tp->msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	tp->msg_enable = value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	"tx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	"rx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	"tx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	"rx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	"rx_missed",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	"align_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	"tx_single_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	"tx_multi_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	"unicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	"broadcast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	"multicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	"tx_aborted",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	"tx_underrun",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	switch (sset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
		return ARRAY_SIZE(rtl8169_gstrings);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
		return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1145
static void rtl8169_update_counters(struct net_device *dev)
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	struct rtl8169_counters *counters;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	dma_addr_t paddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	u32 cmd;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1152
	int wait = 1000;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1153
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1154
	/*
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1155
	 * Some chips are unable to dump tally counters when the receiver
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1156
	 * is disabled.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1157
	 */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1158
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1159
		return;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	if (!counters)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1166
	cmd = (u64)paddr & DMA_BIT_MASK(32);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	RTL_W32(CounterAddrLow, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	RTL_W32(CounterAddrLow, cmd | CounterDump);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1170
	while (wait--) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1171
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1172
			/* copy updated counters */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1173
			memcpy(&tp->counters, counters, sizeof(*counters));
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
			break;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1175
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1176
		udelay(10);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	RTL_W32(CounterAddrLow, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	RTL_W32(CounterAddrHigh, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1185
static void rtl8169_get_ethtool_stats(struct net_device *dev,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1186
				      struct ethtool_stats *stats, u64 *data)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1187
{
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1188
	struct rtl8169_private *tp = netdev_priv(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1189
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1190
	ASSERT_RTNL();
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1191
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1192
	rtl8169_update_counters(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1193
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1194
	data[0] = le64_to_cpu(tp->counters.tx_packets);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1195
	data[1] = le64_to_cpu(tp->counters.rx_packets);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1196
	data[2] = le64_to_cpu(tp->counters.tx_errors);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1197
	data[3] = le32_to_cpu(tp->counters.rx_errors);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1198
	data[4] = le16_to_cpu(tp->counters.rx_missed);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1199
	data[5] = le16_to_cpu(tp->counters.align_errors);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1200
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1201
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1202
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1203
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1204
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1205
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1206
	data[12] = le16_to_cpu(tp->counters.tx_underun);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1207
}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1208
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	switch(stringset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
static const struct ethtool_ops rtl8169_ethtool_ops = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	.get_drvinfo		= rtl8169_get_drvinfo,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	.get_regs_len		= rtl8169_get_regs_len,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	.get_link		= ethtool_op_get_link,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	.get_settings		= rtl8169_get_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	.set_settings		= rtl8169_set_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	.get_msglevel		= rtl8169_get_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	.set_msglevel		= rtl8169_set_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	.get_rx_csum		= rtl8169_get_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	.set_rx_csum		= rtl8169_set_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	.set_tx_csum		= ethtool_op_set_tx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
	.set_sg			= ethtool_op_set_sg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
	.set_tso		= ethtool_op_set_tso,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	.get_regs		= rtl8169_get_regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	.get_wol		= rtl8169_get_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	.set_wol		= rtl8169_set_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	.get_strings		= rtl8169_get_strings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	.get_sset_count		= rtl8169_get_sset_count,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
				       int bitnum, int bitval)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	val = mdio_read(ioaddr, reg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	val = (bitval == 1) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	mdio_write(ioaddr, reg, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
				    void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	 * The driver currently handles the 8168Bf and the 8168Be identically
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
	 * but they can be identified more specifically through the test below
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	 * if needed:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
	 * Same thing for the 8101Eb and the 8101Ec:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		u32 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
	} mac_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		/* 8168D family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_25 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		/* 8168C family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		{ 0x7cf00000, 0x3ca00000,	RTL_GIGA_MAC_VER_24 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		/* 8168B family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		/* 8101 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		/* FIXME: where did these entries come from ? -- FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
		/* 8110 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1314
		/* Catch-all */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1315
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
	}, *p = mac_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
	reg = RTL_R32(TxConfig);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	while ((reg & p->mask) != p->val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		p++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
	tp->mac_version = p->mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
struct phy_reg {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
	u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	u16 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
static void rtl_phy_write(void __iomem *ioaddr, struct phy_reg *regs, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		mdio_write(ioaddr, regs->reg, regs->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		regs++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		u16 regs[5]; /* Beware of bit-sign propagation */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	} phy_magic[5] = { {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		{ 0x0000,	//w 4 15 12 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		  0x00a1,	//w 3 15 0 00a1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		  0x0008,	//w 2 15 0 0008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		  0x1020,	//w 1 15 0 1020
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		  0x1000 } },{	//w 0 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		{ 0x7000,	//w 4 15 12 7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		  0xde60,	//w 2 15 0 de60
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		  0x0077 } },{	//w 0 15 0 0077
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		{ 0xa000,	//w 4 15 12 a
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
		  0xfa00 } },{	//w 0 15 0 fa00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
		{ 0xb000,	//w 4 15 12 b
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
		  0xde20,	//w 2 15 0 de20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		  0x00bb } },{	//w 0 15 0 00bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		{ 0xf000,	//w 4 15 12 f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		  0xbf00 }	//w 0 15 0 bf00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	}, *p = phy_magic;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	mdio_write(ioaddr, 0x1f, 0x0001);		//w 31 2 0 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	mdio_write(ioaddr, 0x15, 0x1000);		//w 21 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	mdio_write(ioaddr, 0x18, 0x65c7);		//w 24 15 0 65c7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		int val, pos = 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
		mdio_write(ioaddr, pos, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
		while (--pos >= 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
	mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		{ 0x01, 0x90d0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		{ 0x10, 0xf41b },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	mdio_write(ioaddr, 0x1f, 0x0001);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
	mdio_patch(ioaddr, 0x16, 1 << 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
		{ 0x10, 0xf41b },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
		{ 0x1d, 0x0f00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
		{ 0x0c, 0x1ec8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		{ 0x1d, 0x3d98 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	mdio_patch(ioaddr, 0x14, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
		{ 0x00, 0x88d4 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		{ 0x01, 0x82b1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		{ 0x03, 0x7002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		{ 0x08, 0x9e30 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		{ 0x09, 0x01f0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		{ 0x0a, 0x5500 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		{ 0x0c, 0x00c8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
		{ 0x12, 0xc096 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		{ 0x16, 0x000a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		{ 0x09, 0x2000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		{ 0x09, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	mdio_patch(ioaddr, 0x14, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
		{ 0x03, 0x802f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		{ 0x02, 0x4f02 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		{ 0x01, 0x0409 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		{ 0x00, 0xf099 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		{ 0x04, 0x9800 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
		{ 0x04, 0x9000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		{ 0x1d, 0x3d98 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
		{ 0x0c, 0x7eb8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x06, 0x0761 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x16, 0x0f0a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
	mdio_patch(ioaddr, 0x16, 1 << 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	mdio_patch(ioaddr, 0x14, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
		{ 0x1d, 0x3d98 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		{ 0x0c, 0x7eb8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		{ 0x06, 0x5461 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		{ 0x16, 0x0f0a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	mdio_patch(ioaddr, 0x16, 1 << 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
	mdio_patch(ioaddr, 0x14, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	mdio_patch(ioaddr, 0x0d, 1 << 5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	rtl8168c_3_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
static void rtl8168d_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
	struct phy_reg phy_reg_init_0[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		{ 0x09, 0x2770 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x08, 0x04d0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x0b, 0xad15 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x0c, 0x5bf0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x1c, 0xf101 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
		{ 0x14, 0x94d7 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		{ 0x12, 0xf4d6 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
		{ 0x09, 0xca0f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		{ 0x0b, 0x0b10 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
		{ 0x0c, 0xd1f7 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
		{ 0x06, 0x5461 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		{ 0x05, 0x6662 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
		{ 0x14, 0x0060 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
		{ 0x0d, 0xf8a0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
		{ 0x1f, 0x0005 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
		{ 0x05, 0xffc2 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
	if (mdio_read(ioaddr, 0x06) == 0xc400) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
		struct phy_reg phy_reg_init_1[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
			{ 0x1f, 0x0005 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			{ 0x01, 0x0300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			{ 0x11, 0x401c },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			{ 0x16, 0x4100 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			{ 0x1f, 0x0005 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
			{ 0x07, 0x0010 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
			{ 0x05, 0x83dc },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			{ 0x06, 0x087d },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
			{ 0x05, 0x8300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			{ 0x06, 0x0101 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			{ 0x06, 0x05f8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
			{ 0x06, 0xf9fa },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
			{ 0x06, 0xfbef },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
			{ 0x06, 0x79e2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			{ 0x06, 0x835f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
			{ 0x06, 0xe0f8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
			{ 0x06, 0x9ae1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
			{ 0x06, 0xf89b },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
			{ 0x06, 0xef31 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
			{ 0x06, 0x3b65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
			{ 0x06, 0xaa07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
			{ 0x06, 0x81e4 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
			{ 0x06, 0xf89a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
			{ 0x06, 0xe5f8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
			{ 0x06, 0x9baf },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
			{ 0x06, 0x06ae },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
			{ 0x05, 0x83dc },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
			{ 0x06, 0x8300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
		};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		rtl_phy_write(ioaddr, phy_reg_init_1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
			      ARRAY_SIZE(phy_reg_init_1));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
		{ 0x08, 0x441d },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
		{ 0x01, 0x9100 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	mdio_patch(ioaddr, 0x11, 1 << 12);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	mdio_patch(ioaddr, 0x19, 1 << 13);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
static void rtl_hw_phy_config(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	case RTL_GIGA_MAC_VER_01:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	case RTL_GIGA_MAC_VER_02:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	case RTL_GIGA_MAC_VER_03:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		rtl8169s_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	case RTL_GIGA_MAC_VER_04:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		rtl8169sb_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		rtl8102e_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	case RTL_GIGA_MAC_VER_11:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
		rtl8168bb_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	case RTL_GIGA_MAC_VER_12:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
		rtl8168bef_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
	case RTL_GIGA_MAC_VER_17:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		rtl8168bef_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	case RTL_GIGA_MAC_VER_18:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		rtl8168cp_1_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	case RTL_GIGA_MAC_VER_19:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		rtl8168c_1_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	case RTL_GIGA_MAC_VER_20:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		rtl8168c_2_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
	case RTL_GIGA_MAC_VER_21:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		rtl8168c_3_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	case RTL_GIGA_MAC_VER_22:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		rtl8168c_4_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	case RTL_GIGA_MAC_VER_23:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	case RTL_GIGA_MAC_VER_24:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
		rtl8168cp_2_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	case RTL_GIGA_MAC_VER_25:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
		rtl8168d_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
static void rtl8169_phy_timer(unsigned long __opaque)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	struct net_device *dev = (struct net_device *)__opaque;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	if (tp->phy_reset_pending(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		 * A busy loop could burn quite a few cycles on nowadays CPU.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		 * Let's delay the execution of the timer for a few ticks.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		timeout = HZ/10;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
		goto out_mod_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	if (tp->link_ok(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
		printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
out_mod_timer:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		mod_timer(timer, jiffies + timeout);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
static inline void rtl8169_delete_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
	del_timer_sync(timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
static inline void rtl8169_request_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
#ifdef CONFIG_NET_POLL_CONTROLLER
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
 * Polling 'interrupt' - used by things like netconsole to send skbs
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
 * without having to re-enable interrupts. It's not called while
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
 * the interrupt routine is executing.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
static void rtl8169_netpoll(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	disable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	rtl8169_interrupt(pdev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	enable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
				  void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
static void rtl8169_phy_reset(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
			      struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
		if (!tp->phy_reset_pending(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
			return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		msleep(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	rtl_hw_phy_config(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	rtl8169_phy_reset(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	 * only 8101. Don't panic.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
		printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
	u32 high;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	u32 low;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	high = addr[4] | (addr[5] << 8);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	RTL_W32(MAC0, low);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	RTL_W32(MAC4, high);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
static int rtl_set_mac_address(struct net_device *dev, void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	struct sockaddr *addr = p;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	if (!is_valid_ether_addr(addr->sa_data))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		return -EADDRNOTAVAIL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
	rtl_rar_set(tp, dev->dev_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	struct mii_ioctl_data *data = if_mii(ifr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1866
	return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1867
}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1868
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1869
static int rtl_xmii_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1870
{
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	switch (cmd) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	case SIOCGMIIPHY:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		data->phy_id = 32; /* Internal PHY */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	case SIOCGMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	case SIOCSMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		if (!capable(CAP_NET_ADMIN))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
			return -EPERM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1889
static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1890
{
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1891
	return -EOPNOTSUPP;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1892
}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1893
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
static const struct rtl_cfg_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	unsigned int region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	unsigned int align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	unsigned features;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1901
	u8 default_ver;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
} rtl_cfg_infos [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
	[RTL_CFG_0] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
		.hw_start	= rtl_hw_start_8169,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		.region		= 1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		.align		= 0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1910
		.features	= RTL_FEATURE_GMII,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1911
		.default_ver	= RTL_GIGA_MAC_VER_01,
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
	[RTL_CFG_1] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
		.hw_start	= rtl_hw_start_8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
				  TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1920
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1921
		.default_ver	= RTL_GIGA_MAC_VER_11,
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	[RTL_CFG_2] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
		.hw_start	= rtl_hw_start_8101,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1930
		.features	= RTL_FEATURE_MSI,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1931
		.default_ver	= RTL_GIGA_MAC_VER_13,
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
/* Cfg9346_Unlock assumed. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
			    const struct rtl_cfg_info *cfg)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	unsigned msi = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	u8 cfg2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	if (cfg->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		if (pci_enable_msi(pdev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
			cfg2 |= MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
			msi = RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	RTL_W8(Config2, cfg2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	return msi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	if (tp->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
		pci_disable_msi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
		tp->features &= ~RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1963
static const struct net_device_ops rtl8169_netdev_ops = {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1964
	.ndo_open		= rtl8169_open,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1965
	.ndo_stop		= rtl8169_close,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1966
	.ndo_get_stats		= rtl8169_get_stats,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1967
	.ndo_start_xmit		= rtl8169_start_xmit,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1968
	.ndo_tx_timeout		= rtl8169_tx_timeout,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1969
	.ndo_validate_addr	= eth_validate_addr,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1970
	.ndo_change_mtu		= rtl8169_change_mtu,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1971
	.ndo_set_mac_address	= rtl_set_mac_address,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1972
	.ndo_do_ioctl		= rtl8169_ioctl,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1973
	.ndo_set_multicast_list	= rtl_set_rx_mode,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1974
#ifdef CONFIG_R8169_VLAN
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1975
	.ndo_vlan_rx_register	= rtl8169_vlan_rx_register,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1976
#endif
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1977
#ifdef CONFIG_NET_POLL_CONTROLLER
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1978
	.ndo_poll_controller	= rtl8169_netpoll,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1979
#endif
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1980
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1981
};
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  1982
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
static int __devinit
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	const unsigned int region = cfg->region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
	struct rtl8169_private *tp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	struct mii_if_info *mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	void __iomem *ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	if (netif_msg_drv(&debug)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		       MODULENAME, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	dev = alloc_etherdev(sizeof (*tp));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	if (!dev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		if (netif_msg_drv(&debug))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		rc = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	SET_NETDEV_DEV(dev, &pdev->dev);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2009
	dev->netdev_ops = &rtl8169_netdev_ops;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
	tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
	tp->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	tp->pci_dev = pdev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
	mii = &tp->mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	mii->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	mii->mdio_read = rtl_mdio_read;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	mii->mdio_write = rtl_mdio_write;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	mii->phy_id_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	mii->reg_num_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
	rc = pci_enable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
			dev_err(&pdev->dev, "enable failure\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		goto err_out_free_dev_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	rc = pci_set_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
	if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
		goto err_out_disable_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	/* make sure PCI base addr 1 is MMIO */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
				"region #%d not an MMIO resource, aborting\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
				region);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	/* check for weird/broken PCI region reporting */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
				"Invalid PCI region size(s), aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	rc = pci_request_regions(pdev, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
			dev_err(&pdev->dev, "could not request regions.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	tp->cp_cmd = PCIMulRW | RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	if ((sizeof(dma_addr_t) > 4) &&
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2066
	    !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) && use_dac) {
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		tp->cp_cmd |= PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		dev->features |= NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	} else {
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2070
		rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
			if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
				dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
					"DMA configuration failed.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
			goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	/* ioremap MMIO region */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	if (!ioaddr) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
			dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
		rc = -EIO;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	if (!tp->pcie_cap && netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		dev_info(&pdev->dev, "no PCI Express capability\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2107
	pci_set_master(pdev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2108
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	/* Identify chip attached to board */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	rtl8169_get_mac_version(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2112
	/* Use appropriate default if unknown */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2113
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2114
		if (netif_msg_probe(tp)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2115
			dev_notice(&pdev->dev,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2116
				   "unknown MAC, using family default\n");
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2117
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2118
		tp->mac_version = cfg->default_ver;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2119
	}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2120
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
		if (tp->mac_version == rtl_chip_info[i].mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	if (i == ARRAY_SIZE(rtl_chip_info)) {
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2128
		dev_err(&pdev->dev,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2129
			"driver bug, MAC version not found in rtl_chip_info\n");
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2130
		goto err_out_msi_5;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	tp->chipset = i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
		tp->features |= RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
		tp->features |= RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
		tp->set_speed = rtl8169_set_speed_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		tp->get_settings = rtl8169_gset_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
		tp->link_ok = rtl8169_tbi_link_ok;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2151
		tp->do_ioctl = rtl_tbi_ioctl;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
		tp->set_speed = rtl8169_set_speed_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
		tp->get_settings = rtl8169_gset_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
		tp->link_ok = rtl8169_xmii_link_ok;
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2160
		tp->do_ioctl = rtl_xmii_ioctl;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	spin_lock_init(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	tp->mmio_addr = ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
	/* Get MAC address */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	for (i = 0; i < MAC_ADDR_LEN; i++)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
	dev->irq = pdev->irq;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	dev->base_addr = (unsigned long) ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	tp->align = cfg->align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	tp->hw_start = cfg->hw_start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	tp->intr_event = cfg->intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	tp->napi_event = cfg->napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	init_timer(&tp->timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	tp->timer.data = (unsigned long) dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	tp->timer.function = rtl8169_phy_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	// offer device to EtherCAT master module
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
		rc = register_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
		if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
			goto err_out_msi_5;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	pci_set_drvdata(pdev, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
	if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		printk(KERN_INFO "%s: %s at 0x%lx, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		       "XID %08x IRQ %d\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		       dev->name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		       rtl_chip_info[tp->chipset].name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		       dev->base_addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		       dev->dev_addr[0], dev->dev_addr[1],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		       dev->dev_addr[2], dev->dev_addr[3],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
		       dev->dev_addr[4], dev->dev_addr[5], xid, dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	rtl8169_init_phy(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2220
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2221
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2222
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2223
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2224
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2225
			goto err_out_msi_5;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2226
		}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  2227
	}
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2228
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
err_out_msi_5:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
err_out_free_res_4:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
err_out_mwi_3:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	pci_clear_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
err_out_disable_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
err_out_free_dev_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	flush_scheduled_work();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		ecdev_close(tp->ecdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
		ecdev_withdraw(tp->ecdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		unregister_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
	pci_set_drvdata(pdev, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
				  struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	unsigned int mtu = dev->mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
static int rtl8169_open(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	int retval = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	 * Rx and Tx desscriptors needs 256 bytes alignment.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	 * pci_alloc_consistent provides more.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
					       &tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	if (!tp->TxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
					       &tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	if (!tp->RxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
		goto err_free_tx_0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	retval = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		goto err_free_rx_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	INIT_DELAYED_WORK(&tp->task, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
	smp_mb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
		retval = request_irq(dev->irq, rtl8169_interrupt,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
				dev->name, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
			goto err_release_ring_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
		napi_enable(&tp->napi);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2311
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2312
	}
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	return retval;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
err_release_ring_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
err_free_rx_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
err_free_tx_0:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
static void rtl8169_hw_reset(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	/* Disable interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
	/* Reset the chipset */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	/* PCI commit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	RTL_R8(ChipCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	u32 cfg = rtl8169_rx_config;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	RTL_W32(RxConfig, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	/* Set DMA burst size and Interframe Gap Time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		(InterFrameGap << TxInterFrameGapShift));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
static void rtl_hw_start(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
	tp->hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		netif_start_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
					 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
	 * register to be written before TxDescAddrLow to work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	 * Switching from MMIO to I/O access fixes the issue as well.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2389
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2391
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	u16 cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
	cmd = RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	RTL_W16(CPlusCmd, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	return cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2403
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	/* Low hurts. Let's disable the filtering. */
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2406
	RTL_W16(RxMaxSize, rx_buf_sz);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		u32 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
		u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	} cfg2_info [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	}, *p = cfg2_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
			RTL_W32(0x7c, p->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
static void rtl_hw_start_8169(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2453
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
			"Bit-3 and bit-14 MUST be 1\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
		tp->cp_cmd |= (1 << 14);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	 * Undocumented corner. Supposedly:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	/* no early-rx interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
	/* Enable all known interrupts by setting the interrupt mask. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
	int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
	if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		u16 ctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
static void rtl_csi_access_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	u32 csi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
struct ephy_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
	unsigned int offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	u16 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	u16 bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
static void rtl_ephy_init(void __iomem *ioaddr, struct ephy_info *e, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
	u16 w;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
		rtl_ephy_write(ioaddr, e->offset, w);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		e++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
static void rtl_disable_clock_request(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
	int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
		u16 ctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
#define R8168_CPCMD_QUIRK_MASK (\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	EnableBist | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	Mac_dbgo_oe | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	Force_rxflow_en | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	Force_txflow_en | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
	Cxpl_dbg_sel | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
	ASF | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	PktCntrDisable | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	Mac_dbgo_sel)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	rtl_tx_performance_tweak(pdev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	rtl_hw_start_8168bb(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	rtl_disable_clock_request(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	static struct ephy_info e_info_8168cp[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
		{ 0x01, 0,	0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		{ 0x02, 0x0800,	0x1000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
		{ 0x03, 0,	0x0042 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x06, 0x0080,	0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		{ 0x07, 0,	0x2000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	__rtl_hw_start_8168cp(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
	/* Magic. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
	RTL_W8(DBG_REG, 0x20);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
	static struct ephy_info e_info_8168c_1[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
		{ 0x02, 0x0800,	0x1000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
		{ 0x03, 0,	0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
		{ 0x06, 0x0080,	0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	__rtl_hw_start_8168cp(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	static struct ephy_info e_info_8168c_2[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
		{ 0x01, 0,	0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
		{ 0x03, 0x0400,	0x0220 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	__rtl_hw_start_8168cp(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	rtl_hw_start_8168c_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
	__rtl_hw_start_8168cp(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
	rtl_disable_clock_request(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
static void rtl_hw_start_8168(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2715
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	RTL_W16(IntrMitigate, 0x5151);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	/* Work around for RxFIFO overflow. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
		tp->intr_event |= RxFIFOOver | PCSTimeout;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		tp->intr_event &= ~RxOverflow;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
		(InterFrameGap << TxInterFrameGapShift));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	case RTL_GIGA_MAC_VER_11:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		rtl_hw_start_8168bb(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	case RTL_GIGA_MAC_VER_12:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
	case RTL_GIGA_MAC_VER_17:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
		rtl_hw_start_8168bef(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
	case RTL_GIGA_MAC_VER_18:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		rtl_hw_start_8168cp_1(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	case RTL_GIGA_MAC_VER_19:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
		rtl_hw_start_8168c_1(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	case RTL_GIGA_MAC_VER_20:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
		rtl_hw_start_8168c_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	case RTL_GIGA_MAC_VER_21:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		rtl_hw_start_8168c_3(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	case RTL_GIGA_MAC_VER_22:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
		rtl_hw_start_8168c_4(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	case RTL_GIGA_MAC_VER_23:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
		rtl_hw_start_8168cp_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	case RTL_GIGA_MAC_VER_24:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		rtl_hw_start_8168cp_3(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	case RTL_GIGA_MAC_VER_25:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		rtl_hw_start_8168d(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
			dev->name, tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
#define R810X_CPCMD_QUIRK_MASK (\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	EnableBist | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	Mac_dbgo_oe | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	Force_txflow_en | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	Cxpl_dbg_sel | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	ASF | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	PktCntrDisable | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	PCIDAC | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	PCIMulRW)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	static struct ephy_info e_info_8102e_1[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
		{ 0x01,	0, 0x6e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
		{ 0x02,	0, 0x091f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
		{ 0x03,	0, 0xc2f9 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
		{ 0x06,	0, 0xafb5 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
		{ 0x07,	0, 0x0e00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
		{ 0x19,	0, 0xec80 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		{ 0x01,	0, 0x2e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
		{ 0x01,	0, 0x6e65 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	u8 cfg1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
	RTL_W8(DBG_REG, FIX_NAK_1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	RTL_W8(Config1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	cfg1 = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
		RTL_W8(Config1, cfg1 & ~LEDS0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
static void rtl_hw_start_8101(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
		int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
		if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		rtl_hw_start_8102e_1(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		rtl_hw_start_8102e_3(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  2894
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
		return -EINVAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
	dev->mtu = new_mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	ret = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	if (ret < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
				struct sk_buff **sk_buff, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
			 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	dev_kfree_skb(*sk_buff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	*sk_buff = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
				       u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
	desc->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	rtl8169_mark_to_asic(desc, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
					    struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
					    struct RxDesc *desc, int rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
					    unsigned int align)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
	unsigned int pad;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
	pad = align ? align : NET_IP_ALIGN;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
	skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
				 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	return skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
static void rtl8169_rx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
	for (i = 0; i < NUM_RX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
		if (tp->Rx_skbuff[i]) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
					    tp->RxDescArray + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
			   u32 start, u32 end)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	u32 cur;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
	for (cur = start; end - cur != 0; cur++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
		struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
		unsigned int i = cur % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
		WARN_ON((s32)(end - cur) < 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
		if (tp->Rx_skbuff[i])
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
			continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
					   tp->RxDescArray + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
					   tp->rx_buf_sz, tp->align);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
		if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
		tp->Rx_skbuff[i] = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	return cur - start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	desc->opts1 |= cpu_to_le32(RingEnd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
static int rtl8169_init_ring(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
	rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	return -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
				 struct TxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
	unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	desc->opts1 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	desc->opts2 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
	desc->addr = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	tx_skb->len = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
static void rtl8169_tx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
		unsigned int entry = i % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
		unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
		if (len) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
			struct sk_buff *skb = tx_skb->skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
					     tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
			if (skb) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
				if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
					dev_kfree_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
				tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
			tp->dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	tp->cur_tx = tp->dirty_tx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
	PREPARE_DELAYED_WORK(&tp->task, task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
	schedule_delayed_work(&tp->task, 4);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
static void rtl8169_wait_for_quiescence(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
	synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
	/* Wait for any pending NAPI task to complete */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	napi_disable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
static void rtl8169_reinit_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
	rtl8169_close(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
	ret = rtl8169_open(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
	if (unlikely(ret < 0)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
		if (net_ratelimit() && netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
			printk(KERN_ERR PFX "%s: reinit failure (status = %d)."
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
			       " Rescheduling.\n", dev->name, ret);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
static void rtl8169_reset_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
	if (tp->dirty_rx == tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
		rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
		if (net_ratelimit() && netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
			printk(KERN_EMERG PFX "%s: Rx buffers shortage\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
		rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
static void rtl8169_tx_timeout(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
	if (tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	rtl8169_hw_reset(tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
	/* Let's wait a bit while any (async) irq lands on */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
			      u32 opts1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	struct skb_shared_info *info = skb_shinfo(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	unsigned int cur_frag, entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	struct TxDesc * uninitialized_var(txd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	entry = tp->cur_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
		skb_frag_t *frag = info->frags + cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
		u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		void *addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		entry = (entry + 1) % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
		txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
		len = frag->size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
		txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
		txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
		tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
	if (cur_frag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
		txd->opts1 |= cpu_to_le32(LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	return cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	if (dev->features & NETIF_F_TSO) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
		u32 mss = skb_shinfo(skb)->gso_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
		if (mss)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
			return LargeSend | ((mss & MSSMask) << MSSShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
		const struct iphdr *ip = ip_hdr(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		if (ip->protocol == IPPROTO_TCP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
			return IPCS | TCPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
		else if (ip->protocol == IPPROTO_UDP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
			return IPCS | UDPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		WARN_ON(1);	/* we need a WARN() */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	struct TxDesc *txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
	u32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	int ret = NETDEV_TX_OK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
		if (netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
			printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
			       "%s: BUG! Tx Ring full when queue awake!\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
	frags = rtl8169_xmit_frags(tp, skb, opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
	if (frags) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		len = skb_headlen(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
		opts1 |= FirstFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
		len = skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
		opts1 |= FirstFrag | LastFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
	tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
	tp->cur_tx += frags + 1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
		if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
			netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
			smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
			if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
				netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
err_stop:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
		netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	ret = NETDEV_TX_BUSY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
	dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
static void rtl8169_pcierr_interrupt(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	u16 pci_status, pci_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	if (netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
		printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
		       "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
		       dev->name, pci_cmd, pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	 * The recovery sequence below admits a very elaborated explanation:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	 * - it seems to work;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	 * - I did not see what else could be done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
	 * - it makes iop3xx happy.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	 * Feel free to adjust to your needs.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	if (pdev->broken_parity_status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
		pci_cmd &= ~PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
	pci_write_config_word(pdev, PCI_STATUS,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
		pci_status & (PCI_STATUS_DETECTED_PARITY |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
	/* The infamous DAC f*ckup only happens at boot time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		if (netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
			printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
		tp->cp_cmd &= ~PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
		RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
		dev->features &= ~NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	rtl8169_hw_reset(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
static void rtl8169_tx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
				 struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
				 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	unsigned int dirty_tx, tx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	dirty_tx = tp->dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
	tx_left = tp->cur_tx - dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
	while (tx_left > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
		unsigned int entry = dirty_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
		u32 len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		dev->stats.tx_bytes += len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		dev->stats.tx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
		if (status & LastFrag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
			if (!tp->ecdev)
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3427
				dev_kfree_skb(tx_skb->skb);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
			tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
		dirty_tx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
		tx_left--;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	if (tp->dirty_tx != dirty_tx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		tp->dirty_tx = dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		if (!tp->ecdev && netif_queue_stopped(dev) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
			netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
		 * too close. Let's kick an extra TxPoll request when a burst
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
		 * of start_xmit activity is detected (if it is not detected,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
		 * it is slow enough). -- FR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
		if (tp->cur_tx != dirty_tx)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
			RTL_W8(TxPoll, NPQ);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
static inline int rtl8169_fragmented_frame(u32 status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
	u32 opts1 = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	u32 status = opts1 & RxProtoMask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
		skb->ip_summed = CHECKSUM_UNNECESSARY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
		skb->ip_summed = CHECKSUM_NONE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
				       struct rtl8169_private *tp, int pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
				       dma_addr_t addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
	bool done = false;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
	if (pkt_size >= rx_copybreak)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
	skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
				    PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
	skb_reserve(skb, NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	*sk_buff = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
	done = true;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	return done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
static int rtl8169_rx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
				struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
				void __iomem *ioaddr, u32 budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
	unsigned int cur_rx, rx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
	unsigned int delta, count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
	cur_rx = tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	rx_left = min(rx_left, budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
	for (; rx_left > 0; rx_left--, cur_rx++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
		unsigned int entry = cur_rx % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
		struct RxDesc *desc = tp->RxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
		status = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
		if (unlikely(status & RxRES)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
			if (netif_msg_rx_err(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
				printk(KERN_INFO
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
				       "%s: Rx ERROR. status = %08x\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
				       dev->name, status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
			dev->stats.rx_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
			if (status & (RxRWT | RxRUNT))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
			if (status & RxCRC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
				dev->stats.rx_crc_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
			if (status & RxFOVF) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
				if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
					rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
				dev->stats.rx_fifo_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
			struct sk_buff *skb = tp->Rx_skbuff[entry];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
			dma_addr_t addr = le64_to_cpu(desc->addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
			int pkt_size = (status & 0x00001FFF) - 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
			struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
			/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
			 * The driver does not support incoming fragmented
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
			 * frames. They are seen as a symptom of over-mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
			 * sized frames.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
			 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
			if (unlikely(rtl8169_fragmented_frame(status))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
				dev->stats.rx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
				continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
			rtl8169_rx_csum(skb, desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
			if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
				pci_dma_sync_single_for_cpu(pdev, addr, pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
						PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
				ecdev_receive(tp->ecdev, skb->data, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
				pci_dma_sync_single_for_device(pdev, addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
						pkt_size, PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
				// No need to detect link status as
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
				// long as frames are received: Reset watchdog.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
				tp->ec_watchdog_jiffies = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
			} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
				if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
					pci_dma_sync_single_for_device(pdev, addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
						pkt_size, PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
					rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
				} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
					pci_unmap_single(pdev, addr, tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
							 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
					tp->Rx_skbuff[entry] = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
				}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
				skb_put(skb, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
				skb->protocol = eth_type_trans(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
				if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
					netif_receive_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
			dev->stats.rx_bytes += pkt_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
			dev->stats.rx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
		/* Work around for AMD plateform. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
			desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
			cur_rx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	count = cur_rx - tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
	tp->cur_rx = cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
	if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
		/* descriptors are cleaned up immediately. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
		tp->dirty_rx = tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
		delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
		if (!delta && count && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
			printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
		tp->dirty_rx += delta;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
		 * FIXME: until there is periodic timer to try and refill the ring,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
		 * a temporary shortage may definitely kill the Rx process.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
		 * - disable the asic to try and avoid an overflow and kick it again
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
		 *   after refill ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
		 * - how do others driver handle this condition (Uh oh...).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
		if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
			printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
	return count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
	struct net_device *dev = dev_instance;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
	int handled = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	int status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3630
	/* loop handling interrupts until we have no new ones or
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3631
	 * we hit a invalid/hotplug case.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3632
	 */
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	status = RTL_R16(IntrStatus);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3634
	while (status && status != 0xffff) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3635
		handled = 1;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3636
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3637
		/* Handle all of the error cases first. These will reset
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3638
		 * the chip, so just exit the loop.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3639
		 */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3640
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3641
			rtl8169_asic_down(ioaddr);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3642
			break;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
		}
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3644
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3645
		/* Work around for rx fifo overflow */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3646
		if (unlikely(status & RxFIFOOver) &&
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3647
		(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3648
			netif_stop_queue(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3649
			rtl8169_tx_timeout(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3650
			break;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3651
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3652
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3653
		if (unlikely(status & SYSErr)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3654
			rtl8169_pcierr_interrupt(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3655
			break;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3656
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3657
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3658
		if (status & LinkChg)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3659
			rtl8169_check_link_status(dev, tp, ioaddr);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3660
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3661
		/* We need to see the lastest version of tp->intr_mask to
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3662
		 * avoid ignoring an MSI interrupt and having to wait for
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3663
		 * another event which may never come.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3664
		 */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3665
		smp_rmb();
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3666
		if (status & tp->intr_mask & tp->napi_event) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3667
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3668
			tp->intr_mask = ~tp->napi_event;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3669
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3670
			if (likely(napi_schedule_prep(&tp->napi)))
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3671
				__napi_schedule(&tp->napi);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3672
			else if (netif_msg_intr(tp)) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3673
				printk(KERN_INFO "%s: interrupt %04x in poll\n",
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3674
				dev->name, status);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3675
			}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3676
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3677
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3678
		/* We only get a new MSI interrupt when all active irq
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3679
		 * sources on the chip have been acknowledged. So, ack
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3680
		 * everything we've seen and check if new sources have become
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3681
		 * active to avoid blocking all interrupts from the chip.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3682
		 */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3683
		RTL_W16(IntrStatus,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3684
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3685
		status = RTL_R16(IntrStatus);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3686
	}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3687
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
	return IRQ_RETVAL(handled);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
static void ec_poll(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	rtl8169_interrupt(pdev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
    if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
		rtl8169_phy_timer((unsigned long) dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
		tp->ec_watchdog_jiffies = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
static int rtl8169_poll(struct napi_struct *napi, int budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	int work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
	rtl8169_tx_interrupt(dev, tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	if (work_done < budget) {
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3717
		napi_complete(napi);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3718
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3719
		/* We need for force the visibility of tp->intr_mask
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3720
		 * for other CPUs, as we can loose an MSI interrupt
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3721
		 * and potentially wait for a retransmit timeout if we don't.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3722
		 * The posted write to IntrMask is safe, as it will
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3723
		 * eventually make it to the chip and we won't loose anything
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3724
		 * until it does.
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3725
		 */
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
		tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
	return work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
static void rtl8169_down(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
	unsigned int intrmask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	rtl8169_delete_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
		netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
		napi_disable(&tp->napi);
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3757
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3758
	}
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
core_down:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
		spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
	rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
		spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
		synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	/* Give a racing hard_start_xmit a few cycles to complete. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
	 * And now for the 50k$ question: are IRQ disabled or not ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	 * Two paths lead here:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	 * 1) dev->close
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	 *    -> netif_running() is available to sync the current code and the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	 *       IRQ handler. See rtl8169_interrupt for details.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
	 * 2) dev->change_mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
	 *    -> rtl8169_poll can not be issued again and re-enable the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	 *       interruptions. Let's simply issue the IRQ down sequence again.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
	 * No loop if hotpluged or major error (0xffff).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
	intrmask = RTL_R16(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
	if (intrmask && (intrmask != 0xffff))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		goto core_down;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
static int rtl8169_close(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3803
	/* update counters before going down */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3804
	rtl8169_update_counters(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3805
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
		free_irq(dev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
	tp->TxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
	tp->RxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
static void rtl_set_rx_mode(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	u32 mc_filter[2];	/* Multicast hash filter */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
	int rx_mode;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
	u32 tmp = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
	if (dev->flags & IFF_PROMISC) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
		/* Unconditionally log net taps. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
			printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
		rx_mode =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
		    AcceptAllPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
	} else if ((dev->mc_count > multicast_filter_limit)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
		   || (dev->flags & IFF_ALLMULTI)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
		/* Too many to filter perfectly -- accept all multicasts. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
		struct dev_mc_list *mclist;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
		unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
		rx_mode = AcceptBroadcast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
		mc_filter[1] = mc_filter[0] = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
		     i++, mclist = mclist->next) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
			rx_mode |= AcceptMulticast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	tmp = rtl8169_rx_config | rx_mode |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3864
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
		u32 data = mc_filter[0];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
		mc_filter[0] = swab32(mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
		mc_filter[1] = swab32(data);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
	RTL_W32(MAR0 + 0, mc_filter[0]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	RTL_W32(MAR0 + 4, mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	RTL_W32(RxConfig, tmp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
/**
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
 *  @dev: The Ethernet Device to get statistics for
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
 *  Get TX/RX statistics for rtl8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	if (netif_running(dev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
		spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
		rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
		spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3895
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	return &dev->stats;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3900
static void rtl8169_net_suspend(struct net_device *dev)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3901
{
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3902
	if (!netif_running(dev))
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3903
		return;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3904
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3905
	netif_device_detach(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3906
	netif_stop_queue(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3907
}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3908
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
#ifdef CONFIG_PM
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3911
static int rtl8169_suspend(struct device *device)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3912
{
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3913
	struct pci_dev *pdev = to_pci_dev(device);
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
	struct rtl8169_private *tp = netdev_priv(dev);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  3916
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3917
	if (tp->ecdev)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3918
 		return -EBUSY;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3919
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3920
	rtl8169_net_suspend(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3921
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3922
	return 0;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3923
}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3924
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3925
static int rtl8169_resume(struct device *device)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3926
{
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3927
	struct pci_dev *pdev = to_pci_dev(device);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3928
	struct net_device *dev = pci_get_drvdata(pdev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3929
	struct rtl8169_private *tp = netdev_priv(dev);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1995
diff changeset
  3930
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
	if (tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
		return -EBUSY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
	netif_device_attach(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3942
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3943
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3944
static struct dev_pm_ops rtl8169_pm_ops = {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3945
	.suspend = rtl8169_suspend,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3946
	.resume = rtl8169_resume,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3947
	.freeze = rtl8169_suspend,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3948
	.thaw = rtl8169_resume,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3949
	.poweroff = rtl8169_suspend,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3950
	.restore = rtl8169_resume,
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3951
};
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3952
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3953
#define RTL8169_PM_OPS	(&rtl8169_pm_ops)
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3954
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3955
#else /* !CONFIG_PM */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3956
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3957
#define RTL8169_PM_OPS	NULL
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3958
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3959
#endif /* !CONFIG_PM */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3960
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3961
static void rtl_shutdown(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3962
{
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3963
	struct net_device *dev = pci_get_drvdata(pdev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3964
	struct rtl8169_private *tp = netdev_priv(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3965
	void __iomem *ioaddr = tp->mmio_addr;
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3966
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3967
	rtl8169_net_suspend(dev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3968
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3969
	spin_lock_irq(&tp->lock);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3970
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3971
	rtl8169_asic_down(ioaddr);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3972
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3973
	spin_unlock_irq(&tp->lock);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3974
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3975
	if (system_state == SYSTEM_POWER_OFF) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3976
		/* WoL fails with some 8168 when the receiver is disabled. */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3977
		if (tp->features & RTL_FEATURE_WOL) {
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3978
			pci_clear_master(pdev);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3979
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3980
			RTL_W8(ChipCmd, CmdRxEnb);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3981
			/* PCI commit */
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3982
			RTL_R8(ChipCmd);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3983
		}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3984
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3985
		pci_wake_from_d3(pdev, true);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3986
		pci_set_power_state(pdev, PCI_D3hot);
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3987
	}
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3988
}
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3989
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3990
static struct pci_driver rtl8169_pci_driver = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3991
	.name		= MODULENAME,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3992
	.id_table	= rtl8169_pci_tbl,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3993
	.probe		= rtl8169_init_one,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3994
	.remove		= __devexit_p(rtl8169_remove_one),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3995
	.shutdown	= rtl_shutdown,
1929
b5dab7ee6cf7 Added r8169 port based on 2.6.31.13 by M. L?scher.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3996
	.driver.pm	= RTL8169_PM_OPS,
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3997
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3998
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3999
static int __init rtl8169_init_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4000
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4001
	return pci_register_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4002
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4003
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4004
static void __exit rtl8169_cleanup_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4005
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4006
	pci_unregister_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4007
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4009
module_init(rtl8169_init_module);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  4010
module_exit(rtl8169_cleanup_module);