devices/r8169-2.6.28-ethercat.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2589 2b9c78543663
permissions -rw-r--r--
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
1479
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 * vim: noexpandtab
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/module.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/moduleparam.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/pci.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/netdevice.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/etherdevice.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/delay.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/ethtool.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/mii.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/if_vlan.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/crc32.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/in.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/ip.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/tcp.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/init.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/dma-mapping.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "../globals.h"
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "ecdev.h"
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define RTL8169_VERSION "2.3LK-NAPI"
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define MODULENAME "ec_r8169"
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define PFX MODULENAME ": "
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#ifdef RTL8169_DEBUG
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define assert(expr) \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	if (!(expr)) {					\
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
		#expr,__FILE__,__func__,__LINE__);		\
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define dprintk(fmt, args...) \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define assert(expr) do {} while (0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define dprintk(fmt, args...)	do {} while (0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#endif /* RTL8169_DEBUG */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define R8169_MSG_DEFAULT \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define TX_BUFFS_AVAIL(tp) \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
static const int max_interrupt_work = 20;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
static const int multicast_filter_limit = 32;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
/* MAC address length */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define MAC_ADDR_LEN	6
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define MAX_READ_REQUEST_SHIFT	12
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define RxPacketMaxSize	0x3FE8	/* 16K - 1 - ETH_HLEN - VLAN - CRC... */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_REGS_SIZE		256
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define R8169_NAPI_WEIGHT	64
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL8169_TX_TIMEOUT	(6*HZ)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
#define RTL8169_PHY_TIMEOUT	(10*HZ)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_EEPROM_SIG		cpu_to_le32(0x8129)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_EEPROM_SIG_ADDR	0x0000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
/* write/read MMIO register */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
#define RTL_R8(reg)		readb (ioaddr + (reg))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
#define RTL_R16(reg)		readw (ioaddr + (reg))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
enum mac_version {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	RTL_GIGA_MAC_VER_20 = 0x14, // 8168C
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	RTL_GIGA_MAC_VER_21 = 0x15, // 8168C
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
	RTL_GIGA_MAC_VER_22 = 0x16, // 8168C
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	RTL_GIGA_MAC_VER_23 = 0x17, // 8168CP
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	RTL_GIGA_MAC_VER_24 = 0x18, // 8168CP
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	RTL_GIGA_MAC_VER_25 = 0x19  // 8168D
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
#define _R(NAME,MAC,MASK) \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
static const struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	const char *name;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	u8 mac_version;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
} rtl_chip_info[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_21, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_22, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_23, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_24, 0xff7e1880), // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
	_R("RTL8168d/8111d",	RTL_GIGA_MAC_VER_25, 0xff7e1880)  // PCI-E
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
#undef _R
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
enum cfg_version {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	RTL_CFG_0 = 0x00,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	RTL_CFG_1,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	RTL_CFG_2
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
static void rtl_hw_start_8169(struct net_device *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
static void rtl_hw_start_8168(struct net_device *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
static void rtl_hw_start_8101(struct net_device *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
static struct pci_device_id rtl8169_pci_tbl[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
	{ 0x0001,				0x8168,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	{0,},
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/* prevent driver from being loaded automatically */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
static int rx_copybreak = 200;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
static int use_dac;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
static struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	u32 msg_enable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
} debug = { -1 };
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
enum rtl_registers {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	MAC0		= 0,	/* Ethernet hardware address. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	MAC4		= 4,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	MAR0		= 8,	/* Multicast filter. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	CounterAddrLow		= 0x10,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	CounterAddrHigh		= 0x14,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	TxDescStartAddrLow	= 0x20,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	TxDescStartAddrHigh	= 0x24,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	TxHDescStartAddrLow	= 0x28,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	TxHDescStartAddrHigh	= 0x2c,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	FLASH		= 0x30,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	ERSR		= 0x36,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	ChipCmd		= 0x37,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	TxPoll		= 0x38,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	IntrMask	= 0x3c,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	IntrStatus	= 0x3e,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	TxConfig	= 0x40,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	RxConfig	= 0x44,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	RxMissed	= 0x4c,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	Cfg9346		= 0x50,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	Config0		= 0x51,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	Config1		= 0x52,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	Config2		= 0x53,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	Config3		= 0x54,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	Config4		= 0x55,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
	Config5		= 0x56,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
	MultiIntr	= 0x5c,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
	PHYAR		= 0x60,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	PHYstatus	= 0x6c,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	RxMaxSize	= 0xda,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	CPlusCmd	= 0xe0,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	IntrMitigate	= 0xe2,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	RxDescAddrLow	= 0xe4,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
	RxDescAddrHigh	= 0xe8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	EarlyTxThres	= 0xec,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	FuncEvent	= 0xf0,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
	FuncEventMask	= 0xf4,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	FuncPresetState	= 0xf8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	FuncForceEvent	= 0xfc,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
enum rtl8110_registers {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	TBICSR			= 0x64,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	TBI_ANAR		= 0x68,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	TBI_LPAR		= 0x6a,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
enum rtl8168_8101_registers {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	CSIDR			= 0x64,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	CSIAR			= 0x68,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	CSIAR_FLAG			0x80000000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
#define	CSIAR_WRITE_CMD			0x80000000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
#define	CSIAR_BYTE_ENABLE		0x0f
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
#define	CSIAR_BYTE_ENABLE_SHIFT		12
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
#define	CSIAR_ADDR_MASK			0x0fff
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	EPHYAR			= 0x80,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#define	EPHYAR_FLAG			0x80000000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
#define	EPHYAR_WRITE_CMD		0x80000000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
#define	EPHYAR_REG_MASK			0x1f
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define	EPHYAR_REG_SHIFT		16
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#define	EPHYAR_DATA_MASK		0xffff
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	DBG_REG			= 0xd1,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#define	FIX_NAK_1			(1 << 4)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
#define	FIX_NAK_2			(1 << 3)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
enum rtl_register_content {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	/* InterruptStatusBits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	SYSErr		= 0x8000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	PCSTimeout	= 0x4000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	SWInt		= 0x0100,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	TxDescUnavail	= 0x0080,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	RxFIFOOver	= 0x0040,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	LinkChg		= 0x0020,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	RxOverflow	= 0x0010,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	TxErr		= 0x0008,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	TxOK		= 0x0004,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	RxErr		= 0x0002,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
	RxOK		= 0x0001,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	/* RxStatusDesc */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	RxFOVF	= (1 << 23),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	RxRWT	= (1 << 22),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
	RxRES	= (1 << 21),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	RxRUNT	= (1 << 20),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	RxCRC	= (1 << 19),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
	/* ChipCmdBits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	CmdReset	= 0x10,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	CmdRxEnb	= 0x08,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	CmdTxEnb	= 0x04,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	RxBufEmpty	= 0x01,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	/* TXPoll register p.5 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	FSWInt		= 0x01,		/* Forced software interrupt */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	/* Cfg9346Bits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	Cfg9346_Lock	= 0x00,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	Cfg9346_Unlock	= 0xc0,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	/* rx_mode_bits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	AcceptErr	= 0x20,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	AcceptRunt	= 0x10,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	AcceptBroadcast	= 0x08,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	AcceptMulticast	= 0x04,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	AcceptMyPhys	= 0x02,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	AcceptAllPhys	= 0x01,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	/* RxConfigBits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	RxCfgFIFOShift	= 13,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	RxCfgDMAShift	=  8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	/* TxConfigBits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	TxInterFrameGapShift = 24,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* Config1 register p.24 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	LEDS1		= (1 << 7),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	LEDS0		= (1 << 6),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	Speed_down	= (1 << 4),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	MEMMAP		= (1 << 3),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	IOMAP		= (1 << 2),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	VPD		= (1 << 1),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	PMEnable	= (1 << 0),	/* Power Management Enable */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	/* Config2 register p. 25 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	PCI_Clock_66MHz = 0x01,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	PCI_Clock_33MHz = 0x00,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	/* Config3 register p.25 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	/* Config5 register p.27 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	LanWake		= (1 << 1),	/* LanWake enable/disable */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	/* TBICSR p.28 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	TBIReset	= 0x80000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	TBILoopback	= 0x40000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	TBINwEnable	= 0x20000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	TBINwRestart	= 0x10000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	TBILinkOk	= 0x02000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	TBINwComplete	= 0x01000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	/* CPlusCmd p.31 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	EnableBist	= (1 << 15),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	Normal_mode	= (1 << 13),	// unused
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	Force_half_dup	= (1 << 12),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	Force_rxflow_en	= (1 << 11),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	Force_txflow_en	= (1 << 10),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	ASF		= (1 << 8),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	PktCntrDisable	= (1 << 7),	// 8168 8101
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	Mac_dbgo_sel	= 0x001c,	// 8168
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	RxVlan		= (1 << 6),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	RxChkSum	= (1 << 5),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	PCIDAC		= (1 << 4),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	PCIMulRW	= (1 << 3),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	INTT_0		= 0x0000,	// 8168
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	INTT_1		= 0x0001,	// 8168
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	INTT_2		= 0x0002,	// 8168
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	INTT_3		= 0x0003,	// 8168
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	/* rtl8169_PHYstatus */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
	TBI_Enable	= 0x80,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
	TxFlowCtrl	= 0x40,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	RxFlowCtrl	= 0x20,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	_1000bpsF	= 0x10,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	_100bps		= 0x08,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	_10bps		= 0x04,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	LinkStatus	= 0x02,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	FullDup		= 0x01,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	/* _TBICSRBit */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	TBILinkOK	= 0x02000000,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	/* DumpCounterCommand */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	CounterDump	= 0x8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
enum desc_status_bit {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	RingEnd		= (1 << 30), /* End of descriptor ring */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	FirstFrag	= (1 << 29), /* First segment of a packet */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	LastFrag	= (1 << 28), /* Final segment of a packet */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	/* Tx private */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	MSSShift	= 16,        /* MSS value position */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	IPCS		= (1 << 18), /* Calculate IP checksum */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	/* Rx private */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
#define RxProtoUDP	(PID1)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
#define RxProtoTCP	(PID0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
#define RxProtoIP	(PID1 | PID0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
#define RxProtoMask	RxProtoIP
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	IPFail		= (1 << 16), /* IP checksum failed */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	RxVlanTag	= (1 << 16), /* VLAN tag available */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
#define RsvdMask	0x3fffc000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
struct TxDesc {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	__le32 opts1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	__le32 opts2;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	__le64 addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
struct RxDesc {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	__le32 opts1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	__le32 opts2;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
	__le64 addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
struct ring_info {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	struct sk_buff	*skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	u32		len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	u8		__pad[sizeof(void *) - sizeof(u32)];
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
enum features {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	RTL_FEATURE_WOL		= (1 << 0),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	RTL_FEATURE_MSI		= (1 << 1),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	RTL_FEATURE_GMII	= (1 << 2),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
struct rtl8169_private {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	void __iomem *mmio_addr;	/* memory map physical address */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	struct pci_dev *pci_dev;	/* Index of PCI device */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	struct net_device *dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	struct napi_struct napi;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	spinlock_t lock;		/* spin lock flag */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	u32 msg_enable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	int chipset;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	int mac_version;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	u32 dirty_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	u32 dirty_tx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	dma_addr_t TxPhyAddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	dma_addr_t RxPhyAddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	unsigned align;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	unsigned rx_buf_sz;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	struct timer_list timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	u16 cp_cmd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	u16 intr_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	u16 napi_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	u16 intr_mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	int phy_auto_nego_reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	int phy_1000_ctrl_reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
#ifdef CONFIG_R8169_VLAN
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	struct vlan_group *vlgrp;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	void (*phy_reset_enable)(void __iomem *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	void (*hw_start)(struct net_device *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	unsigned int (*phy_reset_pending)(void __iomem *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	unsigned int (*link_ok)(void __iomem *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	int pcie_cap;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	struct delayed_work task;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	unsigned features;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	struct mii_if_info mii;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	ec_device_t *ecdev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	unsigned long ec_watchdog_jiffies;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
MODULE_DESCRIPTION("EtherCAT-capable RealTek RTL-8169 Gigabit Ethernet driver");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
module_param(rx_copybreak, int, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
module_param(use_dac, int, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
module_param_named(debug, debug.msg_enable, int, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
MODULE_LICENSE("GPL");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
MODULE_VERSION(EC_MASTER_VERSION);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
static int rtl8169_open(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
static int rtl8169_init_ring(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
static void rtl_hw_start(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
static int rtl8169_close(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
static void rtl_set_rx_mode(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
static void rtl8169_tx_timeout(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
				void __iomem *, u32 budget);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
static void rtl8169_down(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
static void rtl8169_rx_clear(struct rtl8169_private *tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
static void ec_poll(struct net_device *dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static int rtl8169_poll(struct napi_struct *napi, int budget);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
static const unsigned int rtl8169_rx_config =
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	for (i = 20; i > 0; i--) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
		 * Check if the RTL8169 has completed writing to the specified
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
		 * MII register.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		if (!(RTL_R32(PHYAR) & 0x80000000))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		udelay(25);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
static int mdio_read(void __iomem *ioaddr, int reg_addr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	int i, value = -1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	for (i = 20; i > 0; i--) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
		 * Check if the RTL8169 has completed retrieving data from
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		 * the specified MII register.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		if (RTL_R32(PHYAR) & 0x80000000) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
			value = RTL_R32(PHYAR) & 0xffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
		udelay(25);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
	return value;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
			   int val)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	mdio_write(ioaddr, location, val);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	return mdio_read(ioaddr, location);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
		udelay(10);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	u16 value = 0xffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
		udelay(10);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	return value;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	RTL_W32(CSIDR, value);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
		udelay(10);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
	u32 value = ~0x00;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
			value = RTL_R32(CSIDR);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
		udelay(10);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	return value;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	RTL_W16(IntrMask, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	RTL_W16(IntrStatus, 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
static void rtl8169_asic_down(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
	RTL_W8(ChipCmd, 0x00);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	rtl8169_irq_mask_and_ack(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	RTL_R16(CPlusCmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
	return RTL_R32(TBICSR) & TBIReset;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
	return RTL_R32(TBICSR) & TBILinkOk;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	return RTL_R8(PHYstatus) & LinkStatus;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	unsigned int val;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
static void rtl8169_check_link_status(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
				      struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
				      void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
    if (tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
		if (tp->link_ok(ioaddr)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
			netif_carrier_on(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
			if (netif_msg_ifup(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
				printk(KERN_INFO PFX "%s: link up\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
		} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
			if (netif_msg_ifdown(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
				printk(KERN_INFO PFX "%s: link down\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
			netif_carrier_off(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
		spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	u8 options;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	wol->wolopts = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	wol->supported = WAKE_ANY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	options = RTL_R8(Config1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
	if (!(options & PMEnable))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
		goto out_unlock;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	options = RTL_R8(Config3);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
	if (options & LinkUp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
		wol->wolopts |= WAKE_PHY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	if (options & MagicPacket)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		wol->wolopts |= WAKE_MAGIC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	options = RTL_R8(Config5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	if (options & UWF)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
		wol->wolopts |= WAKE_UCAST;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	if (options & BWF)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		wol->wolopts |= WAKE_BCAST;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	if (options & MWF)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		wol->wolopts |= WAKE_MCAST;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
out_unlock:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	static struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
		u32 opt;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
		u16 reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		u8  mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	} cfg[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		{ WAKE_ANY,   Config1, PMEnable },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
		{ WAKE_PHY,   Config3, LinkUp },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		{ WAKE_MAGIC, Config3, MagicPacket },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
		{ WAKE_UCAST, Config5, UWF },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
		{ WAKE_BCAST, Config5, BWF },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
		{ WAKE_MCAST, Config5, MWF },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		{ WAKE_ANY,   Config5, LanWake }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
		if (wol->wolopts & cfg[i].opt)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
			options |= cfg[i].mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		RTL_W8(cfg[i].reg, options);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	if (wol->wolopts)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		tp->features |= RTL_FEATURE_WOL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		tp->features &= ~RTL_FEATURE_WOL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
	spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
static void rtl8169_get_drvinfo(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
				struct ethtool_drvinfo *info)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
	strcpy(info->driver, MODULENAME);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	strcpy(info->version, RTL8169_VERSION);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	strcpy(info->bus_info, pci_name(tp->pci_dev));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
static int rtl8169_get_regs_len(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	return R8169_REGS_SIZE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
static int rtl8169_set_speed_tbi(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
				 u8 autoneg, u16 speed, u8 duplex)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	int ret = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	u32 reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
	reg = RTL_R32(TBICSR);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	    (duplex == DUPLEX_FULL)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	} else if (autoneg == AUTONEG_ENABLE)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
	else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		if (netif_msg_link(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
			printk(KERN_WARNING "%s: "
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
			       "incorrect speed setting refused in TBI mode\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
			       dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		ret = -EOPNOTSUPP;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
static int rtl8169_set_speed_xmii(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
				  u8 autoneg, u16 speed, u8 duplex)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
	int auto_nego, giga_ctrl;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
	auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		       ADVERTISE_100HALF | ADVERTISE_100FULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
	giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
	if (autoneg == AUTONEG_ENABLE) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		if (speed == SPEED_10)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
			auto_nego |= ADVERTISE_10HALF | ADVERTISE_10FULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
		else if (speed == SPEED_100)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
			auto_nego |= ADVERTISE_100HALF | ADVERTISE_100FULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		else if (speed == SPEED_1000)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		if (duplex == DUPLEX_HALF)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
			auto_nego &= ~(ADVERTISE_10FULL | ADVERTISE_100FULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
		if (duplex == DUPLEX_FULL)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
			auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_100HALF);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		/* This tweak comes straight from Realtek's driver. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		if ((speed == SPEED_100) && (duplex == DUPLEX_HALF) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
		    ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		     (tp->mac_version == RTL_GIGA_MAC_VER_16))) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
			auto_nego = ADVERTISE_100HALF | ADVERTISE_CSMA;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
	/* The 8100e/8101e/8102e do Fast Ethernet only. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
	if ((tp->mac_version == RTL_GIGA_MAC_VER_07) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
	    (tp->mac_version == RTL_GIGA_MAC_VER_08) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	    (tp->mac_version == RTL_GIGA_MAC_VER_09) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	    (tp->mac_version == RTL_GIGA_MAC_VER_10) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
	    (tp->mac_version == RTL_GIGA_MAC_VER_13) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	    (tp->mac_version == RTL_GIGA_MAC_VER_14) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
	    (tp->mac_version == RTL_GIGA_MAC_VER_15) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		if ((giga_ctrl & (ADVERTISE_1000FULL | ADVERTISE_1000HALF)) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
		    netif_msg_link(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
			printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
			       dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
	auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
	    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
		 * Wake up the PHY.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
		 * Vendor specific (0x1f) and reserved (0x0e) MII registers.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
		mdio_write(ioaddr, 0x0e, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
	tp->phy_auto_nego_reg = auto_nego;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	tp->phy_1000_ctrl_reg = giga_ctrl;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	mdio_write(ioaddr, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
static int rtl8169_set_speed(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
			     u8 autoneg, u16 speed, u8 duplex)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
	int ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
	ret = tp->set_speed(dev, autoneg, speed, duplex);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	int ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
static u32 rtl8169_get_rx_csum(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	return tp->cp_cmd & RxChkSum;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	if (data)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
		tp->cp_cmd |= RxChkSum;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
		tp->cp_cmd &= ~RxChkSum;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
	RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	RTL_R16(CPlusCmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
#ifdef CONFIG_R8169_VLAN
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
				      struct sk_buff *skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
static void rtl8169_vlan_rx_register(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
				     struct vlan_group *grp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
	tp->vlgrp = grp;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	if (tp->vlgrp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
		tp->cp_cmd |= RxVlan;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
		tp->cp_cmd &= ~RxVlan;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	RTL_R16(CPlusCmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
			       struct sk_buff *skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	u32 opts2 = le32_to_cpu(desc->opts2);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	struct vlan_group *vlgrp = tp->vlgrp;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	int ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	if (vlgrp && (opts2 & RxVlanTag)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
		vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
		ret = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	} else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
		ret = -1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	desc->opts2 = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
#else /* !CONFIG_R8169_VLAN */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
				      struct sk_buff *skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
			       struct sk_buff *skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	return -1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
	u32 status;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
	cmd->supported =
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	cmd->port = PORT_FIBRE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
	cmd->transceiver = XCVR_INTERNAL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	status = RTL_R32(TBICSR);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
	cmd->autoneg = !!(status & TBINwEnable);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
	cmd->speed = SPEED_1000;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	cmd->duplex = DUPLEX_FULL; /* Always set */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	return mii_ethtool_gset(&tp->mii, cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	int rc;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	rc = tp->get_settings(dev, cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	return rc;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
			     void *p)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	if (regs->len > R8169_REGS_SIZE)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
		regs->len = R8169_REGS_SIZE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	memcpy_fromio(p, tp->mmio_addr, regs->len);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
static u32 rtl8169_get_msglevel(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	return tp->msg_enable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	tp->msg_enable = value;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	"tx_packets",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
	"rx_packets",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	"tx_errors",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	"rx_errors",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	"rx_missed",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	"align_errors",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	"tx_single_collisions",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
	"tx_multi_collisions",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	"unicast",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	"broadcast",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	"multicast",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	"tx_aborted",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	"tx_underrun",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
struct rtl8169_counters {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	__le64	tx_packets;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	__le64	rx_packets;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	__le64	tx_errors;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	__le32	rx_errors;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	__le16	rx_missed;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
	__le16	align_errors;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
	__le32	tx_one_collision;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
	__le32	tx_multi_collision;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
	__le64	rx_unicast;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	__le64	rx_broadcast;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	__le32	rx_multicast;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	__le16	tx_aborted;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	__le16	tx_underun;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	switch (sset) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	case ETH_SS_STATS:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
		return ARRAY_SIZE(rtl8169_gstrings);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	default:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
		return -EOPNOTSUPP;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
static void rtl8169_get_ethtool_stats(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
				      struct ethtool_stats *stats, u64 *data)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	struct rtl8169_counters *counters;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
	dma_addr_t paddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	u32 cmd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	ASSERT_RTNL();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	if (!counters)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
	cmd = (u64)paddr & DMA_32BIT_MASK;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	RTL_W32(CounterAddrLow, cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	RTL_W32(CounterAddrLow, cmd | CounterDump);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
	while (RTL_R32(CounterAddrLow) & CounterDump) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
		if (msleep_interruptible(1))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
	RTL_W32(CounterAddrLow, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	RTL_W32(CounterAddrHigh, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
	data[0] = le64_to_cpu(counters->tx_packets);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	data[1] = le64_to_cpu(counters->rx_packets);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
	data[2] = le64_to_cpu(counters->tx_errors);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
	data[3] = le32_to_cpu(counters->rx_errors);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
	data[4] = le16_to_cpu(counters->rx_missed);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
	data[5] = le16_to_cpu(counters->align_errors);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
	data[6] = le32_to_cpu(counters->tx_one_collision);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	data[7] = le32_to_cpu(counters->tx_multi_collision);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
	data[8] = le64_to_cpu(counters->rx_unicast);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	data[9] = le64_to_cpu(counters->rx_broadcast);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
	data[10] = le32_to_cpu(counters->rx_multicast);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	data[11] = le16_to_cpu(counters->tx_aborted);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	data[12] = le16_to_cpu(counters->tx_underun);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	switch(stringset) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	case ETH_SS_STATS:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
static const struct ethtool_ops rtl8169_ethtool_ops = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	.get_drvinfo		= rtl8169_get_drvinfo,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	.get_regs_len		= rtl8169_get_regs_len,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
	.get_link		= ethtool_op_get_link,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	.get_settings		= rtl8169_get_settings,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	.set_settings		= rtl8169_set_settings,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
	.get_msglevel		= rtl8169_get_msglevel,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
	.set_msglevel		= rtl8169_set_msglevel,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	.get_rx_csum		= rtl8169_get_rx_csum,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	.set_rx_csum		= rtl8169_set_rx_csum,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
	.set_tx_csum		= ethtool_op_set_tx_csum,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
	.set_sg			= ethtool_op_set_sg,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	.set_tso		= ethtool_op_set_tso,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	.get_regs		= rtl8169_get_regs,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	.get_wol		= rtl8169_get_wol,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	.set_wol		= rtl8169_set_wol,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	.get_strings		= rtl8169_get_strings,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	.get_sset_count		= rtl8169_get_sset_count,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
				       int bitnum, int bitval)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	int val;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	val = mdio_read(ioaddr, reg);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	val = (bitval == 1) ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	mdio_write(ioaddr, reg, val & 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
				    void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
	 * The driver currently handles the 8168Bf and the 8168Be identically
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	 * but they can be identified more specifically through the test below
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	 * if needed:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	 * Same thing for the 8101Eb and the 8101Ec:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	const struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		u32 mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
		u32 val;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
		int mac_version;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	} mac_info[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
		/* 8168D family. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
		{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_25 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
		/* 8168C family. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
		{ 0x7cf00000, 0x3ca00000,	RTL_GIGA_MAC_VER_24 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
		{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
		{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
		{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		/* 8168B family. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		/* 8101 family. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		/* FIXME: where did these entries come from ? -- FR */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		/* 8110 family. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_VER_01 }	/* Catch-all */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
	}, *p = mac_info;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
	u32 reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
	reg = RTL_R32(TxConfig);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	while ((reg & p->mask) != p->val)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
		p++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	tp->mac_version = p->mac_version;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	if (p->mask == 0x00000000) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
		dev_info(&pdev->dev, "unknown MAC (%08x)\n", reg);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
struct phy_reg {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
	u16 reg;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
	u16 val;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
static void rtl_phy_write(void __iomem *ioaddr, struct phy_reg *regs, int len)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
	while (len-- > 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		mdio_write(ioaddr, regs->reg, regs->val);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		regs++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		u16 regs[5]; /* Beware of bit-sign propagation */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	} phy_magic[5] = { {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		{ 0x0000,	//w 4 15 12 0
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		  0x00a1,	//w 3 15 0 00a1
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		  0x0008,	//w 2 15 0 0008
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		  0x1020,	//w 1 15 0 1020
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		  0x1000 } },{	//w 0 15 0 1000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		{ 0x7000,	//w 4 15 12 7
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		  0xff41,	//w 3 15 0 ff41
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		  0xde60,	//w 2 15 0 de60
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		  0x0140,	//w 1 15 0 0140
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		  0x0077 } },{	//w 0 15 0 0077
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		{ 0xa000,	//w 4 15 12 a
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		  0xdf01,	//w 3 15 0 df01
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		  0xdf20,	//w 2 15 0 df20
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		  0xff95,	//w 1 15 0 ff95
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		  0xfa00 } },{	//w 0 15 0 fa00
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		{ 0xb000,	//w 4 15 12 b
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		  0xff41,	//w 3 15 0 ff41
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		  0xde20,	//w 2 15 0 de20
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		  0x0140,	//w 1 15 0 0140
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		  0x00bb } },{	//w 0 15 0 00bb
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		{ 0xf000,	//w 4 15 12 f
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		  0xdf01,	//w 3 15 0 df01
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		  0xdf20,	//w 2 15 0 df20
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		  0xff95,	//w 1 15 0 ff95
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
		  0xbf00 }	//w 0 15 0 bf00
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	}, *p = phy_magic;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	mdio_write(ioaddr, 0x1f, 0x0001);		//w 31 2 0 1
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	mdio_write(ioaddr, 0x15, 0x1000);		//w 21 15 0 1000
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	mdio_write(ioaddr, 0x18, 0x65c7);		//w 24 15 0 65c7
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		int val, pos = 4;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
		mdio_write(ioaddr, pos, val);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		while (--pos >= 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
		{ 0x01, 0x90d0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
static void rtl8168bb_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		{ 0x10, 0xf41b },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
	mdio_write(ioaddr, 0x1f, 0x0001);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	mdio_patch(ioaddr, 0x16, 1 << 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
static void rtl8168bef_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		{ 0x10, 0xf41b },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
static void rtl8168cp_1_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
		{ 0x1d, 0x0f00 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
		{ 0x0c, 0x1ec8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
static void rtl8168cp_2_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x1d, 0x3d98 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
	mdio_patch(ioaddr, 0x14, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
	mdio_patch(ioaddr, 0x0d, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
static void rtl8168c_1_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
		{ 0x12, 0x2300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
		{ 0x00, 0x88d4 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
		{ 0x01, 0x82b1 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
		{ 0x03, 0x7002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
		{ 0x08, 0x9e30 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
		{ 0x09, 0x01f0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
		{ 0x0a, 0x5500 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
		{ 0x0c, 0x00c8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		{ 0x1f, 0x0003 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
		{ 0x12, 0xc096 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
		{ 0x16, 0x000a },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
		{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
		{ 0x09, 0x2000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		{ 0x09, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	mdio_patch(ioaddr, 0x14, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	mdio_patch(ioaddr, 0x0d, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
static void rtl8168c_2_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
		{ 0x12, 0x2300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		{ 0x03, 0x802f },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
		{ 0x02, 0x4f02 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		{ 0x01, 0x0409 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		{ 0x00, 0xf099 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		{ 0x04, 0x9800 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		{ 0x04, 0x9000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		{ 0x1d, 0x3d98 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		{ 0x0c, 0x7eb8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		{ 0x06, 0x0761 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
		{ 0x1f, 0x0003 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		{ 0x16, 0x0f0a },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	mdio_patch(ioaddr, 0x16, 1 << 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	mdio_patch(ioaddr, 0x14, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	mdio_patch(ioaddr, 0x0d, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
static void rtl8168c_3_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
		{ 0x12, 0x2300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		{ 0x1d, 0x3d98 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
		{ 0x0c, 0x7eb8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
		{ 0x06, 0x5461 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		{ 0x1f, 0x0003 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		{ 0x16, 0x0f0a },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
	mdio_patch(ioaddr, 0x16, 1 << 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	mdio_patch(ioaddr, 0x14, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	mdio_patch(ioaddr, 0x0d, 1 << 5);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
static void rtl8168c_4_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	rtl8168c_3_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
static void rtl8168d_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	struct phy_reg phy_reg_init_0[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		{ 0x1f, 0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		{ 0x09, 0x2770 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		{ 0x08, 0x04d0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		{ 0x0b, 0xad15 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		{ 0x0c, 0x5bf0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		{ 0x1c, 0xf101 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
		{ 0x1f, 0x0003 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
		{ 0x14, 0x94d7 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
		{ 0x12, 0xf4d6 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		{ 0x09, 0xca0f },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
		{ 0x0b, 0x0b10 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
		{ 0x0c, 0xd1f7 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
		{ 0x06, 0x5461 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
		{ 0x1f, 0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
		{ 0x05, 0x6662 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
		{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
		{ 0x14, 0x0060 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
		{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		{ 0x0d, 0xf8a0 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
		{ 0x1f, 0x0005 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
		{ 0x05, 0xffc2 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
	rtl_phy_write(ioaddr, phy_reg_init_0, ARRAY_SIZE(phy_reg_init_0));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	if (mdio_read(ioaddr, 0x06) == 0xc400) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
		struct phy_reg phy_reg_init_1[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
			{ 0x1f, 0x0005 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
			{ 0x01, 0x0300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
			{ 0x1f, 0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
			{ 0x11, 0x401c },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
			{ 0x16, 0x4100 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
			{ 0x1f, 0x0005 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
			{ 0x07, 0x0010 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
			{ 0x05, 0x83dc },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			{ 0x06, 0x087d },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
			{ 0x05, 0x8300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
			{ 0x06, 0x0101 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
			{ 0x06, 0x05f8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
			{ 0x06, 0xf9fa },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
			{ 0x06, 0xfbef },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
			{ 0x06, 0x79e2 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
			{ 0x06, 0x835f },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
			{ 0x06, 0xe0f8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
			{ 0x06, 0x9ae1 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
			{ 0x06, 0xf89b },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
			{ 0x06, 0xef31 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
			{ 0x06, 0x3b65 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
			{ 0x06, 0xaa07 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
			{ 0x06, 0x81e4 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
			{ 0x06, 0xf89a },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
			{ 0x06, 0xe5f8 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
			{ 0x06, 0x9baf },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
			{ 0x06, 0x06ae },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
			{ 0x05, 0x83dc },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
			{ 0x06, 0x8300 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
		rtl_phy_write(ioaddr, phy_reg_init_1,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
			      ARRAY_SIZE(phy_reg_init_1));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
	struct phy_reg phy_reg_init[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
		{ 0x1f, 0x0003 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		{ 0x08, 0x441d },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		{ 0x01, 0x9100 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
		{ 0x1f, 0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	mdio_write(ioaddr, 0x1f, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
	mdio_patch(ioaddr, 0x11, 1 << 12);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
	mdio_patch(ioaddr, 0x19, 1 << 13);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
static void rtl_hw_phy_config(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	rtl8169_print_mac_version(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	switch (tp->mac_version) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	case RTL_GIGA_MAC_VER_01:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	case RTL_GIGA_MAC_VER_02:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
	case RTL_GIGA_MAC_VER_03:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		rtl8169s_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
	case RTL_GIGA_MAC_VER_04:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		rtl8169sb_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
	case RTL_GIGA_MAC_VER_07:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	case RTL_GIGA_MAC_VER_08:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
	case RTL_GIGA_MAC_VER_09:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		rtl8102e_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	case RTL_GIGA_MAC_VER_11:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		rtl8168bb_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	case RTL_GIGA_MAC_VER_12:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		rtl8168bef_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	case RTL_GIGA_MAC_VER_17:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		rtl8168bef_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	case RTL_GIGA_MAC_VER_18:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		rtl8168cp_1_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	case RTL_GIGA_MAC_VER_19:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
		rtl8168c_1_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
	case RTL_GIGA_MAC_VER_20:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
		rtl8168c_2_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
	case RTL_GIGA_MAC_VER_21:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
		rtl8168c_3_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
	case RTL_GIGA_MAC_VER_22:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		rtl8168c_4_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	case RTL_GIGA_MAC_VER_23:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	case RTL_GIGA_MAC_VER_24:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
		rtl8168cp_2_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	case RTL_GIGA_MAC_VER_25:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		rtl8168d_hw_phy_config(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	default:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
static void rtl8169_phy_timer(unsigned long __opaque)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	struct net_device *dev = (struct net_device *)__opaque;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	struct timer_list *timer = &tp->timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
		spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	if (tp->phy_reset_pending(ioaddr)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		 * A busy loop could burn quite a few cycles on nowadays CPU.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		 * Let's delay the execution of the timer for a few ticks.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		timeout = HZ/10;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		goto out_mod_timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	if (tp->link_ok(ioaddr))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
		goto out_unlock;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	if (netif_msg_link(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
	tp->phy_reset_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
out_mod_timer:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		mod_timer(timer, jiffies + timeout);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
out_unlock:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
		spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
static inline void rtl8169_delete_timer(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	struct timer_list *timer = &tp->timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	del_timer_sync(timer);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
static inline void rtl8169_request_timer(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	struct timer_list *timer = &tp->timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
#ifdef CONFIG_NET_POLL_CONTROLLER
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
 * Polling 'interrupt' - used by things like netconsole to send skbs
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
 * without having to re-enable interrupts. It's not called while
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
 * the interrupt routine is executing.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
static void rtl8169_netpoll(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	disable_irq(pdev->irq);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	rtl8169_interrupt(pdev->irq, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	enable_irq(pdev->irq);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
				  void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
	iounmap(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	pci_release_regions(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
	pci_disable_device(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
	free_netdev(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
static void rtl8169_phy_reset(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
			      struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
	tp->phy_reset_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		if (!tp->phy_reset_pending(ioaddr))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
			return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
		msleep(1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	if (netif_msg_link(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
		printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	rtl_hw_phy_config(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		RTL_W8(0x82, 0x01);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		RTL_W8(0x82, 0x01);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	rtl8169_phy_reset(dev, tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	 * only 8101. Don't panic.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
		printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	u32 high;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	u32 low;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	high = addr[4] | (addr[5] << 8);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
	RTL_W32(MAC0, low);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	RTL_W32(MAC4, high);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
	spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
static int rtl_set_mac_address(struct net_device *dev, void *p)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	struct sockaddr *addr = p;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	if (!is_valid_ether_addr(addr->sa_data))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
		return -EADDRNOTAVAIL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	rtl_rar_set(tp, dev->dev_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
	struct mii_ioctl_data *data = if_mii(ifr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		return -ENODEV;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	switch (cmd) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	case SIOCGMIIPHY:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		data->phy_id = 32; /* Internal PHY */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	case SIOCGMIIREG:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
	case SIOCSMIIREG:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
		if (!capable(CAP_NET_ADMIN))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
			return -EPERM;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	return -EOPNOTSUPP;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
static const struct rtl_cfg_info {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	void (*hw_start)(struct net_device *);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	unsigned int region;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
	unsigned int align;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	u16 intr_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	u16 napi_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
	unsigned features;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
} rtl_cfg_infos [] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	[RTL_CFG_0] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
		.hw_start	= rtl_hw_start_8169,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
		.region		= 1,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		.align		= 0,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
		.intr_event	= SYSErr | LinkChg | RxOverflow |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
		.features	= RTL_FEATURE_GMII
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	},
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
	[RTL_CFG_1] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
		.hw_start	= rtl_hw_start_8168,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
		.region		= 2,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		.align		= 8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
		.intr_event	= SYSErr | LinkChg | RxOverflow |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
				  TxErr | TxOK | RxOK | RxErr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	},
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
	[RTL_CFG_2] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		.hw_start	= rtl_hw_start_8101,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
		.region		= 2,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		.align		= 8,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		.features	= RTL_FEATURE_MSI
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
/* Cfg9346_Unlock assumed. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
			    const struct rtl_cfg_info *cfg)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	unsigned msi = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
	u8 cfg2;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	if (cfg->features & RTL_FEATURE_MSI) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		if (pci_enable_msi(pdev)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
			cfg2 |= MSIEnable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
			msi = RTL_FEATURE_MSI;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	RTL_W8(Config2, cfg2);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	return msi;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
	if (tp->features & RTL_FEATURE_MSI) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		pci_disable_msi(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		tp->features &= ~RTL_FEATURE_MSI;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
static int __devinit
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
	const unsigned int region = cfg->region;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
	struct rtl8169_private *tp;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	struct mii_if_info *mii;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
	struct net_device *dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
	void __iomem *ioaddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	int rc;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	if (netif_msg_drv(&debug)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		       MODULENAME, RTL8169_VERSION);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	dev = alloc_etherdev(sizeof (*tp));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	if (!dev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		if (netif_msg_drv(&debug))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		rc = -ENOMEM;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	SET_NETDEV_DEV(dev, &pdev->dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	tp->dev = dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	tp->pci_dev = pdev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
	mii = &tp->mii;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	mii->dev = dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	mii->mdio_read = rtl_mdio_read;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	mii->mdio_write = rtl_mdio_write;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
	mii->phy_id_mask = 0x1f;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
	mii->reg_num_mask = 0x1f;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
	rc = pci_enable_device(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	if (rc < 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		if (netif_msg_probe(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
			dev_err(&pdev->dev, "enable failure\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
		goto err_out_free_dev_1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
	rc = pci_set_mwi(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	if (rc < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
		goto err_out_disable_2;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	/* make sure PCI base addr 1 is MMIO */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		if (netif_msg_probe(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
			dev_err(&pdev->dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
				"region #%d not an MMIO resource, aborting\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
				region);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		rc = -ENODEV;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		goto err_out_mwi_3;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
	/* check for weird/broken PCI region reporting */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		if (netif_msg_probe(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
			dev_err(&pdev->dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
				"Invalid PCI region size(s), aborting\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		rc = -ENODEV;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		goto err_out_mwi_3;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
	rc = pci_request_regions(pdev, MODULENAME);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
	if (rc < 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		if (netif_msg_probe(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
			dev_err(&pdev->dev, "could not request regions.\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		goto err_out_mwi_3;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	tp->cp_cmd = PCIMulRW | RxChkSum;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	if ((sizeof(dma_addr_t) > 4) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	    !pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
		tp->cp_cmd |= PCIDAC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
		dev->features |= NETIF_F_HIGHDMA;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
		if (rc < 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
			if (netif_msg_probe(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
				dev_err(&pdev->dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
					"DMA configuration failed.\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
			goto err_out_free_res_4;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	pci_set_master(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	/* ioremap MMIO region */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	if (!ioaddr) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
		if (netif_msg_probe(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
			dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
		rc = -EIO;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
		goto err_out_free_res_4;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	if (!tp->pcie_cap && netif_msg_probe(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
		dev_info(&pdev->dev, "no PCI Express capability\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	RTL_W16(IntrMask, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	/* Soft reset the chip. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	RTL_W8(ChipCmd, CmdReset);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	/* Check that the chip has finished the reset. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		msleep_interruptible(1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	RTL_W16(IntrStatus, 0xffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	/* Identify chip attached to board */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	rtl8169_get_mac_version(tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	rtl8169_print_mac_version(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		if (tp->mac_version == rtl_chip_info[i].mac_version)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	if (i == ARRAY_SIZE(rtl_chip_info)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		/* Unknown chip: assume array element #0, original RTL-8169 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
		if (netif_msg_probe(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
			dev_printk(KERN_DEBUG, &pdev->dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
				"unknown chip version, assuming %s\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
				rtl_chip_info[0].name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
		i = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	tp->chipset = i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		tp->features |= RTL_FEATURE_WOL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
		tp->features |= RTL_FEATURE_WOL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		tp->set_speed = rtl8169_set_speed_tbi;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		tp->get_settings = rtl8169_gset_tbi;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
		tp->link_ok = rtl8169_tbi_link_ok;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
		tp->set_speed = rtl8169_set_speed_xmii;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
		tp->get_settings = rtl8169_gset_xmii;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
		tp->link_ok = rtl8169_xmii_link_ok;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
		dev->do_ioctl = rtl8169_ioctl;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	spin_lock_init(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	tp->mmio_addr = ioaddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
	/* Get MAC address */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	for (i = 0; i < MAC_ADDR_LEN; i++)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
	dev->open = rtl8169_open;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	dev->hard_start_xmit = rtl8169_start_xmit;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	dev->get_stats = rtl8169_get_stats;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	dev->stop = rtl8169_close;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	dev->tx_timeout = rtl8169_tx_timeout;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	dev->set_multicast_list = rtl_set_rx_mode;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	dev->irq = pdev->irq;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	dev->base_addr = (unsigned long) ioaddr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
	dev->change_mtu = rtl8169_change_mtu;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	dev->set_mac_address = rtl_set_mac_address;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
#ifdef CONFIG_R8169_VLAN
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	dev->vlan_rx_register = rtl8169_vlan_rx_register;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
#ifdef CONFIG_NET_POLL_CONTROLLER
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
	dev->poll_controller = rtl8169_netpoll;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	tp->intr_mask = 0xffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	tp->align = cfg->align;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	tp->hw_start = cfg->hw_start;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	tp->intr_event = cfg->intr_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
	tp->napi_event = cfg->napi_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
	init_timer(&tp->timer);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
	tp->timer.data = (unsigned long) dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	tp->timer.function = rtl8169_phy_timer;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
	// offer device to EtherCAT master module
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	if (!tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
		rc = register_netdev(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		if (rc < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			goto err_out_msi_5;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	pci_set_drvdata(pdev, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	if (netif_msg_probe(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
		printk(KERN_INFO "%s: %s at 0x%lx, "
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
		       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
		       "XID %08x IRQ %d\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
		       dev->name,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
		       rtl_chip_info[tp->chipset].name,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		       dev->base_addr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
		       dev->dev_addr[0], dev->dev_addr[1],
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
		       dev->dev_addr[2], dev->dev_addr[3],
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
		       dev->dev_addr[4], dev->dev_addr[5], xid, dev->irq);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	rtl8169_init_phy(dev, tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	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: 2254
diff changeset
  2179
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2180
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2181
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2182
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2183
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2184
			goto err_out_msi_5;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2185
		}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2254
diff changeset
  2186
	}
1479
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
	return rc;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
err_out_msi_5:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	rtl_disable_msi(pdev, tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	iounmap(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
err_out_free_res_4:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	pci_release_regions(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
err_out_mwi_3:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	pci_clear_mwi(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
err_out_disable_2:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	pci_disable_device(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
err_out_free_dev_1:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	free_netdev(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
	goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	struct net_device *dev = pci_get_drvdata(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	flush_scheduled_work();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
	if (tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		ecdev_close(tp->ecdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		ecdev_withdraw(tp->ecdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
		unregister_netdev(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	rtl_disable_msi(pdev, tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	pci_set_drvdata(pdev, NULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
				  struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	unsigned int mtu = dev->mtu;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
static int rtl8169_open(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
	int retval = -ENOMEM;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	rtl8169_set_rxbufsize(tp, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	 * Rx and Tx desscriptors needs 256 bytes alignment.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	 * pci_alloc_consistent provides more.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
					       &tp->TxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	if (!tp->TxDescArray)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
					       &tp->RxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	if (!tp->RxDescArray)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
		goto err_free_tx_0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	retval = rtl8169_init_ring(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	if (retval < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		goto err_free_rx_1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	INIT_DELAYED_WORK(&tp->task, NULL);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
	smp_mb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
	if (!tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
		retval = request_irq(dev->irq, rtl8169_interrupt,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
				dev->name, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		if (retval < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
			goto err_release_ring_2;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		napi_enable(&tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	rtl_hw_start(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	rtl8169_request_timer(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
	return retval;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
err_release_ring_2:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	rtl8169_rx_clear(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
err_free_rx_1:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
			    tp->RxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
err_free_tx_0:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
			    tp->TxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
static void rtl8169_hw_reset(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	/* Disable interrupts */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	rtl8169_irq_mask_and_ack(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
	/* Reset the chipset */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	RTL_W8(ChipCmd, CmdReset);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	/* PCI commit */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
	RTL_R8(ChipCmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	u32 cfg = rtl8169_rx_config;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	RTL_W32(RxConfig, cfg);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
	/* Set DMA burst size and Interframe Gap Time */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		(InterFrameGap << TxInterFrameGapShift));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
static void rtl_hw_start(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	/* Soft reset the chip. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	RTL_W8(ChipCmd, CmdReset);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	/* Check that the chip has finished the reset. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	for (i = 0; i < 100; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		msleep_interruptible(1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	tp->hw_start(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
		netif_start_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
					 void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	 * register to be written before TxDescAddrLow to work.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	 * Switching from MMIO to I/O access fixes the issue as well.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_32BIT_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_32BIT_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
	u16 cmd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	cmd = RTL_R16(CPlusCmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	RTL_W16(CPlusCmd, cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	return cmd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
static void rtl_set_rx_max_size(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	/* Low hurts. Let's disable the filtering. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	RTL_W16(RxMaxSize, 16383);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	struct {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
		u32 mac_version;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
		u32 clk;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		u32 val;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	} cfg2_info [] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
	}, *p = cfg2_info;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
	u32 clk;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
			RTL_W32(0x7c, p->val);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
static void rtl_hw_start_8169(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	rtl_set_rx_max_size(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
		rtl_set_rx_tx_config_registers(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
			"Bit-3 and bit-14 MUST be 1\n");
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
		tp->cp_cmd |= (1 << 14);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	 * Undocumented corner. Supposedly:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	RTL_W16(IntrMitigate, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
		rtl_set_rx_tx_config_registers(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	RTL_R8(IntrMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	RTL_W32(RxMissed, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	rtl_set_rx_mode(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	/* no early-rx interrupts */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
	/* Enable all known interrupts by setting the interrupt mask. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		RTL_W16(IntrMask, tp->intr_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	struct net_device *dev = pci_get_drvdata(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	int cap = tp->pcie_cap;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	if (cap) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		u16 ctl;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
static void rtl_csi_access_enable(void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	u32 csi;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
struct ephy_info {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	unsigned int offset;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	u16 mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	u16 bits;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
static void rtl_ephy_init(void __iomem *ioaddr, struct ephy_info *e, int len)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	u16 w;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	while (len-- > 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		rtl_ephy_write(ioaddr, e->offset, w);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		e++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
static void rtl_disable_clock_request(struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
	struct net_device *dev = pci_get_drvdata(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
	int cap = tp->pcie_cap;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
	if (cap) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
		u16 ctl;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
		pci_read_config_word(pdev, cap + PCI_EXP_LNKCTL, &ctl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
		ctl &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		pci_write_config_word(pdev, cap + PCI_EXP_LNKCTL, ctl);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
#define R8168_CPCMD_QUIRK_MASK (\
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	EnableBist | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	Mac_dbgo_oe | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	Force_half_dup | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
	Force_rxflow_en | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	Force_txflow_en | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	Cxpl_dbg_sel | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	ASF | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	PktCntrDisable | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	Mac_dbgo_sel)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
static void rtl_hw_start_8168bb(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
	rtl_tx_performance_tweak(pdev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
static void rtl_hw_start_8168bef(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	rtl_hw_start_8168bb(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
static void __rtl_hw_start_8168cp(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	rtl_disable_clock_request(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
static void rtl_hw_start_8168cp_1(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	static struct ephy_info e_info_8168cp[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
		{ 0x01, 0,	0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
		{ 0x02, 0x0800,	0x1000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
		{ 0x03, 0,	0x0042 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
		{ 0x06, 0x0080,	0x0000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
		{ 0x07, 0,	0x2000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	rtl_ephy_init(ioaddr, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
	__rtl_hw_start_8168cp(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
static void rtl_hw_start_8168cp_2(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
static void rtl_hw_start_8168cp_3(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
	/* Magic. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
	RTL_W8(DBG_REG, 0x20);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
static void rtl_hw_start_8168c_1(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
	static struct ephy_info e_info_8168c_1[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
		{ 0x02, 0x0800,	0x1000 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		{ 0x03, 0,	0x0002 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
		{ 0x06, 0x0080,	0x0000 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
	rtl_ephy_init(ioaddr, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	__rtl_hw_start_8168cp(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
static void rtl_hw_start_8168c_2(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
	static struct ephy_info e_info_8168c_2[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
		{ 0x01, 0,	0x0001 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
		{ 0x03, 0x0400,	0x0220 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
	rtl_ephy_init(ioaddr, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
	__rtl_hw_start_8168cp(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
static void rtl_hw_start_8168c_3(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
	rtl_hw_start_8168c_2(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
static void rtl_hw_start_8168c_4(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	__rtl_hw_start_8168cp(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
static void rtl_hw_start_8168d(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	rtl_disable_clock_request(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
static void rtl_hw_start_8168(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	rtl_set_rx_max_size(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	RTL_W16(IntrMitigate, 0x5151);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
	/* Work around for RxFIFO overflow. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
		tp->intr_event |= RxFIFOOver | PCSTimeout;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
		tp->intr_event &= ~RxOverflow;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
	rtl_set_rx_mode(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		(InterFrameGap << TxInterFrameGapShift));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
	RTL_R8(IntrMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
	switch (tp->mac_version) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
	case RTL_GIGA_MAC_VER_11:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
		rtl_hw_start_8168bb(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
	case RTL_GIGA_MAC_VER_12:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	case RTL_GIGA_MAC_VER_17:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		rtl_hw_start_8168bef(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
	case RTL_GIGA_MAC_VER_18:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
		rtl_hw_start_8168cp_1(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	case RTL_GIGA_MAC_VER_19:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		rtl_hw_start_8168c_1(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	case RTL_GIGA_MAC_VER_20:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
		rtl_hw_start_8168c_2(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	case RTL_GIGA_MAC_VER_21:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
		rtl_hw_start_8168c_3(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	case RTL_GIGA_MAC_VER_22:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		rtl_hw_start_8168c_4(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	case RTL_GIGA_MAC_VER_23:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
		rtl_hw_start_8168cp_2(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	case RTL_GIGA_MAC_VER_24:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
		rtl_hw_start_8168cp_3(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
	case RTL_GIGA_MAC_VER_25:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
		rtl_hw_start_8168d(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	default:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
		printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
			dev->name, tp->mac_version);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
	break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
		RTL_W16(IntrMask, tp->intr_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
#define R810X_CPCMD_QUIRK_MASK (\
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	EnableBist | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	Mac_dbgo_oe | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
	Force_half_dup | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	Force_half_dup | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
	Force_txflow_en | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
	Cxpl_dbg_sel | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
	ASF | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
	PktCntrDisable | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	PCIDAC | \
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
	PCIMulRW)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	static struct ephy_info e_info_8102e_1[] = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		{ 0x01,	0, 0x6e65 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		{ 0x02,	0, 0x091f },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
		{ 0x03,	0, 0xc2f9 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
		{ 0x06,	0, 0xafb5 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
		{ 0x07,	0, 0x0e00 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		{ 0x19,	0, 0xec80 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		{ 0x01,	0, 0x2e65 },
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
		{ 0x01,	0, 0x6e65 }
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
	u8 cfg1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	RTL_W8(DBG_REG, FIX_NAK_1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	RTL_W8(Config1,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
	cfg1 = RTL_R8(Config1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
		RTL_W8(Config1, cfg1 & ~LEDS0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	rtl_csi_access_enable(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	rtl_hw_start_8102e_2(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
static void rtl_hw_start_8101(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
		int cap = tp->pcie_cap;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		if (cap) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	switch (tp->mac_version) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	case RTL_GIGA_MAC_VER_07:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
		rtl_hw_start_8102e_1(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
	case RTL_GIGA_MAC_VER_08:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
		rtl_hw_start_8102e_3(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
	case RTL_GIGA_MAC_VER_09:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
		rtl_hw_start_8102e_2(ioaddr, pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
		break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
	RTL_W8(Cfg9346, Cfg9346_Unlock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	RTL_W8(EarlyTxThres, EarlyTxThld);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	rtl_set_rx_max_size(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
	RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
	RTL_W16(IntrMitigate, 0x0000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
	rtl_set_rx_tx_config_registers(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
	RTL_W8(Cfg9346, Cfg9346_Lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	RTL_R8(IntrMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	rtl_set_rx_mode(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
		RTL_W16(IntrMask, tp->intr_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
	int ret = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
		return -EINVAL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
	dev->mtu = new_mtu;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
	rtl8169_down(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	rtl8169_set_rxbufsize(tp, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
	ret = rtl8169_init_ring(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
	if (ret < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	napi_enable(&tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	rtl_hw_start(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	rtl8169_request_timer(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
				struct sk_buff **sk_buff, struct RxDesc *desc)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
			 PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
	dev_kfree_skb(*sk_buff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
	*sk_buff = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
	rtl8169_make_unusable_by_asic(desc);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
				       u32 rx_buf_sz)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
	desc->addr = cpu_to_le64(mapping);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
	wmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
	rtl8169_mark_to_asic(desc, rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
					    struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
					    struct RxDesc *desc, int rx_buf_sz,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
					    unsigned int align)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	struct sk_buff *skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
	dma_addr_t mapping;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	unsigned int pad;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
	pad = align ? align : NET_IP_ALIGN;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
	if (!skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
		goto err_out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
				 PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
	return skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
err_out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
	rtl8169_make_unusable_by_asic(desc);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
	goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
static void rtl8169_rx_clear(struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	for (i = 0; i < NUM_RX_DESC; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
		if (tp->Rx_skbuff[i]) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
					    tp->RxDescArray + i);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
			   u32 start, u32 end)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	u32 cur;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
	for (cur = start; end - cur != 0; cur++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
		struct sk_buff *skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
		unsigned int i = cur % NUM_RX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
		WARN_ON((s32)(end - cur) < 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
		if (tp->Rx_skbuff[i])
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
			continue;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
					   tp->RxDescArray + i,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
					   tp->rx_buf_sz, tp->align);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
		if (!skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
		tp->Rx_skbuff[i] = skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
	return cur - start;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
	desc->opts1 |= cpu_to_le32(RingEnd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
static int rtl8169_init_ring(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	rtl8169_init_ring_indexes(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
		goto err_out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
err_out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
	rtl8169_rx_clear(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
	return -ENOMEM;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
				 struct TxDesc *desc)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
	unsigned int len = tx_skb->len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	desc->opts1 = 0x00;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
	desc->opts2 = 0x00;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
	desc->addr = 0x00;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
	tx_skb->len = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
static void rtl8169_tx_clear(struct rtl8169_private *tp)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
		unsigned int entry = i % NUM_TX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
		struct ring_info *tx_skb = tp->tx_skb + entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
		unsigned int len = tx_skb->len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
		if (len) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
			struct sk_buff *skb = tx_skb->skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
					     tp->TxDescArray + entry);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
			if (skb) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
				if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
					dev_kfree_skb(skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
				tx_skb->skb = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
			tp->dev->stats.tx_dropped++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
	tp->cur_tx = tp->dirty_tx = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	PREPARE_DELAYED_WORK(&tp->task, task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
	schedule_delayed_work(&tp->task, 4);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
static void rtl8169_wait_for_quiescence(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	synchronize_irq(dev->irq);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
	/* Wait for any pending NAPI task to complete */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	napi_disable(&tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	rtl8169_irq_mask_and_ack(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
	tp->intr_mask = 0xffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
	RTL_W16(IntrMask, tp->intr_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
	napi_enable(&tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
static void rtl8169_reinit_task(struct work_struct *work)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
	struct rtl8169_private *tp =
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
		container_of(work, struct rtl8169_private, task.work);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
	struct net_device *dev = tp->dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
	int ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
	rtnl_lock();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
		goto out_unlock;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
	rtl8169_wait_for_quiescence(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
	rtl8169_close(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
	ret = rtl8169_open(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
	if (unlikely(ret < 0)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
		if (net_ratelimit() && netif_msg_drv(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
			printk(KERN_ERR PFX "%s: reinit failure (status = %d)."
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
			       " Rescheduling.\n", dev->name, ret);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
out_unlock:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
	rtnl_unlock();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
static void rtl8169_reset_task(struct work_struct *work)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
	struct rtl8169_private *tp =
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
		container_of(work, struct rtl8169_private, task.work);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
	struct net_device *dev = tp->dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
	rtnl_lock();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
		goto out_unlock;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
	rtl8169_wait_for_quiescence(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
	rtl8169_tx_clear(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
	if (tp->dirty_rx == tp->cur_rx) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
		rtl8169_init_ring_indexes(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
		rtl_hw_start(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
		netif_wake_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
		if (net_ratelimit() && netif_msg_intr(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
			printk(KERN_EMERG PFX "%s: Rx buffers shortage\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
			       dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
		rtl8169_schedule_work(dev, rtl8169_reset_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
out_unlock:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
	rtnl_unlock();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
static void rtl8169_tx_timeout(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
	if (tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
	rtl8169_hw_reset(tp->mmio_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
	/* Let's wait a bit while any (async) irq lands on */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
	rtl8169_schedule_work(dev, rtl8169_reset_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
			      u32 opts1)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
	struct skb_shared_info *info = skb_shinfo(skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
	unsigned int cur_frag, entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
	struct TxDesc * uninitialized_var(txd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
	entry = tp->cur_tx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		skb_frag_t *frag = info->frags + cur_frag;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
		dma_addr_t mapping;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
		u32 status, len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
		void *addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
		entry = (entry + 1) % NUM_TX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		txd = tp->TxDescArray + entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
		len = frag->size;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
		/* anti gcc 2.95.3 bugware (sic) */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
		txd->opts1 = cpu_to_le32(status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
		txd->addr = cpu_to_le64(mapping);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
		tp->tx_skb[entry].len = len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
	if (cur_frag) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
		tp->tx_skb[entry].skb = skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
		txd->opts1 |= cpu_to_le32(LastFrag);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	return cur_frag;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	if (dev->features & NETIF_F_TSO) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
		u32 mss = skb_shinfo(skb)->gso_size;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
		if (mss)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
			return LargeSend | ((mss & MSSMask) << MSSShift);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
		const struct iphdr *ip = ip_hdr(skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
		if (ip->protocol == IPPROTO_TCP)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
			return IPCS | TCPCS;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		else if (ip->protocol == IPPROTO_UDP)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
			return IPCS | UDPCS;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		WARN_ON(1);	/* we need a WARN() */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
	struct TxDesc *txd = tp->TxDescArray + entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
	dma_addr_t mapping;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
	u32 status, len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
	u32 opts1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
	int ret = NETDEV_TX_OK;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
		if (netif_msg_drv(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
			printk(KERN_ERR
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
			       "%s: BUG! Tx Ring full when queue awake!\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
			       dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
		goto err_stop;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
		goto err_stop;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
	frags = rtl8169_xmit_frags(tp, skb, opts1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
	if (frags) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
		len = skb_headlen(skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
		opts1 |= FirstFrag;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
		len = skb->len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
		if (unlikely(len < ETH_ZLEN)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
			if (skb_padto(skb, ETH_ZLEN))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
				goto err_update_stats;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
			len = ETH_ZLEN;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
		opts1 |= FirstFrag | LastFrag;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
		tp->tx_skb[entry].skb = skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	tp->tx_skb[entry].len = len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
	txd->addr = cpu_to_le64(mapping);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
	wmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
	/* anti gcc 2.95.3 bugware (sic) */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	txd->opts1 = cpu_to_le32(status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	dev->trans_start = jiffies;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	tp->cur_tx += frags + 1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
	smp_wmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
	if (!tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
		if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
			netif_stop_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
			smp_rmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
			if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
				netif_wake_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	return ret;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
err_stop:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
		netif_stop_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
	ret = NETDEV_TX_BUSY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
err_update_stats:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	dev->stats.tx_dropped++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
	goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
static void rtl8169_pcierr_interrupt(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
	u16 pci_status, pci_cmd;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
	if (netif_msg_intr(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
		printk(KERN_ERR
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
		       "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
		       dev->name, pci_cmd, pci_status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	 * The recovery sequence below admits a very elaborated explanation:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
	 * - it seems to work;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
	 * - I did not see what else could be done;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	 * - it makes iop3xx happy.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
	 * Feel free to adjust to your needs.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
	if (pdev->broken_parity_status)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
		pci_cmd &= ~PCI_COMMAND_PARITY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
	else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
	pci_write_config_word(pdev, PCI_STATUS,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
		pci_status & (PCI_STATUS_DETECTED_PARITY |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	/* The infamous DAC f*ckup only happens at boot time */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
		if (netif_msg_intr(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
			printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
		tp->cp_cmd &= ~PCIDAC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
		RTL_W16(CPlusCmd, tp->cp_cmd);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
		dev->features &= ~NETIF_F_HIGHDMA;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	rtl8169_hw_reset(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
static void rtl8169_tx_interrupt(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
				 struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
				 void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
	unsigned int dirty_tx, tx_left;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
	dirty_tx = tp->dirty_tx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
	smp_rmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
	tx_left = tp->cur_tx - dirty_tx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	while (tx_left > 0) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
		unsigned int entry = dirty_tx % NUM_TX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
		struct ring_info *tx_skb = tp->tx_skb + entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
		u32 len = tx_skb->len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
		u32 status;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
		rmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
		if (status & DescOwn)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
		dev->stats.tx_bytes += len;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
		dev->stats.tx_packets++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
		if (status & LastFrag) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
			if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
				dev_kfree_skb_irq(tx_skb->skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
			tx_skb->skb = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
		dirty_tx++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
		tx_left--;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	if (tp->dirty_tx != dirty_tx) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
		tp->dirty_tx = dirty_tx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
		smp_wmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
		if (!tp->ecdev && netif_queue_stopped(dev) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
			netif_wake_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
		 * too close. Let's kick an extra TxPoll request when a burst
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		 * of start_xmit activity is detected (if it is not detected,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
		 * it is slow enough). -- FR
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		smp_rmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		if (tp->cur_tx != dirty_tx)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
			RTL_W8(TxPoll, NPQ);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
static inline int rtl8169_fragmented_frame(u32 status)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
	u32 opts1 = le32_to_cpu(desc->opts1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
	u32 status = opts1 & RxProtoMask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
		skb->ip_summed = CHECKSUM_UNNECESSARY;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
	else
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
		skb->ip_summed = CHECKSUM_NONE;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
				       struct rtl8169_private *tp, int pkt_size,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
				       dma_addr_t addr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
	struct sk_buff *skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
	bool done = false;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	if (pkt_size >= rx_copybreak)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
	if (!skb)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
				    PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
	skb_reserve(skb, NET_IP_ALIGN);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
	*sk_buff = skb;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
	done = true;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
	return done;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
static int rtl8169_rx_interrupt(struct net_device *dev,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
				struct rtl8169_private *tp,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
				void __iomem *ioaddr, u32 budget)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
	unsigned int cur_rx, rx_left;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	unsigned int delta, count;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
	cur_rx = tp->cur_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
	rx_left = min(rx_left, budget);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	for (; rx_left > 0; rx_left--, cur_rx++) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
		unsigned int entry = cur_rx % NUM_RX_DESC;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
		struct RxDesc *desc = tp->RxDescArray + entry;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
		u32 status;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
		rmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
		status = le32_to_cpu(desc->opts1);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
		if (status & DescOwn)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
			break;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
		if (unlikely(status & RxRES)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
			if (netif_msg_rx_err(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3487
				printk(KERN_INFO
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
				       "%s: Rx ERROR. status = %08x\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
				       dev->name, status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
			dev->stats.rx_errors++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
			if (status & (RxRWT | RxRUNT))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
				dev->stats.rx_length_errors++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
			if (status & RxCRC)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
				dev->stats.rx_crc_errors++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
			if (status & RxFOVF) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
				if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
					rtl8169_schedule_work(dev, rtl8169_reset_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
				dev->stats.rx_fifo_errors++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
		} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
			struct sk_buff *skb = tp->Rx_skbuff[entry];
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
			dma_addr_t addr = le64_to_cpu(desc->addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
			int pkt_size = (status & 0x00001FFF) - 4;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
			struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
			/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
			 * The driver does not support incoming fragmented
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
			 * frames. They are seen as a symptom of over-mtu
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
			 * sized frames.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
			 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
			if (unlikely(rtl8169_fragmented_frame(status))) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
				dev->stats.rx_dropped++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
				dev->stats.rx_length_errors++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
				continue;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3518
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
			rtl8169_rx_csum(skb, desc);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
			if (tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
				pci_dma_sync_single_for_cpu(pdev, addr, pkt_size,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
						PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
				ecdev_receive(tp->ecdev, skb->data, pkt_size);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
				pci_dma_sync_single_for_device(pdev, addr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
						pkt_size, PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
				// No need to detect link status as
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
				// long as frames are received: Reset watchdog.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
				tp->ec_watchdog_jiffies = jiffies;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
			} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
				if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
					pci_dma_sync_single_for_device(pdev, addr,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
						pkt_size, PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
					rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
				} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
					pci_unmap_single(pdev, addr, tp->rx_buf_sz,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
							 PCI_DMA_FROMDEVICE);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
					tp->Rx_skbuff[entry] = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
				}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
				skb_put(skb, pkt_size);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
				skb->protocol = eth_type_trans(skb, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
				if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
					netif_receive_skb(skb);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
			}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
			dev->last_rx = jiffies;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
			dev->stats.rx_bytes += pkt_size;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
			dev->stats.rx_packets++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
		/* Work around for AMD plateform. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3559
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3560
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3561
			desc->opts2 = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3562
			cur_rx++;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3563
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3564
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3565
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3566
	count = cur_rx - tp->cur_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3567
	tp->cur_rx = cur_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3568
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3569
	if (tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3570
		/* descriptors are cleaned up immediately. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3571
		tp->dirty_rx = tp->cur_rx;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3572
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3573
		delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3574
		if (!delta && count && netif_msg_intr(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3575
			printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3576
		tp->dirty_rx += delta;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3577
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3578
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3579
		 * FIXME: until there is periodic timer to try and refill the ring,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3580
		 * a temporary shortage may definitely kill the Rx process.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3581
		 * - disable the asic to try and avoid an overflow and kick it again
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3582
		 *   after refill ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3583
		 * - how do others driver handle this condition (Uh oh...).
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3584
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3585
		if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3586
			printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3587
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3588
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3589
	return count;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3590
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3591
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3592
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3593
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3594
	struct net_device *dev = dev_instance;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3595
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3596
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3597
	int handled = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3598
	int status;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3599
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3600
	status = RTL_R16(IntrStatus);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3601
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3602
	/* hotplug/major error/no more work/shared irq */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3603
	if ((status == 0xffff) || !status)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3604
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3605
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3606
	handled = 1;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3607
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3608
	if (unlikely(!tp->ecdev && !netif_running(dev))) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3609
		rtl8169_asic_down(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3610
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3611
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3612
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3613
	status &= tp->intr_mask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3614
	RTL_W16(IntrStatus,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3615
		(status & RxFIFOOver) ? (status | RxOverflow) : status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3616
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3617
	if (!(status & tp->intr_event))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3618
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3619
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3620
	/* Work around for rx fifo overflow */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3621
	if (unlikely(status & RxFIFOOver) &&
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3622
	    (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3623
		netif_stop_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3624
		rtl8169_tx_timeout(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3625
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3626
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3627
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3628
	if (unlikely(status & SYSErr)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3629
		rtl8169_pcierr_interrupt(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3630
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3631
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3632
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3633
	if (status & LinkChg)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3634
		rtl8169_check_link_status(dev, tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3635
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3636
	if (status & tp->napi_event) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3637
		RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3638
		tp->intr_mask = ~tp->napi_event;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3639
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3640
		if (likely(netif_rx_schedule_prep(dev, &tp->napi)))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3641
			__netif_rx_schedule(dev, &tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3642
		else if (netif_msg_intr(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3643
			printk(KERN_INFO "%s: interrupt %04x in poll\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3644
			       dev->name, status);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3645
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3646
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3647
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3648
	return IRQ_RETVAL(handled);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3649
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3650
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3651
static void ec_poll(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3652
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3653
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3654
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3655
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3656
	rtl8169_interrupt(pdev->irq, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3657
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, 100); // FIXME
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3658
	rtl8169_tx_interrupt(dev, tp, tp->mmio_addr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3659
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3660
    if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3661
		rtl8169_phy_timer((unsigned long) dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3662
		tp->ec_watchdog_jiffies = jiffies;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3663
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3664
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3665
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3666
static int rtl8169_poll(struct napi_struct *napi, int budget)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3667
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3668
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3669
	struct net_device *dev = tp->dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3670
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3671
	int work_done;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3672
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3673
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3674
	rtl8169_tx_interrupt(dev, tp, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3675
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3676
	if (work_done < budget) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3677
		netif_rx_complete(dev, napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3678
		tp->intr_mask = 0xffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3679
		/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3680
		 * 20040426: the barrier is not strictly required but the
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3681
		 * behavior of the irq handler could be less predictable
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3682
		 * without it. Btw, the lack of flush for the posted pci
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3683
		 * write is safe - FR
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3684
		 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3685
		smp_wmb();
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3686
		RTL_W16(IntrMask, tp->intr_event);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3687
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3688
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3689
	return work_done;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3690
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3691
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3692
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3693
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3694
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3695
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3696
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3697
		return;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3698
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3699
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3700
	RTL_W32(RxMissed, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3701
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3702
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3703
static void rtl8169_down(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3704
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3705
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3706
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3707
	unsigned int intrmask;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3708
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3709
	rtl8169_delete_timer(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3710
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3711
	if (!tp->ecdev) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3712
		netif_stop_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3713
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3714
		napi_disable(&tp->napi);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3715
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3716
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3717
core_down:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3718
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3719
		spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3720
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3721
	rtl8169_asic_down(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3722
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3723
	rtl8169_rx_missed(dev, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3724
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3725
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3726
		spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3727
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3728
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3729
		synchronize_irq(dev->irq);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3730
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3731
	/* Give a racing hard_start_xmit a few cycles to complete. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3732
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3733
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3734
	/*
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3735
	 * And now for the 50k$ question: are IRQ disabled or not ?
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3736
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3737
	 * Two paths lead here:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3738
	 * 1) dev->close
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3739
	 *    -> netif_running() is available to sync the current code and the
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3740
	 *       IRQ handler. See rtl8169_interrupt for details.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3741
	 * 2) dev->change_mtu
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3742
	 *    -> rtl8169_poll can not be issued again and re-enable the
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3743
	 *       interruptions. Let's simply issue the IRQ down sequence again.
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3744
	 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3745
	 * No loop if hotpluged or major error (0xffff).
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3746
	 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3747
	intrmask = RTL_R16(IntrMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3748
	if (intrmask && (intrmask != 0xffff))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3749
		goto core_down;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3750
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3751
	rtl8169_tx_clear(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3752
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3753
	rtl8169_rx_clear(tp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3754
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3755
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3756
static int rtl8169_close(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3757
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3758
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3759
	struct pci_dev *pdev = tp->pci_dev;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3760
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3761
	rtl8169_down(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3762
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3763
	if (!tp->ecdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3764
		free_irq(dev->irq, dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3765
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3766
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3767
			    tp->RxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3768
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3769
			    tp->TxPhyAddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3770
	tp->TxDescArray = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3771
	tp->RxDescArray = NULL;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3772
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3773
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3774
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3775
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3776
static void rtl_set_rx_mode(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3777
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3778
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3779
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3780
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3781
	u32 mc_filter[2];	/* Multicast hash filter */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3782
	int rx_mode;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3783
	u32 tmp = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3784
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3785
	if (dev->flags & IFF_PROMISC) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3786
		/* Unconditionally log net taps. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3787
		if (netif_msg_link(tp)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3788
			printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3789
			       dev->name);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3790
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3791
		rx_mode =
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3792
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3793
		    AcceptAllPhys;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3794
		mc_filter[1] = mc_filter[0] = 0xffffffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3795
	} else if ((dev->mc_count > multicast_filter_limit)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3796
		   || (dev->flags & IFF_ALLMULTI)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3797
		/* Too many to filter perfectly -- accept all multicasts. */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3798
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3799
		mc_filter[1] = mc_filter[0] = 0xffffffff;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3800
	} else {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3801
		struct dev_mc_list *mclist;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3802
		unsigned int i;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3803
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3804
		rx_mode = AcceptBroadcast | AcceptMyPhys;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3805
		mc_filter[1] = mc_filter[0] = 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3806
		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3807
		     i++, mclist = mclist->next) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3808
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3809
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3810
			rx_mode |= AcceptMulticast;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3811
		}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3812
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3813
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3814
	spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3815
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3816
	tmp = rtl8169_rx_config | rx_mode |
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3817
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3818
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3819
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3820
		u32 data = mc_filter[0];
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3821
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3822
		mc_filter[0] = swab32(mc_filter[1]);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3823
		mc_filter[1] = swab32(data);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3824
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3825
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3826
	RTL_W32(MAR0 + 0, mc_filter[0]);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3827
	RTL_W32(MAR0 + 4, mc_filter[1]);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3828
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3829
	RTL_W32(RxConfig, tmp);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3830
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3831
	spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3832
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3833
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3834
/**
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3835
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3836
 *  @dev: The Ethernet Device to get statistics for
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3837
 *
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3838
 *  Get TX/RX statistics for rtl8169
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3839
 */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3840
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3841
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3842
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3843
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3844
	unsigned long flags;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3845
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3846
	if (netif_running(dev)) {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3847
		spin_lock_irqsave(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3848
		rtl8169_rx_missed(dev, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3849
		spin_unlock_irqrestore(&tp->lock, flags);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3850
	}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3851
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3852
	return &dev->stats;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3853
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3854
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3855
#ifdef CONFIG_PM
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3856
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3857
static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3858
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3859
	struct net_device *dev = pci_get_drvdata(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3860
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3861
	void __iomem *ioaddr = tp->mmio_addr;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3862
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3863
	if (tp->ecdev)
2254
fe87d02a6790 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  3864
		return -EBUSY;
1479
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3865
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3866
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3867
		goto out_pci_suspend;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3868
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3869
	netif_device_detach(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3870
	netif_stop_queue(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3871
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3872
	spin_lock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3873
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3874
	rtl8169_asic_down(ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3875
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3876
	rtl8169_rx_missed(dev, ioaddr);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3877
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3878
	spin_unlock_irq(&tp->lock);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3879
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3880
out_pci_suspend:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3881
	pci_save_state(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3882
	pci_enable_wake(pdev, pci_choose_state(pdev, state),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3883
		(tp->features & RTL_FEATURE_WOL) ? 1 : 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3884
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3885
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3886
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3887
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3888
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3889
static int rtl8169_resume(struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3890
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3891
	struct net_device *dev = pci_get_drvdata(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3892
	struct rtl8169_private *tp = netdev_priv(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3893
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3894
	if (tp->ecdev)
2254
fe87d02a6790 Fixed suspend/resume for r8169 drivers.
Florian Pose <fp@igh-essen.com>
parents: 1897
diff changeset
  3895
		return -EBUSY;
1479
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3896
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3897
	pci_set_power_state(pdev, PCI_D0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3898
	pci_restore_state(pdev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3899
	pci_enable_wake(pdev, PCI_D0, 0);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3900
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3901
	if (!netif_running(dev))
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3902
		goto out;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3903
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3904
	netif_device_attach(dev);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3905
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3906
	rtl8169_schedule_work(dev, rtl8169_reset_task);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3907
out:
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3908
	return 0;
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3909
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3910
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3911
static void rtl_shutdown(struct pci_dev *pdev)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3912
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3913
	rtl8169_suspend(pdev, PMSG_SUSPEND);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3914
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3915
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3916
#endif /* CONFIG_PM */
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3917
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3918
static struct pci_driver rtl8169_pci_driver = {
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3919
	.name		= MODULENAME,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3920
	.id_table	= rtl8169_pci_tbl,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3921
	.probe		= rtl8169_init_one,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3922
	.remove		= __devexit_p(rtl8169_remove_one),
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3923
#ifdef CONFIG_PM
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3924
	.suspend	= rtl8169_suspend,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3925
	.resume		= rtl8169_resume,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3926
	.shutdown	= rtl_shutdown,
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3927
#endif
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3928
};
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3929
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3930
static int __init rtl8169_init_module(void)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3931
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3932
	return pci_register_driver(&rtl8169_pci_driver);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3933
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3934
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3935
static void __exit rtl8169_cleanup_module(void)
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3936
{
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3937
	pci_unregister_driver(&rtl8169_pci_driver);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3938
}
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3939
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3940
module_init(rtl8169_init_module);
5c8ba5ace5b3 merge -c1787 branches/stable-1.4: Added r8169 driver for 2.6.28.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3941
module_exit(rtl8169_cleanup_module);