devices/r8169-2.6.27-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.
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 * r8169.c: RealTek 8169/8168/8101 ethernet driver.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 * Copyright (c) 2002 ShuChen <shuchen@realtek.com.tw>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 * Copyright (c) 2003 - 2007 Francois Romieu <romieu@fr.zoreil.com>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 * Copyright (c) a lot of people too. Please respect their work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 * See MAINTAINERS file for support contact information.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 * vim: noexpandtab
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
#include <linux/module.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
#include <linux/moduleparam.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
#include <linux/pci.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
#include <linux/netdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
#include <linux/etherdevice.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
#include <linux/delay.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
#include <linux/ethtool.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
#include <linux/mii.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
#include <linux/if_vlan.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
#include <linux/crc32.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
#include <linux/in.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
#include <linux/ip.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
#include <linux/tcp.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
#include <linux/init.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
#include <linux/dma-mapping.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
#include <asm/system.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
#include <asm/io.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
#include <asm/irq.h>
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
#include "../globals.h"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
#include "ecdev.h"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#define RTL8169_VERSION "2.3LK-NAPI"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#define MODULENAME "ec_r8169"
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#define PFX MODULENAME ": "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#ifdef RTL8169_DEBUG
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#define assert(expr) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	if (!(expr)) {					\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		printk( "Assertion failed! %s,%s,%s,line=%d\n",	\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
		#expr,__FILE__,__FUNCTION__,__LINE__);		\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define dprintk(fmt, args...) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
	do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
#else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
#define assert(expr) do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
#define dprintk(fmt, args...)	do {} while (0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
#endif /* RTL8169_DEBUG */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
#define R8169_MSG_DEFAULT \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
	(NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
#define TX_BUFFS_AVAIL(tp) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
	(tp->dirty_tx + NUM_TX_DESC - tp->cur_tx - 1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
static const int max_interrupt_work = 20;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
   The RTL chips use a 64 element hash table based on the Ethernet CRC. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
static const int multicast_filter_limit = 32;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
/* MAC address length */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
#define MAC_ADDR_LEN	6
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
#define MAX_READ_REQUEST_SHIFT	12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
#define RX_FIFO_THRESH	7	/* 7 means NO threshold, Rx buffer level before first PCI xfer. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
#define RX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
#define EarlyTxThld	0x3F	/* 0x3F means NO early transmit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
#define SafeMtu		0x1c20	/* ... actually life sucks beyond ~7k */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
#define InterFrameGap	0x03	/* 3 means InterFrameGap = the shortest one */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
#define R8169_REGS_SIZE		256
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
#define R8169_NAPI_WEIGHT	64
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
#define NUM_TX_DESC	64	/* Number of Tx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
#define RX_BUF_SIZE	1536	/* Rx Buffer size */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
#define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
#define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
#define RTL8169_TX_TIMEOUT	(6*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
#define RTL8169_PHY_TIMEOUT	(10*HZ)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
/* write/read MMIO register */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
#define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
#define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
#define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define RTL_R8(reg)		readb (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
#define RTL_R16(reg)		readw (ioaddr + (reg))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define RTL_R32(reg)		((unsigned long) readl (ioaddr + (reg)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
enum mac_version {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
	RTL_GIGA_MAC_NONE   = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
	RTL_GIGA_MAC_VER_01 = 0x01, // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
	RTL_GIGA_MAC_VER_02 = 0x02, // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
	RTL_GIGA_MAC_VER_03 = 0x03, // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
	RTL_GIGA_MAC_VER_04 = 0x04, // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
	RTL_GIGA_MAC_VER_05 = 0x05, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
	RTL_GIGA_MAC_VER_06 = 0x06, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
	RTL_GIGA_MAC_VER_07 = 0x07, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
	RTL_GIGA_MAC_VER_08 = 0x08, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
	RTL_GIGA_MAC_VER_09 = 0x09, // 8102e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
	RTL_GIGA_MAC_VER_10 = 0x0a, // 8101e
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
	RTL_GIGA_MAC_VER_11 = 0x0b, // 8168Bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
	RTL_GIGA_MAC_VER_12 = 0x0c, // 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
	RTL_GIGA_MAC_VER_13 = 0x0d, // 8101Eb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
	RTL_GIGA_MAC_VER_14 = 0x0e, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
	RTL_GIGA_MAC_VER_15 = 0x0f, // 8101 ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
	RTL_GIGA_MAC_VER_16 = 0x11, // 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
	RTL_GIGA_MAC_VER_17 = 0x10, // 8168Bf
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
	RTL_GIGA_MAC_VER_18 = 0x12, // 8168CP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
	RTL_GIGA_MAC_VER_19 = 0x13, // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
	RTL_GIGA_MAC_VER_20 = 0x14  // 8168C
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
#define _R(NAME,MAC,MASK) \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
	{ .name = NAME, .mac_version = MAC, .RxConfigMask = MASK }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
static const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
	const char *name;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
	u8 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
	u32 RxConfigMask;	/* Clears the bits supported by this chip */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
} rtl_chip_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
	_R("RTL8169",		RTL_GIGA_MAC_VER_01, 0xff7e1880), // 8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
	_R("RTL8169s",		RTL_GIGA_MAC_VER_02, 0xff7e1880), // 8169S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
	_R("RTL8110s",		RTL_GIGA_MAC_VER_03, 0xff7e1880), // 8110S
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
	_R("RTL8169sb/8110sb",	RTL_GIGA_MAC_VER_04, 0xff7e1880), // 8169SB
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_05, 0xff7e1880), // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
	_R("RTL8169sc/8110sc",	RTL_GIGA_MAC_VER_06, 0xff7e1880), // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
	_R("RTL8102e",		RTL_GIGA_MAC_VER_07, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
	_R("RTL8102e",		RTL_GIGA_MAC_VER_08, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
	_R("RTL8102e",		RTL_GIGA_MAC_VER_09, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
	_R("RTL8101e",		RTL_GIGA_MAC_VER_10, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_11, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_12, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
	_R("RTL8101e",		RTL_GIGA_MAC_VER_13, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
	_R("RTL8100e",		RTL_GIGA_MAC_VER_14, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
	_R("RTL8100e",		RTL_GIGA_MAC_VER_15, 0xff7e1880), // PCI-E 8139
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
	_R("RTL8168b/8111b",	RTL_GIGA_MAC_VER_17, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
	_R("RTL8101e",		RTL_GIGA_MAC_VER_16, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
	_R("RTL8168cp/8111cp",	RTL_GIGA_MAC_VER_18, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_19, 0xff7e1880), // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
	_R("RTL8168c/8111c",	RTL_GIGA_MAC_VER_20, 0xff7e1880)  // PCI-E
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
#undef _R
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
enum cfg_version {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
	RTL_CFG_0 = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
	RTL_CFG_1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
	RTL_CFG_2
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
static void rtl_hw_start_8169(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
static void rtl_hw_start_8168(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
static void rtl_hw_start_8101(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
static struct pci_device_id rtl8169_pci_tbl[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8129), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8136), 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8167), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8168), 0, 0, RTL_CFG_1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
	{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK,	0x8169), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
	{ PCI_DEVICE(PCI_VENDOR_ID_DLINK,	0x4300), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
	{ PCI_DEVICE(PCI_VENDOR_ID_AT,		0xc107), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
	{ PCI_DEVICE(0x16ec,			0x0116), 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
	{ PCI_VENDOR_ID_LINKSYS,		0x1032,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
		PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
	{ 0x0001,				0x8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
		PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
	{0,},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
/* prevent driver from being loaded automatically */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
//MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
static int rx_copybreak = 200;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
static int use_dac;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
} debug = { -1 };
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
enum rtl_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
	MAC0		= 0,	/* Ethernet hardware address. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
	MAC4		= 4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
	MAR0		= 8,	/* Multicast filter. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
	CounterAddrLow		= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
	CounterAddrHigh		= 0x14,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
	TxDescStartAddrLow	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
	TxDescStartAddrHigh	= 0x24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
	TxHDescStartAddrLow	= 0x28,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
	TxHDescStartAddrHigh	= 0x2c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
	FLASH		= 0x30,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
	ERSR		= 0x36,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
	ChipCmd		= 0x37,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
	TxPoll		= 0x38,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
	IntrMask	= 0x3c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
	IntrStatus	= 0x3e,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
	TxConfig	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
	RxConfig	= 0x44,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
	RxMissed	= 0x4c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
	Cfg9346		= 0x50,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
	Config0		= 0x51,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	Config1		= 0x52,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	Config2		= 0x53,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	Config3		= 0x54,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
	Config4		= 0x55,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
	Config5		= 0x56,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
	MultiIntr	= 0x5c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
	PHYAR		= 0x60,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
	PHYstatus	= 0x6c,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
	RxMaxSize	= 0xda,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
	CPlusCmd	= 0xe0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
	IntrMitigate	= 0xe2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
	RxDescAddrLow	= 0xe4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
	RxDescAddrHigh	= 0xe8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
	EarlyTxThres	= 0xec,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	FuncEvent	= 0xf0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	FuncEventMask	= 0xf4,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
	FuncPresetState	= 0xf8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
	FuncForceEvent	= 0xfc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
enum rtl8110_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	TBICSR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	TBI_ANAR		= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
	TBI_LPAR		= 0x6a,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
enum rtl8168_8101_registers {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
	CSIDR			= 0x64,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
	CSIAR			= 0x68,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
#define	CSIAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
#define	CSIAR_WRITE_CMD			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
#define	CSIAR_BYTE_ENABLE		0x0f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
#define	CSIAR_BYTE_ENABLE_SHIFT		12
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
#define	CSIAR_ADDR_MASK			0x0fff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	EPHYAR			= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
#define	EPHYAR_FLAG			0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
#define	EPHYAR_WRITE_CMD		0x80000000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
#define	EPHYAR_REG_MASK			0x1f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
#define	EPHYAR_REG_SHIFT		16
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
#define	EPHYAR_DATA_MASK		0xffff
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	DBG_REG			= 0xd1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
#define	FIX_NAK_1			(1 << 4)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
#define	FIX_NAK_2			(1 << 3)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
enum rtl_register_content {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	/* InterruptStatusBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	SYSErr		= 0x8000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
	PCSTimeout	= 0x4000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
	SWInt		= 0x0100,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	TxDescUnavail	= 0x0080,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	RxFIFOOver	= 0x0040,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
	LinkChg		= 0x0020,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
	RxOverflow	= 0x0010,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	TxErr		= 0x0008,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
	TxOK		= 0x0004,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
	RxErr		= 0x0002,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	RxOK		= 0x0001,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	/* RxStatusDesc */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	RxFOVF	= (1 << 23),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	RxRWT	= (1 << 22),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	RxRES	= (1 << 21),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	RxRUNT	= (1 << 20),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
	RxCRC	= (1 << 19),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	/* ChipCmdBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
	CmdReset	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	CmdRxEnb	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	CmdTxEnb	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	RxBufEmpty	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	/* TXPoll register p.5 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	HPQ		= 0x80,		/* Poll cmd on the high prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	NPQ		= 0x40,		/* Poll cmd on the low prio queue */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	FSWInt		= 0x01,		/* Forced software interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
	/* Cfg9346Bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
	Cfg9346_Lock	= 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
	Cfg9346_Unlock	= 0xc0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
	/* rx_mode_bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	AcceptErr	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	AcceptRunt	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	AcceptBroadcast	= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	AcceptMulticast	= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	AcceptMyPhys	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	AcceptAllPhys	= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	/* RxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	RxCfgFIFOShift	= 13,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	RxCfgDMAShift	=  8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	/* TxConfigBits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	TxInterFrameGapShift = 24,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	TxDMAShift = 8,	/* DMA burst value (0-7) is shift this many bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	/* Config1 register p.24 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	LEDS1		= (1 << 7),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	LEDS0		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	MSIEnable	= (1 << 5),	/* Enable Message Signaled Interrupt */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	Speed_down	= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	MEMMAP		= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	IOMAP		= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	VPD		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	PMEnable	= (1 << 0),	/* Power Management Enable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	/* Config2 register p. 25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	PCI_Clock_66MHz = 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	PCI_Clock_33MHz = 0x00,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* Config3 register p.25 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	MagicPacket	= (1 << 5),	/* Wake up when receives a Magic Packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	LinkUp		= (1 << 4),	/* Wake up when the cable connection is re-established */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	Beacon_en	= (1 << 0),	/* 8168 only. Reserved in the 8168b */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	/* Config5 register p.27 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	BWF		= (1 << 6),	/* Accept Broadcast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
	MWF		= (1 << 5),	/* Accept Multicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	UWF		= (1 << 4),	/* Accept Unicast wakeup frame */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	LanWake		= (1 << 1),	/* LanWake enable/disable */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	/* TBICSR p.28 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
	TBIReset	= 0x80000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
	TBILoopback	= 0x40000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
	TBINwEnable	= 0x20000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	TBINwRestart	= 0x10000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	TBILinkOk	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	TBINwComplete	= 0x01000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	/* CPlusCmd p.31 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	EnableBist	= (1 << 15),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	Mac_dbgo_oe	= (1 << 14),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	Normal_mode	= (1 << 13),	// unused
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	Force_half_dup	= (1 << 12),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	Force_rxflow_en	= (1 << 11),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	Force_txflow_en	= (1 << 10),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	Cxpl_dbg_sel	= (1 << 9),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	ASF		= (1 << 8),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	PktCntrDisable	= (1 << 7),	// 8168 8101
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	Mac_dbgo_sel	= 0x001c,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	RxVlan		= (1 << 6),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	RxChkSum	= (1 << 5),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	PCIDAC		= (1 << 4),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	PCIMulRW	= (1 << 3),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	INTT_0		= 0x0000,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	INTT_1		= 0x0001,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	INTT_2		= 0x0002,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	INTT_3		= 0x0003,	// 8168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	/* rtl8169_PHYstatus */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	TBI_Enable	= 0x80,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	TxFlowCtrl	= 0x40,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	RxFlowCtrl	= 0x20,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	_1000bpsF	= 0x10,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	_100bps		= 0x08,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	_10bps		= 0x04,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	LinkStatus	= 0x02,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	FullDup		= 0x01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	/* _TBICSRBit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	TBILinkOK	= 0x02000000,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	/* DumpCounterCommand */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	CounterDump	= 0x8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
enum desc_status_bit {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	DescOwn		= (1 << 31), /* Descriptor is owned by NIC */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	RingEnd		= (1 << 30), /* End of descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	FirstFrag	= (1 << 29), /* First segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	LastFrag	= (1 << 28), /* Final segment of a packet */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	/* Tx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	LargeSend	= (1 << 27), /* TCP Large Send Offload (TSO) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	MSSShift	= 16,        /* MSS value position */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	MSSMask		= 0xfff,     /* MSS value + LargeSend bit: 12 bits */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
	IPCS		= (1 << 18), /* Calculate IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
	UDPCS		= (1 << 17), /* Calculate UDP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
	TCPCS		= (1 << 16), /* Calculate TCP/IP checksum */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
	TxVlanTag	= (1 << 17), /* Add VLAN tag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	/* Rx private */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	PID1		= (1 << 18), /* Protocol ID bit 1/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	PID0		= (1 << 17), /* Protocol ID bit 2/2 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
#define RxProtoUDP	(PID1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
#define RxProtoTCP	(PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
#define RxProtoIP	(PID1 | PID0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
#define RxProtoMask	RxProtoIP
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	IPFail		= (1 << 16), /* IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
	RxVlanTag	= (1 << 16), /* VLAN tag available */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
#define RsvdMask	0x3fffc000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
struct TxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
struct RxDesc {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	__le32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	__le32 opts2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	__le64 addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
struct ring_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	struct sk_buff	*skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	u32		len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	u8		__pad[sizeof(void *) - sizeof(u32)];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
enum features {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	RTL_FEATURE_WOL		= (1 << 0),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	RTL_FEATURE_MSI		= (1 << 1),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	RTL_FEATURE_GMII	= (1 << 2),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
struct rtl8169_counters {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
	__le64	tx_packets;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
	__le64	rx_packets;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
	__le64	tx_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
	__le32	rx_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	__le16	rx_missed;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	__le16	align_errors;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	__le32	tx_one_collision;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	__le32	tx_multi_collision;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	__le64	rx_unicast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	__le64	rx_broadcast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	__le32	rx_multicast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
	__le16	tx_aborted;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	__le16	tx_underun;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
struct rtl8169_private {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	void __iomem *mmio_addr;	/* memory map physical address */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
	struct pci_dev *pci_dev;	/* Index of PCI device */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	struct napi_struct napi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	spinlock_t lock;		/* spin lock flag */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	u32 msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	int chipset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	u32 dirty_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	u32 dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	struct TxDesc *TxDescArray;	/* 256-aligned Tx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	struct RxDesc *RxDescArray;	/* 256-aligned Rx descriptor ring */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
	dma_addr_t TxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
	dma_addr_t RxPhyAddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
	struct sk_buff *Rx_skbuff[NUM_RX_DESC];	/* Rx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
	struct ring_info tx_skb[NUM_TX_DESC];	/* Tx data buffers */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	unsigned align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	unsigned rx_buf_sz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	struct timer_list timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	u16 cp_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
	u16 intr_mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
	int phy_auto_nego_reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
	int phy_1000_ctrl_reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	struct vlan_group *vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
	int (*get_settings)(struct net_device *, struct ethtool_cmd *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	void (*phy_reset_enable)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	unsigned int (*phy_reset_pending)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	unsigned int (*link_ok)(void __iomem *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	int pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	struct delayed_work task;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	unsigned features;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	struct mii_if_info mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	struct rtl8169_counters counters;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
	ec_device_t *ecdev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
	unsigned long ec_watchdog_jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
MODULE_DESCRIPTION("EtherCAT-capable RealTek RTL-8169 Gigabit Ethernet driver");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
module_param(rx_copybreak, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
module_param(use_dac, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
module_param_named(debug, debug.msg_enable, int, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
MODULE_LICENSE("GPL");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
MODULE_VERSION(EC_MASTER_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
static int rtl8169_open(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
static int rtl8169_init_ring(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
static void rtl_hw_start(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
static int rtl8169_close(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
static void rtl_set_rx_mode(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
static void rtl8169_tx_timeout(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
				void __iomem *, u32 budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
static void rtl8169_down(struct net_device *dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
static void rtl8169_rx_clear(struct rtl8169_private *tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
static int rtl8169_poll(struct napi_struct *napi, int budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
static const unsigned int rtl8169_rx_config =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	(RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
static void mdio_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	RTL_W32(PHYAR, 0x80000000 | (reg_addr & 0x1f) << 16 | (value & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
		 * Check if the RTL8169 has completed writing to the specified
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
		 * MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
		if (!(RTL_R32(PHYAR) & 0x80000000))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
static int mdio_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
	int i, value = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
	RTL_W32(PHYAR, 0x0 | (reg_addr & 0x1f) << 16);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	for (i = 20; i > 0; i--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
		 * Check if the RTL8169 has completed retrieving data from
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
		 * the specified MII register.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
		if (RTL_R32(PHYAR) & 0x80000000) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
			value = RTL_R32(PHYAR) & 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
		udelay(25);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
static void mdio_patch(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	mdio_write(ioaddr, reg_addr, mdio_read(ioaddr, reg_addr) | value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
			   int val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
	mdio_write(ioaddr, location, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	return mdio_read(ioaddr, location);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
static void rtl_ephy_write(void __iomem *ioaddr, int reg_addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
		if (!(RTL_R32(EPHYAR) & EPHYAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
static u16 rtl_ephy_read(void __iomem *ioaddr, int reg_addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	u16 value = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
		if (RTL_R32(EPHYAR) & EPHYAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
			value = RTL_R32(EPHYAR) & EPHYAR_DATA_MASK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
static void rtl_csi_write(void __iomem *ioaddr, int addr, int value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	RTL_W32(CSIDR, value);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
		if (!(RTL_R32(CSIAR) & CSIAR_FLAG))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	u32 value = ~0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
		if (RTL_R32(CSIAR) & CSIAR_FLAG) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
			value = RTL_R32(CSIDR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
	return value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
static void rtl8169_asic_down(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	RTL_W8(ChipCmd, 0x00);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
	return RTL_R32(TBICSR) & TBIReset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
static unsigned int rtl8169_xmii_reset_pending(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
	return mdio_read(ioaddr, MII_BMCR) & BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
	return RTL_R32(TBICSR) & TBILinkOk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
	return RTL_R8(PHYstatus) & LinkStatus;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
static void rtl8169_tbi_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
static void rtl8169_xmii_reset_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
	unsigned int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	val = mdio_read(ioaddr, MII_BMCR) | BMCR_RESET;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	mdio_write(ioaddr, MII_BMCR, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
static void rtl8169_check_link_status(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
				      struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
				      void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
    if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
		ecdev_set_link(tp->ecdev, tp->link_ok(ioaddr) ? 1 : 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
		spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
		if (tp->link_ok(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
			netif_carrier_on(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
			if (netif_msg_ifup(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
				printk(KERN_INFO PFX "%s: link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
			if (netif_msg_ifdown(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
				printk(KERN_INFO PFX "%s: link down\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
			netif_carrier_off(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
		spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	u8 options;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	wol->wolopts = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	wol->supported = WAKE_ANY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	options = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	if (!(options & PMEnable))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
	options = RTL_R8(Config3);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	if (options & LinkUp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
		wol->wolopts |= WAKE_PHY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	if (options & MagicPacket)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
		wol->wolopts |= WAKE_MAGIC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	options = RTL_R8(Config5);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	if (options & UWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
		wol->wolopts |= WAKE_UCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	if (options & BWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
		wol->wolopts |= WAKE_BCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	if (options & MWF)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
		wol->wolopts |= WAKE_MCAST;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
	static struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
		u32 opt;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
		u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
		u8  mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	} cfg[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
		{ WAKE_ANY,   Config1, PMEnable },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
		{ WAKE_PHY,   Config3, LinkUp },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
		{ WAKE_MAGIC, Config3, MagicPacket },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
		{ WAKE_UCAST, Config5, UWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
		{ WAKE_BCAST, Config5, BWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
		{ WAKE_MCAST, Config5, MWF },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
		{ WAKE_ANY,   Config5, LanWake }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	for (i = 0; i < ARRAY_SIZE(cfg); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
		u8 options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
		if (wol->wolopts & cfg[i].opt)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
			options |= cfg[i].mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
		RTL_W8(cfg[i].reg, options);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	if (wol->wolopts)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
		tp->features |= RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
		tp->features &= ~RTL_FEATURE_WOL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
static void rtl8169_get_drvinfo(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
				struct ethtool_drvinfo *info)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	strcpy(info->driver, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	strcpy(info->version, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	strcpy(info->bus_info, pci_name(tp->pci_dev));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
static int rtl8169_get_regs_len(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
	return R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
static int rtl8169_set_speed_tbi(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
				 u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	reg = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
	    (duplex == DUPLEX_FULL)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	} else if (autoneg == AUTONEG_ENABLE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
			printk(KERN_WARNING "%s: "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
			       "incorrect speed setting refused in TBI mode\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		ret = -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
static int rtl8169_set_speed_xmii(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
				  u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	int giga_ctrl, bmcr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
	if (autoneg == AUTONEG_ENABLE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
		int auto_nego;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		auto_nego = mdio_read(ioaddr, MII_ADVERTISE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		auto_nego |= (ADVERTISE_10HALF | ADVERTISE_10FULL |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
			      ADVERTISE_100HALF | ADVERTISE_100FULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
		auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		giga_ctrl = mdio_read(ioaddr, MII_CTRL1000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
		giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		/* The 8100e/8101e/8102e do Fast Ethernet only. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
		if ((tp->mac_version != RTL_GIGA_MAC_VER_07) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
		    (tp->mac_version != RTL_GIGA_MAC_VER_08) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		    (tp->mac_version != RTL_GIGA_MAC_VER_09) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
		    (tp->mac_version != RTL_GIGA_MAC_VER_10) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
		    (tp->mac_version != RTL_GIGA_MAC_VER_13) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
		    (tp->mac_version != RTL_GIGA_MAC_VER_14) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
		    (tp->mac_version != RTL_GIGA_MAC_VER_15) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
		    (tp->mac_version != RTL_GIGA_MAC_VER_16)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
			giga_ctrl |= ADVERTISE_1000FULL | ADVERTISE_1000HALF;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		} else if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
			printk(KERN_INFO "%s: PHY does not support 1000Mbps.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		    (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
		    (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
			/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
			 * Wake up the PHY.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			 * Vendor specific (0x1f) and reserved (0x0e) MII
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
			 * registers.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
			mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
			mdio_write(ioaddr, 0x0e, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
		tp->phy_auto_nego_reg = auto_nego;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
		mdio_write(ioaddr, MII_ADVERTISE, auto_nego);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
		mdio_write(ioaddr, MII_CTRL1000, giga_ctrl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
		giga_ctrl = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
		if (speed == SPEED_10)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
			bmcr = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		else if (speed == SPEED_100)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
			bmcr = BMCR_SPEED100;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
		else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
			return -EINVAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
		if (duplex == DUPLEX_FULL)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
			bmcr |= BMCR_FULLDPLX;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
		mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	tp->phy_1000_ctrl_reg = giga_ctrl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
	mdio_write(ioaddr, MII_BMCR, bmcr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
		if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
			mdio_write(ioaddr, 0x17, 0x2138);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
			mdio_write(ioaddr, 0x0e, 0x0260);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
			mdio_write(ioaddr, 0x17, 0x2108);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
			mdio_write(ioaddr, 0x0e, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
static int rtl8169_set_speed(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
			     u8 autoneg, u16 speed, u8 duplex)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	ret = tp->set_speed(dev, autoneg, speed, duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	if (netif_running(dev) && (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
		mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
	ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
static u32 rtl8169_get_rx_csum(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
	return tp->cp_cmd & RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
static int rtl8169_set_rx_csum(struct net_device *dev, u32 data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	if (data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
		tp->cp_cmd |= RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
		tp->cp_cmd &= ~RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
		TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
static void rtl8169_vlan_rx_register(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
				     struct vlan_group *grp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
	tp->vlgrp = grp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	if (tp->vlgrp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
		tp->cp_cmd |= RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
		tp->cp_cmd &= ~RxVlan;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	u32 opts2 = le32_to_cpu(desc->opts2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	struct vlan_group *vlgrp = tp->vlgrp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	if (vlgrp && (opts2 & RxVlanTag)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
		vlan_hwaccel_receive_skb(skb, vlgrp, swab16(opts2 & 0xffff));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
		ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
	} else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
		ret = -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
#else /* !CONFIG_R8169_VLAN */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
static inline u32 rtl8169_tx_vlan_tag(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
				      struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
			       struct sk_buff *skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	return -1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
	cmd->supported =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
	cmd->port = PORT_FIBRE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	cmd->transceiver = XCVR_INTERNAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	status = RTL_R32(TBICSR);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	cmd->advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	cmd->autoneg = !!(status & TBINwEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	cmd->speed = SPEED_1000;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	cmd->duplex = DUPLEX_FULL; /* Always set */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	return mii_ethtool_gset(&tp->mii, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	rc = tp->get_settings(dev, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
			     void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	if (regs->len > R8169_REGS_SIZE)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
		regs->len = R8169_REGS_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	memcpy_fromio(p, tp->mmio_addr, regs->len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
static u32 rtl8169_get_msglevel(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	return tp->msg_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
static void rtl8169_set_msglevel(struct net_device *dev, u32 value)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	tp->msg_enable = value;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	"tx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
	"rx_packets",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	"tx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
	"rx_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	"rx_missed",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
	"align_errors",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
	"tx_single_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
	"tx_multi_collisions",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	"unicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
	"broadcast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	"multicast",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
	"tx_aborted",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
	"tx_underrun",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
static int rtl8169_get_sset_count(struct net_device *dev, int sset)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
	switch (sset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
		return ARRAY_SIZE(rtl8169_gstrings);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
		return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
static void rtl8169_update_counters(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	struct rtl8169_counters *counters;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	dma_addr_t paddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
	u32 cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
	int wait = 1000;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
	 * Some chips are unable to dump tally counters when the receiver
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	 * is disabled.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
	counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	if (!counters)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
	cmd = (u64)paddr & DMA_32BIT_MASK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	RTL_W32(CounterAddrLow, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	RTL_W32(CounterAddrLow, cmd | CounterDump);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	while (wait--) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
		if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
			/* copy updated counters */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
			memcpy(&tp->counters, counters, sizeof(*counters));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
		udelay(10);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
	RTL_W32(CounterAddrLow, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
	RTL_W32(CounterAddrHigh, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
	pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
static void rtl8169_get_ethtool_stats(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
				      struct ethtool_stats *stats, u64 *data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	ASSERT_RTNL();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	rtl8169_update_counters(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	data[0] = le64_to_cpu(tp->counters.tx_packets);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	data[1] = le64_to_cpu(tp->counters.rx_packets);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	data[2] = le64_to_cpu(tp->counters.tx_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	data[3] = le32_to_cpu(tp->counters.rx_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	data[4] = le16_to_cpu(tp->counters.rx_missed);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	data[5] = le16_to_cpu(tp->counters.align_errors);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	data[6] = le32_to_cpu(tp->counters.tx_one_collision);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	data[8] = le64_to_cpu(tp->counters.rx_unicast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
	data[9] = le64_to_cpu(tp->counters.rx_broadcast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
	data[10] = le32_to_cpu(tp->counters.rx_multicast);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
	data[11] = le16_to_cpu(tp->counters.tx_aborted);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
	data[12] = le16_to_cpu(tp->counters.tx_underun);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	switch(stringset) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
	case ETH_SS_STATS:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		memcpy(data, *rtl8169_gstrings, sizeof(rtl8169_gstrings));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
static const struct ethtool_ops rtl8169_ethtool_ops = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
	.get_drvinfo		= rtl8169_get_drvinfo,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
	.get_regs_len		= rtl8169_get_regs_len,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
	.get_link		= ethtool_op_get_link,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	.get_settings		= rtl8169_get_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	.set_settings		= rtl8169_set_settings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	.get_msglevel		= rtl8169_get_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	.set_msglevel		= rtl8169_set_msglevel,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	.get_rx_csum		= rtl8169_get_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	.set_rx_csum		= rtl8169_set_rx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	.set_tx_csum		= ethtool_op_set_tx_csum,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
	.set_sg			= ethtool_op_set_sg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	.set_tso		= ethtool_op_set_tso,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	.get_regs		= rtl8169_get_regs,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
	.get_wol		= rtl8169_get_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
	.set_wol		= rtl8169_set_wol,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	.get_strings		= rtl8169_get_strings,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
	.get_sset_count		= rtl8169_get_sset_count,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
	.get_ethtool_stats	= rtl8169_get_ethtool_stats,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
				       int bitnum, int bitval)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
	int val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
	val = mdio_read(ioaddr, reg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
	val = (bitval == 1) ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
		val | (bitval << bitnum) :  val & ~(0x0001 << bitnum);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
	mdio_write(ioaddr, reg, val & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
static void rtl8169_get_mac_version(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
				    void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
	 * The driver currently handles the 8168Bf and the 8168Be identically
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	 * but they can be identified more specifically through the test below
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
	 * if needed:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	 * Same thing for the 8101Eb and the 8101Ec:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	const struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
		u32 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
		int mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	} mac_info[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
		/* 8168B family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
		{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_20 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
		/* 8168B family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
		{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
		{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		/* 8101 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
		{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
		{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
		{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
		/* FIXME: where did these entries come from ? -- FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
		{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
		{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		/* 8110 family. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
		{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
		{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
		{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
		{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
		/* Catch-all */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
		{ 0x00000000, 0x00000000,	RTL_GIGA_MAC_NONE   }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	}, *p = mac_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	u32 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
	reg = RTL_R32(TxConfig);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	while ((reg & p->mask) != p->val)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
		p++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	tp->mac_version = p->mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
static void rtl8169_print_mac_version(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	dprintk("mac_version = 0x%02x\n", tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
struct phy_reg {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
	u16 reg;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
	u16 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
static void rtl_phy_write(void __iomem *ioaddr, struct phy_reg *regs, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		mdio_write(ioaddr, regs->reg, regs->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		regs++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
static void rtl8169s_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
		u16 regs[5]; /* Beware of bit-sign propagation */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	} phy_magic[5] = { {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
		{ 0x0000,	//w 4 15 12 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
		  0x00a1,	//w 3 15 0 00a1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
		  0x0008,	//w 2 15 0 0008
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
		  0x1020,	//w 1 15 0 1020
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		  0x1000 } },{	//w 0 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		{ 0x7000,	//w 4 15 12 7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		  0xde60,	//w 2 15 0 de60
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
		  0x0077 } },{	//w 0 15 0 0077
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		{ 0xa000,	//w 4 15 12 a
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
		  0xfa00 } },{	//w 0 15 0 fa00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
		{ 0xb000,	//w 4 15 12 b
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
		  0xff41,	//w 3 15 0 ff41
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
		  0xde20,	//w 2 15 0 de20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		  0x0140,	//w 1 15 0 0140
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
		  0x00bb } },{	//w 0 15 0 00bb
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		{ 0xf000,	//w 4 15 12 f
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		  0xdf01,	//w 3 15 0 df01
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		  0xdf20,	//w 2 15 0 df20
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
		  0xff95,	//w 1 15 0 ff95
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
		  0xbf00 }	//w 0 15 0 bf00
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	}, *p = phy_magic;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	mdio_write(ioaddr, 0x1f, 0x0001);		//w 31 2 0 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	mdio_write(ioaddr, 0x15, 0x1000);		//w 21 15 0 1000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	mdio_write(ioaddr, 0x18, 0x65c7);		//w 24 15 0 65c7
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
	rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0);	//w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	for (i = 0; i < ARRAY_SIZE(phy_magic); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		int val, pos = 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
		val = (mdio_read(ioaddr, pos) & 0x0fff) | (p->regs[0] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
		mdio_write(ioaddr, pos, val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
		while (--pos >= 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
			mdio_write(ioaddr, pos, p->regs[4 - pos] & 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 1); //w 4 11 11 1
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
		rtl8169_write_gmii_reg_bit(ioaddr, 4, 11, 0); //w 4 11 11 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
	mdio_write(ioaddr, 0x1f, 0x0000); //w 31 2 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
static void rtl8169sb_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
		{ 0x01, 0x90d0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
static void rtl8168cp_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
		{ 0x1d, 0x0f00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
		{ 0x0c, 0x1ec8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
static void rtl8168c_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
		{ 0x1f, 0x0001 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		{ 0x00, 0x88d4 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		{ 0x01, 0x82b1 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
		{ 0x03, 0x7002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
		{ 0x08, 0x9e30 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
		{ 0x09, 0x01f0 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
		{ 0x0a, 0x5500 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
		{ 0x0c, 0x00c8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		{ 0x12, 0xc096 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
		{ 0x16, 0x000a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
static void rtl8168cx_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
		{ 0x12, 0x2300 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
		{ 0x16, 0x0f0a },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
		{ 0x1f, 0x0000 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
		{ 0x1f, 0x0002 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
		{ 0x0c, 0x7eb8 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
static void rtl8102e_hw_phy_config(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
	struct phy_reg phy_reg_init[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
		{ 0x1f, 0x0003 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		{ 0x08, 0x441d },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
		{ 0x01, 0x9100 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
		{ 0x1f, 0x0000 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
	mdio_write(ioaddr, 0x1f, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
	mdio_patch(ioaddr, 0x11, 1 << 12);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
	mdio_patch(ioaddr, 0x19, 1 << 13);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	rtl_phy_write(ioaddr, phy_reg_init, ARRAY_SIZE(phy_reg_init));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
static void rtl_hw_phy_config(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	case RTL_GIGA_MAC_VER_01:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	case RTL_GIGA_MAC_VER_02:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	case RTL_GIGA_MAC_VER_03:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
		rtl8169s_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
	case RTL_GIGA_MAC_VER_04:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
		rtl8169sb_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
		rtl8102e_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	case RTL_GIGA_MAC_VER_18:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		rtl8168cp_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
	case RTL_GIGA_MAC_VER_19:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		rtl8168c_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	case RTL_GIGA_MAC_VER_20:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		rtl8168cx_hw_phy_config(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	default:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
static void rtl8169_phy_timer(unsigned long __opaque)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	struct net_device *dev = (struct net_device *)__opaque;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	unsigned long timeout = RTL8169_PHY_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
	if (!(tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
	if (tp->phy_reset_pending(ioaddr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
		 * A busy loop could burn quite a few cycles on nowadays CPU.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		 * Let's delay the execution of the timer for a few ticks.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
		timeout = HZ/10;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		goto out_mod_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
	if (tp->link_ok(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
		printk(KERN_WARNING "%s: PHY reset until link up\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
out_mod_timer:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		mod_timer(timer, jiffies + timeout);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
static inline void rtl8169_delete_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
	del_timer_sync(timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
static inline void rtl8169_request_timer(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	struct timer_list *timer = &tp->timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
	if (tp->ecdev || tp->mac_version <= RTL_GIGA_MAC_VER_01)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
static void ec_poll(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
	rtl8169_interrupt(pdev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
    if (jiffies - tp->ec_watchdog_jiffies >= 2 * HZ) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
		rtl8169_phy_timer((unsigned long) dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
		tp->ec_watchdog_jiffies = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
#ifdef CONFIG_NET_POLL_CONTROLLER
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
 * Polling 'interrupt' - used by things like netconsole to send skbs
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
 * without having to re-enable interrupts. It's not called while
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
 * the interrupt routine is executing.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
static void rtl8169_netpoll(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	disable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
	rtl8169_interrupt(pdev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
	enable_irq(pdev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
				  void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
static void rtl8169_phy_reset(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
			      struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	tp->phy_reset_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
		if (!tp->phy_reset_pending(ioaddr))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
			return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		msleep(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	if (netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
		printk(KERN_ERR "%s: PHY reset failed.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	rtl_hw_phy_config(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
		pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
		RTL_W8(0x82, 0x01);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
		mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	rtl8169_phy_reset(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	 * rtl8169_set_speed_xmii takes good care of the Fast Ethernet
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	 * only 8101. Don't panic.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
	rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
	if ((RTL_R8(PHYstatus) & TBI_Enable) && netif_msg_link(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
	u32 high;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
	u32 low;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	high = addr[4] | (addr[5] << 8);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
	RTL_W32(MAC0, low);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
	RTL_W32(MAC4, high);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
static int rtl_set_mac_address(struct net_device *dev, void *p)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
	struct sockaddr *addr = p;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	if (!is_valid_ether_addr(addr->sa_data))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		return -EADDRNOTAVAIL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
	rtl_rar_set(tp, dev->dev_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
	struct mii_ioctl_data *data = if_mii(ifr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
		return -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
	switch (cmd) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	case SIOCGMIIPHY:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
		data->phy_id = 32; /* Internal PHY */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	case SIOCGMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
		data->val_out = mdio_read(tp->mmio_addr, data->reg_num & 0x1f);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	case SIOCSMIIREG:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
		if (!capable(CAP_NET_ADMIN))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
			return -EPERM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
		mdio_write(tp->mmio_addr, data->reg_num & 0x1f, data->val_in);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
		return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
	return -EOPNOTSUPP;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
static const struct rtl_cfg_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
	void (*hw_start)(struct net_device *);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
	unsigned int region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
	unsigned int align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	u16 intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
	u16 napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	unsigned features;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	u8 default_ver;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
} rtl_cfg_infos [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	[RTL_CFG_0] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
		.hw_start	= rtl_hw_start_8169,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
		.region		= 1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
		.align		= 0,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
		.features	= RTL_FEATURE_GMII,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
		.default_ver	= RTL_GIGA_MAC_VER_01,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
	[RTL_CFG_1] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
		.hw_start	= rtl_hw_start_8168,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
		.intr_event	= SYSErr | LinkChg | RxOverflow |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
				  TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		.napi_event	= TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
		.default_ver	= RTL_GIGA_MAC_VER_11,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	},
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
	[RTL_CFG_2] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		.hw_start	= rtl_hw_start_8101,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
		.region		= 2,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
		.align		= 8,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
		.intr_event	= SYSErr | LinkChg | RxOverflow | PCSTimeout |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
				  RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		.napi_event	= RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
		.features	= RTL_FEATURE_MSI,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
		.default_ver	= RTL_GIGA_MAC_VER_13,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
/* Cfg9346_Unlock assumed. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
			    const struct rtl_cfg_info *cfg)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	unsigned msi = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
	u8 cfg2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	cfg2 = RTL_R8(Config2) & ~MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	if (cfg->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
		if (pci_enable_msi(pdev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
			dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
			cfg2 |= MSIEnable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
			msi = RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	RTL_W8(Config2, cfg2);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
	return msi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
	if (tp->features & RTL_FEATURE_MSI) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
		pci_disable_msi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		tp->features &= ~RTL_FEATURE_MSI;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
static int __devinit
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
	const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
	const unsigned int region = cfg->region;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	struct rtl8169_private *tp;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
	struct mii_if_info *mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
	struct net_device *dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	void __iomem *ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
	int rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	if (netif_msg_drv(&debug)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
		printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
		       MODULENAME, RTL8169_VERSION);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	dev = alloc_etherdev(sizeof (*tp));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	if (!dev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		if (netif_msg_drv(&debug))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
			dev_err(&pdev->dev, "unable to alloc new ethernet\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
		rc = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	SET_NETDEV_DEV(dev, &pdev->dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	tp->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	tp->pci_dev = pdev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
	tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
	mii = &tp->mii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	mii->dev = dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	mii->mdio_read = rtl_mdio_read;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
	mii->mdio_write = rtl_mdio_write;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	mii->phy_id_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	mii->reg_num_mask = 0x1f;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	rc = pci_enable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
			dev_err(&pdev->dev, "enable failure\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		goto err_out_free_dev_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
	rc = pci_set_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		goto err_out_disable_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
	/* make sure PCI base addr 1 is MMIO */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
	if (!(pci_resource_flags(pdev, region) & IORESOURCE_MEM)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
				"region #%d not an MMIO resource, aborting\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
				region);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	/* check for weird/broken PCI region reporting */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
			dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
				"Invalid PCI region size(s), aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
		rc = -ENODEV;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
	rc = pci_request_regions(pdev, MODULENAME);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
	if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
			dev_err(&pdev->dev, "could not request regions.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		goto err_out_mwi_3;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	tp->cp_cmd = PCIMulRW | RxChkSum;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	if ((sizeof(dma_addr_t) > 4) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
	    !pci_set_dma_mask(pdev, DMA_64BIT_MASK) && use_dac) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		tp->cp_cmd |= PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		dev->features |= NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
		if (rc < 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
			if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
				dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
					"DMA configuration failed.\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
			goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
	pci_set_master(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	/* ioremap MMIO region */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
	ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	if (!ioaddr) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
		if (netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
			dev_err(&pdev->dev, "cannot remap MMIO, aborting\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
		rc = -EIO;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
		goto err_out_free_res_4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
	tp->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	if (!tp->pcie_cap && netif_msg_probe(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
		dev_info(&pdev->dev, "no PCI Express capability\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
	RTL_W16(IntrMask, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
	RTL_W16(IntrStatus, 0xffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
	/* Identify chip attached to board */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
	rtl8169_get_mac_version(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
	/* Use appropriate default if unknown */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	if (tp->mac_version == RTL_GIGA_MAC_NONE) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
			dev_notice(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
				   "unknown MAC, using family default\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
		tp->mac_version = cfg->default_ver;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
	rtl8169_print_mac_version(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
	for (i = 0; i < ARRAY_SIZE(rtl_chip_info); i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		if (tp->mac_version == rtl_chip_info[i].mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
	if (i == ARRAY_SIZE(rtl_chip_info)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
		dev_err(&pdev->dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
			"driver bug, MAC version not found in rtl_chip_info\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		goto err_out_msi_5;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
	tp->chipset = i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
	tp->features |= rtl_try_msi(pdev, ioaddr, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
	if ((tp->mac_version <= RTL_GIGA_MAC_VER_06) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
	    (RTL_R8(PHYstatus) & TBI_Enable)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
		tp->set_speed = rtl8169_set_speed_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
		tp->get_settings = rtl8169_gset_tbi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		tp->phy_reset_enable = rtl8169_tbi_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		tp->phy_reset_pending = rtl8169_tbi_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		tp->link_ok = rtl8169_tbi_link_ok;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
		tp->phy_1000_ctrl_reg = ADVERTISE_1000FULL; /* Implied by TBI */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
		tp->set_speed = rtl8169_set_speed_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		tp->get_settings = rtl8169_gset_xmii;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		tp->phy_reset_enable = rtl8169_xmii_reset_enable;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		tp->phy_reset_pending = rtl8169_xmii_reset_pending;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		tp->link_ok = rtl8169_xmii_link_ok;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		dev->do_ioctl = rtl8169_ioctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
	/* Get MAC address.  FIXME: read EEPROM */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
	for (i = 0; i < MAC_ADDR_LEN; i++)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
		dev->dev_addr[i] = RTL_R8(MAC0 + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
	dev->open = rtl8169_open;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
	dev->hard_start_xmit = rtl8169_start_xmit;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
	dev->get_stats = rtl8169_get_stats;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
	dev->stop = rtl8169_close;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
	dev->tx_timeout = rtl8169_tx_timeout;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
	dev->set_multicast_list = rtl_set_rx_mode;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
	dev->irq = pdev->irq;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	dev->base_addr = (unsigned long) ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
	dev->change_mtu = rtl8169_change_mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
	dev->set_mac_address = rtl_set_mac_address;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
	netif_napi_add(dev, &tp->napi, rtl8169_poll, R8169_NAPI_WEIGHT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
#ifdef CONFIG_R8169_VLAN
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
	dev->vlan_rx_register = rtl8169_vlan_rx_register;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
#ifdef CONFIG_NET_POLL_CONTROLLER
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
	dev->poll_controller = rtl8169_netpoll;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
	tp->mmio_addr = ioaddr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
	tp->align = cfg->align;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
	tp->hw_start = cfg->hw_start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	tp->intr_event = cfg->intr_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
	tp->napi_event = cfg->napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
	init_timer(&tp->timer);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
	tp->timer.data = (unsigned long) dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
	tp->timer.function = rtl8169_phy_timer;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	spin_lock_init(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	// offer device to EtherCAT master module
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
		rc = register_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
		if (rc < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
			goto err_out_msi_5;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
	pci_set_drvdata(pdev, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
	if (netif_msg_probe(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
		u32 xid = RTL_R32(TxConfig) & 0x7cf0f8ff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		printk(KERN_INFO "%s: %s at 0x%lx, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
		       "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
		       "XID %08x IRQ %d\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
		       dev->name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		       rtl_chip_info[tp->chipset].name,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		       dev->base_addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		       dev->dev_addr[0], dev->dev_addr[1],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		       dev->dev_addr[2], dev->dev_addr[3],
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		       dev->dev_addr[4], dev->dev_addr[5], xid, dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	rtl8169_init_phy(dev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2016
	if (tp->ecdev) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2017
		rc = ecdev_open(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2018
		if (rc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2019
			ecdev_withdraw(tp->ecdev);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2020
			goto err_out_msi_5;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 1899
diff changeset
  2021
		}
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	return rc;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
err_out_msi_5:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	iounmap(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
err_out_free_res_4:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	pci_release_regions(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
err_out_mwi_3:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	pci_clear_mwi(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
err_out_disable_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
	pci_disable_device(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
err_out_free_dev_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
	free_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	flush_scheduled_work();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
		ecdev_close(tp->ecdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
		ecdev_withdraw(tp->ecdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
		unregister_netdev(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	rtl_disable_msi(pdev, tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	rtl8169_release_board(pdev, dev, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	pci_set_drvdata(pdev, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
static void rtl8169_set_rxbufsize(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
				  struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
	unsigned int mtu = dev->mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
	tp->rx_buf_sz = (mtu > RX_BUF_SIZE) ? mtu + ETH_HLEN + 8 : RX_BUF_SIZE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
static int rtl8169_open(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	int retval = -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	 * Rx and Tx desscriptors needs 256 bytes alignment.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	 * pci_alloc_consistent provides more.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
	tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
					       &tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	if (!tp->TxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
	tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
					       &tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
	if (!tp->RxDescArray)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		goto err_free_tx_0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
	retval = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
	if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		goto err_free_rx_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
	INIT_DELAYED_WORK(&tp->task, NULL);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	smp_mb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		retval = request_irq(dev->irq, rtl8169_interrupt,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
				(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
				dev->name, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		if (retval < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
			goto err_release_ring_2;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
		napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	return retval;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
err_release_ring_2:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
err_free_rx_1:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
err_free_tx_0:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
static void rtl8169_hw_reset(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
	/* Disable interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	/* Reset the chipset */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
	/* PCI commit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
	RTL_R8(ChipCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	u32 cfg = rtl8169_rx_config;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
	cfg |= (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
	RTL_W32(RxConfig, cfg);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
	/* Set DMA burst size and Interframe Gap Time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
		(InterFrameGap << TxInterFrameGapShift));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
static void rtl_hw_start(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
	/* Soft reset the chip. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	RTL_W8(ChipCmd, CmdReset);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	/* Check that the chip has finished the reset. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
	for (i = 0; i < 100; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
		if ((RTL_R8(ChipCmd) & CmdReset) == 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
		msleep_interruptible(1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
	tp->hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		netif_start_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
					 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
	 * register to be written before TxDescAddrLow to work.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
	 * Switching from MMIO to I/O access fixes the issue as well.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_32BIT_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
	u16 cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
	cmd = RTL_R16(CPlusCmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	RTL_W16(CPlusCmd, cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	return cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
	/* Low hurts. Let's disable the filtering. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	RTL_W16(RxMaxSize, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	struct {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		u32 mac_version;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
		u32 val;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	} cfg2_info [] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_33MHz, 0x000fff00 }, // 8110SCd
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
		{ RTL_GIGA_MAC_VER_05, PCI_Clock_66MHz, 0x000fffff },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_33MHz, 0x00ffff00 }, // 8110SCe
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		{ RTL_GIGA_MAC_VER_06, PCI_Clock_66MHz, 0x00ffffff }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
	}, *p = cfg2_info;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
	u32 clk;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		if ((p->mac_version == mac_version) && (p->clk == clk)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
			RTL_W32(0x7c, p->val);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
static void rtl_hw_start_8169(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	    (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
	    (tp->mac_version == RTL_GIGA_MAC_VER_03) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
	    (tp->mac_version == RTL_GIGA_MAC_VER_04))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	if ((tp->mac_version == RTL_GIGA_MAC_VER_02) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	    (tp->mac_version == RTL_GIGA_MAC_VER_03)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
		dprintk("Set MAC Reg C+CR Offset 0xE0. "
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
			"Bit-3 and bit-14 MUST be 1\n");
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		tp->cp_cmd |= (1 << 14);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
	 * Undocumented corner. Supposedly:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
	if ((tp->mac_version != RTL_GIGA_MAC_VER_01) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
	    (tp->mac_version != RTL_GIGA_MAC_VER_02) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	    (tp->mac_version != RTL_GIGA_MAC_VER_03) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	    (tp->mac_version != RTL_GIGA_MAC_VER_04)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
		rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
	/* no early-rx interrupts */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
	/* Enable all known interrupts by setting the interrupt mask. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
		u16 ctl;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
		pci_read_config_word(pdev, cap + PCI_EXP_DEVCTL, &ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
		ctl = (ctl & ~PCI_EXP_DEVCTL_READRQ) | force;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
		pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL, ctl);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
static void rtl_csi_access_enable(void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
	u32 csi;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	csi = rtl_csi_read(ioaddr, 0x070c) & 0x00ffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	rtl_csi_write(ioaddr, 0x070c, csi | 0x27000000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
struct ephy_info {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
	unsigned int offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
	u16 mask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
	u16 bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
static void rtl_ephy_init(void __iomem *ioaddr, struct ephy_info *e, int len)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	u16 w;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
	while (len-- > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
		w = (rtl_ephy_read(ioaddr, e->offset) & ~e->mask) | e->bits;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		rtl_ephy_write(ioaddr, e->offset, w);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
		e++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
static void rtl_hw_start_8168(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
	rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
	RTL_W16(IntrMitigate, 0x5151);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	/* Work around for RxFIFO overflow. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
		tp->intr_event |= RxFIFOOver | PCSTimeout;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
		tp->intr_event &= ~RxOverflow;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xF000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
#define R810X_CPCMD_QUIRK_MASK (\
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	EnableBist | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	Mac_dbgo_oe | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
	Force_half_dup | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
	Force_txflow_en | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	Cxpl_dbg_sel | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
	ASF | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	PktCntrDisable | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	PCIDAC | \
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
	PCIMulRW)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
static void rtl_hw_start_8102e_1(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	static struct ephy_info e_info_8102e_1[] = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
		{ 0x01,	0, 0x6e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
		{ 0x02,	0, 0x091f },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
		{ 0x03,	0, 0xc2f9 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
		{ 0x06,	0, 0xafb5 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
		{ 0x07,	0, 0x0e00 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
		{ 0x19,	0, 0xec80 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
		{ 0x01,	0, 0x2e65 },
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
		{ 0x01,	0, 0x6e65 }
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
	};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	u8 cfg1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
	RTL_W8(DBG_REG, FIX_NAK_1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	RTL_W8(Config1,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	cfg1 = RTL_R8(Config1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
		RTL_W8(Config1, cfg1 & ~LEDS0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	rtl_ephy_init(ioaddr, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
static void rtl_hw_start_8102e_2(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	rtl_csi_access_enable(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R810X_CPCMD_QUIRK_MASK);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
static void rtl_hw_start_8102e_3(void __iomem *ioaddr, struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
	rtl_ephy_write(ioaddr, 0x03, 0xc2f9);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
static void rtl_hw_start_8101(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	if ((tp->mac_version == RTL_GIGA_MAC_VER_13) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	    (tp->mac_version == RTL_GIGA_MAC_VER_16)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
		int cap = tp->pcie_cap;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		if (cap) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
			pci_write_config_word(pdev, cap + PCI_EXP_DEVCTL,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
					      PCI_EXP_DEVCTL_NOSNOOP_EN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	switch (tp->mac_version) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	case RTL_GIGA_MAC_VER_07:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
		rtl_hw_start_8102e_1(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
	case RTL_GIGA_MAC_VER_08:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		rtl_hw_start_8102e_3(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	case RTL_GIGA_MAC_VER_09:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
		rtl_hw_start_8102e_2(ioaddr, pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
		break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	RTL_W8(Cfg9346, Cfg9346_Unlock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
	RTL_W8(EarlyTxThres, EarlyTxThld);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
	rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
	RTL_W16(IntrMitigate, 0x0000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	rtl_set_rx_tx_desc_registers(tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	rtl_set_rx_tx_config_registers(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
	RTL_W8(Cfg9346, Cfg9346_Lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
	RTL_R8(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
	rtl_set_rx_mode(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
	int ret = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
		return -EINVAL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	dev->mtu = new_mtu;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	rtl8169_set_rxbufsize(tp, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	ret = rtl8169_init_ring(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	if (ret < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
	rtl8169_request_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	desc->addr = cpu_to_le64(0x0badbadbadbadbadull);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	desc->opts1 &= ~cpu_to_le32(DescOwn | RsvdMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
				struct sk_buff **sk_buff, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
			 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	dev_kfree_skb(*sk_buff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	*sk_buff = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
static inline void rtl8169_mark_to_asic(struct RxDesc *desc, u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
	desc->opts1 = cpu_to_le32(DescOwn | eor | rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
				       u32 rx_buf_sz)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
	desc->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
	rtl8169_mark_to_asic(desc, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
					    struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
					    struct RxDesc *desc, int rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
					    unsigned int align)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	unsigned int pad;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	pad = align ? align : NET_IP_ALIGN;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
				 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
	return skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	rtl8169_make_unusable_by_asic(desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
static void rtl8169_rx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
	for (i = 0; i < NUM_RX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
		if (tp->Rx_skbuff[i]) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
			rtl8169_free_rx_skb(tp, tp->Rx_skbuff + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
					    tp->RxDescArray + i);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
			   u32 start, u32 end)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	u32 cur;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
	for (cur = start; end - cur != 0; cur++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
		struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
		unsigned int i = cur % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2625
		WARN_ON((s32)(end - cur) < 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2626
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2627
		if (tp->Rx_skbuff[i])
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
			continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
		skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2631
					   tp->RxDescArray + i,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
					   tp->rx_buf_sz, tp->align);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
		if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2634
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2635
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
		tp->Rx_skbuff[i] = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	return cur - start;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2639
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2641
static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2642
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2643
	desc->opts1 |= cpu_to_le32(RingEnd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2649
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2650
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2651
static int rtl8169_init_ring(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2652
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2653
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2655
	rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2656
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2660
	if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2661
		goto err_out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2662
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2663
	rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2665
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
err_out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2668
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	return -ENOMEM;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
				 struct TxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	desc->opts1 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	desc->opts2 = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	desc->addr = 0x00;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	tx_skb->len = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
static void rtl8169_tx_clear(struct rtl8169_private *tp)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2685
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2688
	for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2689
		unsigned int entry = i % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2691
		unsigned int len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2692
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
		if (len) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2694
			struct sk_buff *skb = tx_skb->skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2695
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2696
			rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2697
					     tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2698
			if (skb) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2699
				if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2700
					dev_kfree_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
				tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2702
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
			tp->dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	tp->cur_tx = tp->dirty_tx = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
static void rtl8169_schedule_work(struct net_device *dev, work_func_t task)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2711
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	PREPARE_DELAYED_WORK(&tp->task, task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
	schedule_delayed_work(&tp->task, 4);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
static void rtl8169_wait_for_quiescence(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2719
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2722
	synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
	/* Wait for any pending NAPI task to complete */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2725
	napi_disable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	rtl8169_irq_mask_and_ack(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2728
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
	RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
	napi_enable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2733
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2734
static void rtl8169_reinit_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2736
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	int ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2744
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2747
	rtl8169_close(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
	ret = rtl8169_open(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
	if (unlikely(ret < 0)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		if (net_ratelimit() && netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
			printk(KERN_ERR PFX "%s: reinit failure (status = %d)."
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2753
			       " Rescheduling.\n", dev->name, ret);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2755
		rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
static void rtl8169_reset_task(struct work_struct *work)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2763
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
	struct rtl8169_private *tp =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2765
		container_of(work, struct rtl8169_private, task.work);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
	rtnl_lock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
		goto out_unlock;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2773
	rtl8169_wait_for_quiescence(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
	rtl8169_rx_interrupt(dev, tp, tp->mmio_addr, ~(u32)0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	if (tp->dirty_rx == tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2779
		rtl8169_init_ring_indexes(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2780
		rtl_hw_start(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
		netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2783
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
		if (net_ratelimit() && netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
			printk(KERN_EMERG PFX "%s: Rx buffers shortage\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
		rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
out_unlock:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
	rtnl_unlock();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2795
static void rtl8169_tx_timeout(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2797
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	if (tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
	rtl8169_hw_reset(tp->mmio_addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
	/* Let's wait a bit while any (async) irq lands on */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
			      u32 opts1)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	struct skb_shared_info *info = skb_shinfo(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	unsigned int cur_frag, entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
	struct TxDesc * uninitialized_var(txd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	entry = tp->cur_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2816
	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
		skb_frag_t *frag = info->frags + cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
		dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
		u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
		void *addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
		entry = (entry + 1) % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
		txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
		len = frag->size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
		addr = ((void *) page_address(frag->page)) + frag->page_offset;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2827
		mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2829
		/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
		status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
		txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
		tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	if (cur_frag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
		txd->opts1 |= cpu_to_le32(LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
	return cur_frag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	if (dev->features & NETIF_F_TSO) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
		u32 mss = skb_shinfo(skb)->gso_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
		if (mss)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
			return LargeSend | ((mss & MSSMask) << MSSShift);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
	if (skb->ip_summed == CHECKSUM_PARTIAL) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
		const struct iphdr *ip = ip_hdr(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
		if (ip->protocol == IPPROTO_TCP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
			return IPCS | TCPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2859
		else if (ip->protocol == IPPROTO_UDP)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
			return IPCS | UDPCS;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
		WARN_ON(1);	/* we need a WARN() */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
	unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
	struct TxDesc *txd = tp->TxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
	dma_addr_t mapping;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
	u32 status, len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
	u32 opts1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
	int ret = NETDEV_TX_OK;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2877
	if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2878
		if (netif_msg_drv(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2879
			printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2880
			       "%s: BUG! Tx Ring full when queue awake!\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2881
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2882
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2883
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2884
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2885
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2886
	if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2887
		goto err_stop;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2888
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2889
	opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2890
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2891
	frags = rtl8169_xmit_frags(tp, skb, opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2892
	if (frags) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2893
		len = skb_headlen(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2894
		opts1 |= FirstFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2895
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2896
		len = skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2897
		opts1 |= FirstFrag | LastFrag;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2898
		tp->tx_skb[entry].skb = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2899
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2900
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2901
	mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2902
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2903
	tp->tx_skb[entry].len = len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2904
	txd->addr = cpu_to_le64(mapping);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2905
	txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2906
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2907
	wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2908
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2909
	/* anti gcc 2.95.3 bugware (sic) */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2910
	status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2911
	txd->opts1 = cpu_to_le32(status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2912
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2913
	dev->trans_start = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2914
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2915
	tp->cur_tx += frags + 1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2916
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2917
	smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2918
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2919
	RTL_W8(TxPoll, NPQ);	/* set polling bit */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2920
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2921
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2922
		if (TX_BUFFS_AVAIL(tp) < MAX_SKB_FRAGS) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2923
			netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2924
			smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2925
			if (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2926
				netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2927
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2928
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2929
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2930
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2931
	return ret;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2932
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2933
err_stop:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2934
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2935
		netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2936
	ret = NETDEV_TX_BUSY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2937
	dev->stats.tx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2938
	goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2939
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2940
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2941
static void rtl8169_pcierr_interrupt(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2942
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2943
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2944
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2945
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2946
	u16 pci_status, pci_cmd;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2947
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2948
	pci_read_config_word(pdev, PCI_COMMAND, &pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2949
	pci_read_config_word(pdev, PCI_STATUS, &pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2950
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2951
	if (netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2952
		printk(KERN_ERR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2953
		       "%s: PCI error (cmd = 0x%04x, status = 0x%04x).\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2954
		       dev->name, pci_cmd, pci_status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2955
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2956
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2957
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2958
	 * The recovery sequence below admits a very elaborated explanation:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2959
	 * - it seems to work;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2960
	 * - I did not see what else could be done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2961
	 * - it makes iop3xx happy.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2962
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2963
	 * Feel free to adjust to your needs.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2964
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2965
	if (pdev->broken_parity_status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2966
		pci_cmd &= ~PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2967
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2968
		pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2969
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2970
	pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2971
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2972
	pci_write_config_word(pdev, PCI_STATUS,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2973
		pci_status & (PCI_STATUS_DETECTED_PARITY |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2974
		PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_REC_MASTER_ABORT |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2975
		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2976
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2977
	/* The infamous DAC f*ckup only happens at boot time */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2978
	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2979
		if (netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2980
			printk(KERN_INFO "%s: disabling PCI DAC.\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2981
		tp->cp_cmd &= ~PCIDAC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2982
		RTL_W16(CPlusCmd, tp->cp_cmd);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2983
		dev->features &= ~NETIF_F_HIGHDMA;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2984
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2985
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2986
	rtl8169_hw_reset(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2987
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2988
	rtl8169_schedule_work(dev, rtl8169_reinit_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2989
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2990
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2991
static void rtl8169_tx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2992
				 struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2993
				 void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2994
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2995
	unsigned int dirty_tx, tx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2996
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2997
	dirty_tx = tp->dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2998
	smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2999
	tx_left = tp->cur_tx - dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3000
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3001
	while (tx_left > 0) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3002
		unsigned int entry = dirty_tx % NUM_TX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3003
		struct ring_info *tx_skb = tp->tx_skb + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3004
		u32 len = tx_skb->len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3005
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3006
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3007
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3008
		status = le32_to_cpu(tp->TxDescArray[entry].opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3009
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3010
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3011
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3012
		dev->stats.tx_bytes += len;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3013
		dev->stats.tx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3014
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3015
		rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3016
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3017
		if (status & LastFrag) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3018
			if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3019
				dev_kfree_skb_irq(tx_skb->skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3020
			tx_skb->skb = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3021
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3022
		dirty_tx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3023
		tx_left--;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3024
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3025
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3026
	if (tp->dirty_tx != dirty_tx) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3027
		tp->dirty_tx = dirty_tx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3028
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3029
		if (!tp->ecdev && netif_queue_stopped(dev) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3030
		    (TX_BUFFS_AVAIL(tp) >= MAX_SKB_FRAGS)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3031
			netif_wake_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3032
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3033
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3034
		 * 8168 hack: TxPoll requests are lost when the Tx packets are
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3035
		 * too close. Let's kick an extra TxPoll request when a burst
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3036
		 * of start_xmit activity is detected (if it is not detected,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3037
		 * it is slow enough). -- FR
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3038
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3039
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3040
		if (tp->cur_tx != dirty_tx)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3041
			RTL_W8(TxPoll, NPQ);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3042
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3043
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3044
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3045
static inline int rtl8169_fragmented_frame(u32 status)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3046
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3047
	return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3048
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3049
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3050
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3051
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3052
	u32 opts1 = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3053
	u32 status = opts1 & RxProtoMask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3054
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3055
	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3056
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)) ||
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3057
	    ((status == RxProtoIP) && !(opts1 & IPFail)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3058
		skb->ip_summed = CHECKSUM_UNNECESSARY;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3059
	else
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3060
		skb->ip_summed = CHECKSUM_NONE;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3061
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3062
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3063
static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3064
				       struct rtl8169_private *tp, int pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3065
				       dma_addr_t addr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3066
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3067
	struct sk_buff *skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3068
	bool done = false;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3069
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3070
	if (pkt_size >= rx_copybreak)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3071
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3072
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3073
	skb = netdev_alloc_skb(tp->dev, pkt_size + NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3074
	if (!skb)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3075
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3076
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3077
	pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3078
				    PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3079
	skb_reserve(skb, NET_IP_ALIGN);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3080
	skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3081
	*sk_buff = skb;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3082
	done = true;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3083
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3084
	return done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3085
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3086
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3087
static int rtl8169_rx_interrupt(struct net_device *dev,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3088
				struct rtl8169_private *tp,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3089
				void __iomem *ioaddr, u32 budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3090
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3091
	unsigned int cur_rx, rx_left;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3092
	unsigned int delta, count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3093
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3094
	cur_rx = tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3095
	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3096
	rx_left = min(rx_left, budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3097
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3098
	for (; rx_left > 0; rx_left--, cur_rx++) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3099
		unsigned int entry = cur_rx % NUM_RX_DESC;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3100
		struct RxDesc *desc = tp->RxDescArray + entry;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3101
		u32 status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3102
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3103
		rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3104
		status = le32_to_cpu(desc->opts1);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3105
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3106
		if (status & DescOwn)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3107
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3108
		if (unlikely(status & RxRES)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3109
			if (netif_msg_rx_err(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3110
				printk(KERN_INFO
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3111
				       "%s: Rx ERROR. status = %08x\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3112
				       dev->name, status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3113
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3114
			dev->stats.rx_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3115
			if (status & (RxRWT | RxRUNT))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3116
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3117
			if (status & RxCRC)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3118
				dev->stats.rx_crc_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3119
			if (status & RxFOVF) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3120
				if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3121
					rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3122
				dev->stats.rx_fifo_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3123
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3124
			rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3125
		} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3126
			struct sk_buff *skb = tp->Rx_skbuff[entry];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3127
			dma_addr_t addr = le64_to_cpu(desc->addr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3128
			int pkt_size = (status & 0x00001FFF) - 4;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3129
			struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3130
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3131
			/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3132
			 * The driver does not support incoming fragmented
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3133
			 * frames. They are seen as a symptom of over-mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3134
			 * sized frames.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3135
			 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3136
			if (unlikely(rtl8169_fragmented_frame(status))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3137
				dev->stats.rx_dropped++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3138
				dev->stats.rx_length_errors++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3139
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3140
				continue;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3141
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3142
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3143
			rtl8169_rx_csum(skb, desc);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3144
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3145
			if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3146
				pci_dma_sync_single_for_cpu(pdev, addr, pkt_size,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3147
						PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3148
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3149
				ecdev_receive(tp->ecdev, skb->data, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3150
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3151
				pci_dma_sync_single_for_device(pdev, addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3152
						pkt_size, PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3153
				rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3154
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3155
				// No need to detect link status as
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3156
				// long as frames are received: Reset watchdog.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3157
				tp->ec_watchdog_jiffies = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3158
			} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3159
				if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3160
					pci_dma_sync_single_for_device(pdev, addr,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3161
						pkt_size, PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3162
					rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3163
				} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3164
					pci_unmap_single(pdev, addr, tp->rx_buf_sz,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3165
							 PCI_DMA_FROMDEVICE);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3166
					tp->Rx_skbuff[entry] = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3167
				}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3168
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3169
				skb_put(skb, pkt_size);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3170
				skb->protocol = eth_type_trans(skb, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3171
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3172
				if (rtl8169_rx_vlan_skb(tp, desc, skb) < 0)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3173
					netif_receive_skb(skb);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3174
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3175
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3176
			dev->last_rx = jiffies;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3177
			dev->stats.rx_bytes += pkt_size;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3178
			dev->stats.rx_packets++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3179
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3180
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3181
		/* Work around for AMD plateform. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3182
		if ((desc->opts2 & cpu_to_le32(0xfffe000)) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3183
		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3184
			desc->opts2 = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3185
			cur_rx++;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3186
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3187
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3188
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3189
	count = cur_rx - tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3190
	tp->cur_rx = cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3191
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3192
	if (tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3193
		/* descriptors are cleaned up immediately. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3194
		tp->dirty_rx = tp->cur_rx;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3195
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3196
		delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3197
		if (!delta && count && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3198
			printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3199
		tp->dirty_rx += delta;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3200
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3201
		/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3202
		 * FIXME: until there is periodic timer to try and refill the ring,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3203
		 * a temporary shortage may definitely kill the Rx process.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3204
		 * - disable the asic to try and avoid an overflow and kick it again
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3205
		 *   after refill ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3206
		 * - how do others driver handle this condition (Uh oh...).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3207
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3208
		if ((tp->dirty_rx + NUM_RX_DESC == tp->cur_rx) && netif_msg_intr(tp))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3209
			printk(KERN_EMERG "%s: Rx buffers exhausted\n", dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3210
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3211
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3212
	return count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3213
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3214
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3215
static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3216
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3217
	struct net_device *dev = dev_instance;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3218
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3219
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3220
	int handled = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3221
	int status;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3222
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3223
	/* loop handling interrupts until we have no new ones or
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3224
	 * we hit a invalid/hotplug case.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3225
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3226
	status = RTL_R16(IntrStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3227
	while (status && status != 0xffff) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3228
		handled = 1;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3229
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3230
		/* Handle all of the error cases first. These will reset
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3231
		 * the chip, so just exit the loop.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3232
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3233
		if (unlikely(!tp->ecdev && !netif_running(dev))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3234
			rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3235
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3236
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3237
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3238
		/* Work around for rx fifo overflow */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3239
		if (unlikely(status & RxFIFOOver) &&
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3240
		(tp->mac_version == RTL_GIGA_MAC_VER_11)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3241
			netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3242
			rtl8169_tx_timeout(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3243
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3244
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3245
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3246
		if (unlikely(!tp->ecdev && (status & SYSErr))) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3247
			rtl8169_pcierr_interrupt(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3248
			break;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3249
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3250
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3251
		if (status & LinkChg)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3252
			rtl8169_check_link_status(dev, tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3253
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3254
		/* We need to see the lastest version of tp->intr_mask to
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3255
		 * avoid ignoring an MSI interrupt and having to wait for
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3256
		 * another event which may never come.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3257
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3258
		smp_rmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3259
		if (status & tp->intr_mask & tp->napi_event) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3260
			RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3261
			tp->intr_mask = ~tp->napi_event;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3262
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3263
			if (likely(napi_schedule_prep(&tp->napi)))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3264
				__napi_schedule(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3265
			else if (netif_msg_intr(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3266
				printk(KERN_INFO "%s: interrupt %04x in poll\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3267
				dev->name, status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3268
			}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3269
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3270
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3271
		/* We only get a new MSI interrupt when all active irq
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3272
		 * sources on the chip have been acknowledged. So, ack
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3273
		 * everything we've seen and check if new sources have become
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3274
		 * active to avoid blocking all interrupts from the chip.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3275
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3276
		RTL_W16(IntrStatus,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3277
			(status & RxFIFOOver) ? (status | RxOverflow) : status);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3278
		status = RTL_R16(IntrStatus);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3279
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3280
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3281
	return IRQ_RETVAL(handled);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3282
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3283
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3284
static int rtl8169_poll(struct napi_struct *napi, int budget)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3285
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3286
	struct rtl8169_private *tp = container_of(napi, struct rtl8169_private, napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3287
	struct net_device *dev = tp->dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3288
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3289
	int work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3290
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3291
	work_done = rtl8169_rx_interrupt(dev, tp, ioaddr, (u32) budget);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3292
	rtl8169_tx_interrupt(dev, tp, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3293
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3294
	if (work_done < budget) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3295
		netif_rx_complete(dev, napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3296
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3297
		/* We need for force the visibility of tp->intr_mask
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3298
		 * for other CPUs, as we can loose an MSI interrupt
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3299
		 * and potentially wait for a retransmit timeout if we don't.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3300
		 * The posted write to IntrMask is safe, as it will
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3301
		 * eventually make it to the chip and we won't loose anything
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3302
		 * until it does.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3303
		 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3304
		tp->intr_mask = 0xffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3305
		smp_wmb();
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3306
		RTL_W16(IntrMask, tp->intr_event);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3307
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3308
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3309
	return work_done;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3310
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3311
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3312
static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3313
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3314
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3315
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3316
	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3317
		return;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3318
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3319
	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3320
	RTL_W32(RxMissed, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3321
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3322
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3323
static void rtl8169_down(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3324
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3325
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3326
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3327
	unsigned int intrmask;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3328
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3329
	rtl8169_delete_timer(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3330
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3331
	if (!tp->ecdev) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3332
		netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3333
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3334
		napi_disable(&tp->napi);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3335
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3336
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3337
core_down:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3338
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3339
		spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3340
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3341
	rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3342
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3343
	rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3344
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3345
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3346
		spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3347
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3348
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3349
		synchronize_irq(dev->irq);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3350
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3351
	/* Give a racing hard_start_xmit a few cycles to complete. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3352
	synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3353
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3354
	/*
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3355
	 * And now for the 50k$ question: are IRQ disabled or not ?
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3356
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3357
	 * Two paths lead here:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3358
	 * 1) dev->close
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3359
	 *    -> netif_running() is available to sync the current code and the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3360
	 *       IRQ handler. See rtl8169_interrupt for details.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3361
	 * 2) dev->change_mtu
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3362
	 *    -> rtl8169_poll can not be issued again and re-enable the
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3363
	 *       interruptions. Let's simply issue the IRQ down sequence again.
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3364
	 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3365
	 * No loop if hotpluged or major error (0xffff).
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3366
	 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3367
	intrmask = RTL_R16(IntrMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3368
	if (intrmask && (intrmask != 0xffff))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3369
		goto core_down;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3370
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3371
	rtl8169_tx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3372
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3373
	rtl8169_rx_clear(tp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3374
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3375
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3376
static int rtl8169_close(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3377
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3378
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3379
	struct pci_dev *pdev = tp->pci_dev;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3380
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3381
	/* update counters before going down */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3382
	rtl8169_update_counters(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3383
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3384
	rtl8169_down(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3385
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3386
	if (!tp->ecdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3387
		free_irq(dev->irq, dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3388
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3389
	pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3390
			    tp->RxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3391
	pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3392
			    tp->TxPhyAddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3393
	tp->TxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3394
	tp->RxDescArray = NULL;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3395
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3396
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3397
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3398
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3399
static void rtl_set_rx_mode(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3400
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3401
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3402
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3403
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3404
	u32 mc_filter[2];	/* Multicast hash filter */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3405
	int rx_mode;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3406
	u32 tmp = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3407
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3408
	if (dev->flags & IFF_PROMISC) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3409
		/* Unconditionally log net taps. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3410
		if (netif_msg_link(tp)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3411
			printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n",
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3412
			       dev->name);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3413
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3414
		rx_mode =
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3415
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3416
		    AcceptAllPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3417
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3418
	} else if ((dev->mc_count > multicast_filter_limit)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3419
		   || (dev->flags & IFF_ALLMULTI)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3420
		/* Too many to filter perfectly -- accept all multicasts. */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3421
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3422
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3423
	} else {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3424
		struct dev_mc_list *mclist;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3425
		unsigned int i;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3426
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3427
		rx_mode = AcceptBroadcast | AcceptMyPhys;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3428
		mc_filter[1] = mc_filter[0] = 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3429
		for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3430
		     i++, mclist = mclist->next) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3431
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3432
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3433
			rx_mode |= AcceptMulticast;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3434
		}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3435
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3436
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3437
	spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3438
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3439
	tmp = rtl8169_rx_config | rx_mode |
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3440
	      (RTL_R32(RxConfig) & rtl_chip_info[tp->chipset].RxConfigMask);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3441
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3442
	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3443
		u32 data = mc_filter[0];
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3444
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3445
		mc_filter[0] = swab32(mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3446
		mc_filter[1] = swab32(data);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3447
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3448
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3449
	RTL_W32(MAR0 + 0, mc_filter[0]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3450
	RTL_W32(MAR0 + 4, mc_filter[1]);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3451
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3452
	RTL_W32(RxConfig, tmp);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3453
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3454
	spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3455
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3456
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3457
/**
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3458
 *  rtl8169_get_stats - Get rtl8169 read/write statistics
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3459
 *  @dev: The Ethernet Device to get statistics for
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3460
 *
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3461
 *  Get TX/RX statistics for rtl8169
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3462
 */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3463
static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3464
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3465
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3466
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3467
	unsigned long flags;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3468
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3469
	if (netif_running(dev)) {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3470
		spin_lock_irqsave(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3471
		rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3472
		spin_unlock_irqrestore(&tp->lock, flags);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3473
	}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3474
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3475
	return &dev->stats;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3476
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3477
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3478
#ifdef CONFIG_PM
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3479
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3480
static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3481
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3482
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3483
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3484
	void __iomem *ioaddr = tp->mmio_addr;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3485
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3486
	if (tp->ecdev)
1899
689b41081536 Fixed warning.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3487
		return -EBUSY;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3488
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3489
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3490
		goto out_pci_suspend;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3491
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3492
	netif_device_detach(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3493
	netif_stop_queue(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3494
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3495
	spin_lock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3496
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3497
	rtl8169_asic_down(ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3498
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3499
	rtl8169_rx_missed(dev, ioaddr);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3500
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3501
	spin_unlock_irq(&tp->lock);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3502
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3503
out_pci_suspend:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3504
	pci_save_state(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3505
	pci_enable_wake(pdev, pci_choose_state(pdev, state),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3506
		(tp->features & RTL_FEATURE_WOL) ? 1 : 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3507
	pci_set_power_state(pdev, pci_choose_state(pdev, state));
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3508
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3509
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3510
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3511
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3512
static int rtl8169_resume(struct pci_dev *pdev)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3513
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3514
	struct net_device *dev = pci_get_drvdata(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3515
	struct rtl8169_private *tp = netdev_priv(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3516
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3517
	if (tp->ecdev)
1899
689b41081536 Fixed warning.
Florian Pose <fp@igh-essen.com>
parents: 1898
diff changeset
  3518
		return -EBUSY;
1898
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3519
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3520
	pci_set_power_state(pdev, PCI_D0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3521
	pci_restore_state(pdev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3522
	pci_enable_wake(pdev, PCI_D0, 0);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3523
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3524
	if (!netif_running(dev))
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3525
		goto out;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3526
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3527
	netif_device_attach(dev);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3528
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3529
	rtl8169_schedule_work(dev, rtl8169_reset_task);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3530
out:
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3531
	return 0;
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3532
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3533
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3534
#endif /* CONFIG_PM */
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3535
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3536
static struct pci_driver rtl8169_pci_driver = {
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3537
	.name		= MODULENAME,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3538
	.id_table	= rtl8169_pci_tbl,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3539
	.probe		= rtl8169_init_one,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3540
	.remove		= __devexit_p(rtl8169_remove_one),
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3541
#ifdef CONFIG_PM
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3542
	.suspend	= rtl8169_suspend,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3543
	.resume		= rtl8169_resume,
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3544
#endif
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3545
};
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3546
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3547
static int __init rtl8169_init_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3548
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3549
	return pci_register_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3550
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3551
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3552
static void __exit rtl8169_cleanup_module(void)
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3553
{
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3554
	pci_unregister_driver(&rtl8169_pci_driver);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3555
}
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3556
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3557
module_init(rtl8169_init_module);
ecfc3f747a3b Added r8169 driver for 2.6.27 and 2.6.31.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  3558
module_exit(rtl8169_cleanup_module);