devices/8139too-2.6.34-orig.c
author Gavin Lambert <gavinl@compacsort.com>
Tue, 14 Apr 2015 09:33:24 -0400
changeset 2618 3affe9cd0b66
parent 1976 ffeab8c18590
permissions -rw-r--r--
Ignore NXIO error otherwise this causes spam if network is empty or refclk not
selected yet, and syncing refclk time to master.
1976
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
	8139too.c: A RealTek RTL-8139 Fast Ethernet driver for Linux.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
	Maintained by Jeff Garzik <jgarzik@pobox.com>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
	Copyright 2000-2002 Jeff Garzik
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
	Much code comes from Donald Becker's rtl8139.c driver,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
	versions 1.13 and older.  This driver was originally based
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
	on rtl8139.c version 1.07.  Header of rtl8139.c version 1.13:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
	-----<snip>-----
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
        	Written 1997-2001 by Donald Becker.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
		This software may be used and distributed according to the
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
		terms of the GNU General Public License (GPL), incorporated
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
		herein by reference.  Drivers based on or derived from this
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
		code fall under the GPL and must retain the authorship,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
		copyright and license notice.  This file is not a complete
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
		program and may only be used when the entire operating
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
		system is licensed under the GPL.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
		This driver is for boards based on the RTL8129 and RTL8139
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
		PCI ethernet chips.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
		The author may be reached as becker@scyld.com, or C/O Scyld
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
		Computing Corporation 410 Severn Ave., Suite 210 Annapolis
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
		MD 21403
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
		Support and updates available at
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
		http://www.scyld.com/network/rtl8139.html
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
		Twister-tuning table provided by Kinston
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
		<shangh@realtek.com.tw>.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
	-----<snip>-----
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
	This software may be used and distributed according to the terms
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
	of the GNU General Public License, incorporated herein by reference.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
	Contributors:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
		Donald Becker - he wrote the original driver, kudos to him!
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
		(but please don't e-mail him for support, this isn't his driver)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
		Tigran Aivazian - bug fixes, skbuff free cleanup
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    48
		Martin Mares - suggestions for PCI cleanup
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
		David S. Miller - PCI DMA and softnet updates
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
		Ernst Gill - fixes ported from BSD driver
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
		Daniel Kobras - identified specific locations of
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
			posted MMIO write bugginess
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
		Gerard Sharp - bug fix, testing and feedback
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
		David Ford - Rx ring wrap fix
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
		Dan DeMaggio - swapped RTL8139 cards with me, and allowed me
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
		to find and fix a crucial bug on older chipsets.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
		Donald Becker/Chris Butterworth/Marcus Westergren -
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
		Noticed various Rx packet size-related buglets.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
		Santiago Garcia Mantinan - testing and feedback
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
		Jens David - 2.2.x kernel backports
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
		Martin Dennett - incredibly helpful insight on undocumented
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
		features of the 8139 chips
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
		Jean-Jacques Michel - bug fix
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    76
		Tobias Ringström - Rx interrupt status checking suggestion
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
		Andrew Morton - Clear blocked signals, avoid
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
		buffer overrun setting current->comm.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    81
		Kalle Olavi Niemitalo - Wake-on-LAN ioctls
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    82
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
		Robert Kuebel - Save kernel thread from dying on any signal.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    84
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    85
	Submitting bug reports:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    86
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
		"rtl8139-diag -mmmaaavvveefN" output
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
		enable RTL8139_DEBUG below, and look at 'dmesg' or kernel log
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    90
*/
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
#define DRV_NAME	"8139too"
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
#define DRV_VERSION	"0.9.28"
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
#include <linux/module.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
#include <linux/kernel.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
#include <linux/compiler.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
#include <linux/pci.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
#include <linux/init.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
#include <linux/netdevice.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
#include <linux/etherdevice.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
#include <linux/rtnetlink.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
#include <linux/delay.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
#include <linux/ethtool.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
#include <linux/mii.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
#include <linux/completion.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
#include <linux/crc32.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
#include <linux/io.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
#include <linux/uaccess.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
#include <linux/gfp.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
#include <asm/irq.h>
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
#define RTL8139_DRIVER_NAME   DRV_NAME " Fast Ethernet driver " DRV_VERSION
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
/* Default Message level */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
#define RTL8139_DEF_MSG_ENABLE   (NETIF_MSG_DRV   | \
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
                                 NETIF_MSG_PROBE  | \
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
                                 NETIF_MSG_LINK)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   123
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   124
/* define to 1, 2 or 3 to enable copious debugging info */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
#define RTL8139_DEBUG 0
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
/* define to 1 to disable lightweight runtime debugging checks */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
#undef RTL8139_NDEBUG
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   131
#ifdef RTL8139_NDEBUG
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
#  define assert(expr) do {} while (0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
#  define assert(expr) \
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
        if (unlikely(!(expr))) {				\
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
		pr_err("Assertion failed! %s,%s,%s,line=%d\n",	\
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
		       #expr, __FILE__, __func__, __LINE__);	\
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
        }
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
/* A few user-configurable values. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
/* media options */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
#define MAX_UNITS 8
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
/* Whether to use MMIO or PIO. Default to MMIO. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
#ifdef CONFIG_8139TOO_PIO
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
static int use_io = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
static int use_io = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
   The RTL chips use a 64 element hash table based on the Ethernet CRC.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
static int multicast_filter_limit = 32;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
/* bitmapped message enable number */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
static int debug = -1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   162
/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   163
 * Receive ring size
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
 * Warning: 64K ring has hardware issues and may lock up.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
#if defined(CONFIG_SH_DREAMCAST)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
#define RX_BUF_IDX 0	/* 8K ring */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
#define RX_BUF_IDX	2	/* 32K ring */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
#define RX_BUF_LEN	(8192 << RX_BUF_IDX)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
#define RX_BUF_PAD	16
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
#define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
#if RX_BUF_LEN == 65536
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
#define RX_BUF_TOT_LEN	RX_BUF_LEN
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
#define RX_BUF_TOT_LEN	(RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
/* Number of Tx descriptor registers. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
#define NUM_TX_DESC	4
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
/* max supported ethernet frame size -- must be at least (dev->mtu+14+4).*/
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
#define MAX_ETH_FRAME_SIZE	1536
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
/* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
#define TX_BUF_SIZE	MAX_ETH_FRAME_SIZE
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
#define TX_BUF_TOT_LEN	(TX_BUF_SIZE * NUM_TX_DESC)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
/* PCI Tuning Parameters
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
   Threshold is bytes transferred to chip before transmission starts. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
#define TX_FIFO_THRESH 256	/* In bytes, rounded down to 32 byte units. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
/* The following settings are log_2(bytes)-4:  0 == 16 bytes .. 6==1024, 7==end of packet. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#define RX_FIFO_THRESH	7	/* Rx buffer level before first PCI xfer.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
#define RX_DMA_BURST	7	/* Maximum PCI burst, '6' is 1024 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
#define TX_DMA_BURST	6	/* Maximum PCI burst, '6' is 1024 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
#define TX_RETRY	8	/* 0-15.  retries = 16 + (TX_RETRY * 16) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   201
/* Operational parameters that usually are not changed. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   202
/* Time in jiffies before concluding the transmitter is hung. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
#define TX_TIMEOUT  (6*HZ)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   206
enum {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   207
	HAS_MII_XCVR = 0x010000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
	HAS_CHIP_XCVR = 0x020000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
	HAS_LNK_CHNG = 0x040000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   210
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
#define RTL_NUM_STATS 4		/* number of ETHTOOL_GSTATS u64's */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
#define RTL_REGS_VER 1		/* version of reg. data in ETHTOOL_GREGS */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
#define RTL_MIN_IO_SIZE 0x80
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
#define RTL8139B_IO_SIZE 256
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   217
#define RTL8129_CAPS	HAS_MII_XCVR
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
#define RTL8139_CAPS	(HAS_CHIP_XCVR|HAS_LNK_CHNG)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   219
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
typedef enum {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
	RTL8139 = 0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   222
	RTL8129,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
} board_t;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   224
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   225
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   226
/* indexed by board_t, above */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
static const struct {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
	const char *name;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
	u32 hw_flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   230
} board_info[] __devinitdata = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
	{ "RealTek RTL8139", RTL8139_CAPS },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
	{ "RealTek RTL8129", RTL8129_CAPS },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   233
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   234
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   235
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
static DEFINE_PCI_DEVICE_TABLE(rtl8139_pci_tbl) = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
	{0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
	{0x10ec, 0x8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   239
	{0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
	{0x1500, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
	{0x4033, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
	{0x1186, 0x1300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
	{0x1186, 0x1340, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
	{0x13d1, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
	{0x1259, 0xa117, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
	{0x1259, 0xa11e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
	{0x14ea, 0xab06, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
	{0x14ea, 0xab07, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
	{0x11db, 0x1234, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
	{0x1432, 0x9130, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
	{0x02ac, 0x1012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	{0x018a, 0x0106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	{0x126c, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	{0x1743, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
	{0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#ifdef CONFIG_SH_SECUREEDGE5410
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
	/* Bogus 8139 silicon reports 8129 without external PROM :-( */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
	{0x10ec, 0x8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
	{0x10ec, 0x8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8129 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
	/* some crazy cards report invalid vendor ids like
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	 * 0x0001 here.  The other ids are valid and constant,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	 * so we simply don't match on the main vendor id.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
	{PCI_ANY_ID, 0x8139, 0x10ec, 0x8139, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
	{PCI_ANY_ID, 0x8139, 0x1186, 0x1300, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
	{PCI_ANY_ID, 0x8139, 0x13d1, 0xab06, 0, 0, RTL8139 },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	{0,}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
MODULE_DEVICE_TABLE (pci, rtl8139_pci_tbl);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
static struct {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
	const char str[ETH_GSTRING_LEN];
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
} ethtool_stats_keys[] = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
	{ "early_rx" },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
	{ "tx_buf_mapped" },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
	{ "tx_timeouts" },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
	{ "rx_lost_in_ring" },
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
/* The rest of these values should never change. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
/* Symbolic offsets to registers. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
enum RTL8139_registers {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
	MAC0		= 0,	 /* Ethernet hardware address. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
	MAR0		= 8,	 /* Multicast filter. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
	TxStatus0	= 0x10,	 /* Transmit status (Four 32bit registers). */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
	TxAddr0		= 0x20,	 /* Tx descriptors (also four 32bit). */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
	RxBuf		= 0x30,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
	ChipCmd		= 0x37,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
	RxBufPtr	= 0x38,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
	RxBufAddr	= 0x3A,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
	IntrMask	= 0x3C,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
	IntrStatus	= 0x3E,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
	TxConfig	= 0x40,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   301
	RxConfig	= 0x44,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
	Timer		= 0x48,	 /* A general-purpose counter. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	RxMissed	= 0x4C,  /* 24 bits valid, write clears. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   304
	Cfg9346		= 0x50,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   305
	Config0		= 0x51,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
	Config1		= 0x52,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	TimerInt	= 0x54,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
	MediaStatus	= 0x58,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
	Config3		= 0x59,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	Config4		= 0x5A,	 /* absent on RTL-8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
	HltClk		= 0x5B,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   312
	MultiIntr	= 0x5C,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   313
	TxSummary	= 0x60,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	BasicModeCtrl	= 0x62,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   315
	BasicModeStatus	= 0x64,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
	NWayAdvert	= 0x66,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
	NWayLPAR	= 0x68,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	NWayExpansion	= 0x6A,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
	/* Undocumented registers, but required for proper operation. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
	FIFOTMS		= 0x70,	 /* FIFO Control and test. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
	CSCR		= 0x74,	 /* Chip Status and Configuration Register. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
	PARA78		= 0x78,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
	FlashReg	= 0xD4,	/* Communication with Flash ROM, four bytes. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
	PARA7c		= 0x7c,	 /* Magic transceiver parameter register. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	Config5		= 0xD8,	 /* absent on RTL-8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
enum ClearBitMasks {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	MultiIntrClear	= 0xF000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	ChipCmdClear	= 0xE2,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
	Config1Clear	= (1<<7)|(1<<6)|(1<<3)|(1<<2)|(1<<1),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   334
enum ChipCmdBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
	CmdReset	= 0x10,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
	CmdRxEnb	= 0x08,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	CmdTxEnb	= 0x04,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	RxBufEmpty	= 0x01,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
/* Interrupt register bits, using my own meaningful names. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
enum IntrStatusBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	PCIErr		= 0x8000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	PCSTimeout	= 0x4000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	RxFIFOOver	= 0x40,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	RxUnderrun	= 0x20,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	RxOverflow	= 0x10,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	TxErr		= 0x08,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	TxOK		= 0x04,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	RxErr		= 0x02,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	RxOK		= 0x01,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	RxAckBits	= RxFIFOOver | RxOverflow | RxOK,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
enum TxStatusBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	TxHostOwns	= 0x2000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	TxUnderrun	= 0x4000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	TxStatOK	= 0x8000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	TxOutOfWindow	= 0x20000000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	TxAborted	= 0x40000000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	TxCarrierLost	= 0x80000000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
enum RxStatusBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	RxMulticast	= 0x8000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	RxPhysical	= 0x4000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	RxBroadcast	= 0x2000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	RxBadSymbol	= 0x0020,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	RxRunt		= 0x0010,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	RxTooLong	= 0x0008,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
	RxCRCErr	= 0x0004,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	RxBadAlign	= 0x0002,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
	RxStatusOK	= 0x0001,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
/* Bits in RxConfig. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
enum rx_mode_bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	AcceptErr	= 0x20,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
	AcceptRunt	= 0x10,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
	AcceptBroadcast	= 0x08,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
	AcceptMulticast	= 0x04,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	AcceptMyPhys	= 0x02,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	AcceptAllPhys	= 0x01,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
/* Bits in TxConfig. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
enum tx_config_bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
        /* Interframe Gap Time. Only TxIFG96 doesn't violate IEEE 802.3 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
        TxIFGShift	= 24,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
        TxIFG84		= (0 << TxIFGShift), /* 8.4us / 840ns (10 / 100Mbps) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
        TxIFG88		= (1 << TxIFGShift), /* 8.8us / 880ns (10 / 100Mbps) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
        TxIFG92		= (2 << TxIFGShift), /* 9.2us / 920ns (10 / 100Mbps) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
        TxIFG96		= (3 << TxIFGShift), /* 9.6us / 960ns (10 / 100Mbps) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	TxLoopBack	= (1 << 18) | (1 << 17), /* enable loopback test mode */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	TxCRC		= (1 << 16),	/* DISABLE Tx pkt CRC append */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	TxClearAbt	= (1 << 0),	/* Clear abort (WO) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	TxDMAShift	= 8, /* DMA burst value (0-7) is shifted X many bits */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
	TxRetryShift	= 4, /* TXRR value (0-15) is shifted X many bits */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
	TxVersionMask	= 0x7C800000, /* mask out version bits 30-26, 23 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
/* Bits in Config1 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
enum Config1Bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	Cfg1_PM_Enable	= 0x01,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	Cfg1_VPD_Enable	= 0x02,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	Cfg1_PIO	= 0x04,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	Cfg1_MMIO	= 0x08,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
	LWAKE		= 0x10,		/* not on 8139, 8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
	Cfg1_Driver_Load = 0x20,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	Cfg1_LED0	= 0x40,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	Cfg1_LED1	= 0x80,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	SLEEP		= (1 << 1),	/* only on 8139, 8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	PWRDN		= (1 << 0),	/* only on 8139, 8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
/* Bits in Config3 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
enum Config3Bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	Cfg3_FBtBEn   	= (1 << 0), /* 1	= Fast Back to Back */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
	Cfg3_FuncRegEn	= (1 << 1), /* 1	= enable CardBus Function registers */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
	Cfg3_CLKRUN_En	= (1 << 2), /* 1	= enable CLKRUN */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
	Cfg3_CardB_En 	= (1 << 3), /* 1	= enable CardBus registers */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
	Cfg3_LinkUp   	= (1 << 4), /* 1	= wake up on link up */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	Cfg3_Magic    	= (1 << 5), /* 1	= wake up on Magic Packet (tm) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	Cfg3_PARM_En  	= (1 << 6), /* 0	= software can set twister parameters */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	Cfg3_GNTSel   	= (1 << 7), /* 1	= delay 1 clock from PCI GNT signal */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
/* Bits in Config4 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
enum Config4Bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
	LWPTN	= (1 << 2),	/* not on 8139, 8139A */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
/* Bits in Config5 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   436
enum Config5Bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
	Cfg5_PME_STS   	= (1 << 0), /* 1	= PCI reset resets PME_Status */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
	Cfg5_LANWake   	= (1 << 1), /* 1	= enable LANWake signal */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
	Cfg5_LDPS      	= (1 << 2), /* 0	= save power when link is down */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
	Cfg5_FIFOAddrPtr= (1 << 3), /* Realtek internal SRAM testing */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
	Cfg5_UWF        = (1 << 4), /* 1 = accept unicast wakeup frame */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	Cfg5_MWF        = (1 << 5), /* 1 = accept multicast wakeup frame */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
	Cfg5_BWF        = (1 << 6), /* 1 = accept broadcast wakeup frame */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
enum RxConfigBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
	/* rx fifo threshold */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	RxCfgFIFOShift	= 13,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
	RxCfgFIFONone	= (7 << RxCfgFIFOShift),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
	/* Max DMA burst */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
	RxCfgDMAShift	= 8,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	RxCfgDMAUnlimited = (7 << RxCfgDMAShift),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	/* rx ring buffer length */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	RxCfgRcv8K	= 0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	RxCfgRcv16K	= (1 << 11),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	RxCfgRcv32K	= (1 << 12),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	RxCfgRcv64K	= (1 << 11) | (1 << 12),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	/* Disable packet wrap at end of Rx buffer. (not possible with 64k) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	RxNoWrap	= (1 << 7),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
/* Twister tuning parameters from RealTek.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
   Completely undocumented, but required to tune bad links on some boards. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
enum CSCRBits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
	CSCR_LinkOKBit		= 0x0400,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
	CSCR_LinkChangeBit	= 0x0800,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
	CSCR_LinkStatusBits	= 0x0f000,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
	CSCR_LinkDownOffCmd	= 0x003c0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   472
	CSCR_LinkDownCmd	= 0x0f3c0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   473
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   474
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   475
enum Cfg9346Bits {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
	Cfg9346_Lock	= 0x00,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
	Cfg9346_Unlock	= 0xC0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   480
typedef enum {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   481
	CH_8139	= 0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
	CH_8139_K,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
	CH_8139A,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	CH_8139A_G,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   485
	CH_8139B,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   486
	CH_8130,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   487
	CH_8139C,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   488
	CH_8100,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   489
	CH_8100B_8139D,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   490
	CH_8101,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   491
} chip_t;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
enum chip_flags {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	HasHltClk	= (1 << 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	HasLWake	= (1 << 1),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   497
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   498
#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	(b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
#define HW_REVID_MASK	HW_REVID(1, 1, 1, 1, 1, 1, 1)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
/* directly indexed by chip_t, above */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
static const struct {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	const char *name;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	u32 version; /* from RTL8139C/RTL8139D docs */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	u32 flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
} rtl_chip_info[] = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	{ "RTL-8139",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   509
	  HW_REVID(1, 0, 0, 0, 0, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
	  HasHltClk,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
	{ "RTL-8139 rev K",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   514
	  HW_REVID(1, 1, 0, 0, 0, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	  HasHltClk,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	{ "RTL-8139A",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	  HW_REVID(1, 1, 1, 0, 0, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
	  HasHltClk, /* XXX undocumented? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	{ "RTL-8139A rev G",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	  HW_REVID(1, 1, 1, 0, 0, 1, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
	  HasHltClk, /* XXX undocumented? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	{ "RTL-8139B",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
	  HW_REVID(1, 1, 1, 1, 0, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	  HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	{ "RTL-8130",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	  HW_REVID(1, 1, 1, 1, 1, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	  HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
	{ "RTL-8139C",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
	  HW_REVID(1, 1, 1, 0, 1, 0, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
	  HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   543
	{ "RTL-8100",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   544
	  HW_REVID(1, 1, 1, 1, 0, 1, 0),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
 	  HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   546
 	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   547
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   548
	{ "RTL-8100B/8139D",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
	  HW_REVID(1, 1, 1, 0, 1, 0, 1),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
	  HasHltClk /* XXX undocumented? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	| HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
	{ "RTL-8101",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	  HW_REVID(1, 1, 1, 0, 1, 1, 1),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	  HasLWake,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   557
	},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   558
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   559
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   560
struct rtl_extra_stats {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	unsigned long early_rx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   562
	unsigned long tx_buf_mapped;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	unsigned long tx_timeouts;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
	unsigned long rx_lost_in_ring;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   567
struct rtl8139_private {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	void __iomem		*mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
	int			drv_flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	struct pci_dev		*pci_dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	u32			msg_enable;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   572
	struct napi_struct	napi;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   573
	struct net_device	*dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   574
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	unsigned char		*rx_ring;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	unsigned int		cur_rx;	/* RX buf index of next pkt */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   577
	dma_addr_t		rx_ring_dma;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
	unsigned int		tx_flag;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	unsigned long		cur_tx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	unsigned long		dirty_tx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   582
	unsigned char		*tx_buf[NUM_TX_DESC];	/* Tx bounce buffers */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	unsigned char		*tx_bufs;	/* Tx bounce buffer region. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
	dma_addr_t		tx_bufs_dma;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	signed char		phys[4];	/* MII device addresses. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   587
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
				/* Twister tune state. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
	char			twistie, twist_row, twist_col;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	unsigned int		watchdog_fired : 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   592
	unsigned int		default_port : 4; /* Last dev->if_port value. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
	unsigned int		have_thread : 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   594
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   595
	spinlock_t		lock;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	spinlock_t		rx_lock;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   597
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	chip_t			chipset;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   599
	u32			rx_config;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   600
	struct rtl_extra_stats	xstats;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	struct delayed_work	thread;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   603
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	struct mii_if_info	mii;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
	unsigned int		regs_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   606
	unsigned long		fifo_copy_timeout;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   607
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
MODULE_AUTHOR ("Jeff Garzik <jgarzik@pobox.com>");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
MODULE_DESCRIPTION ("RealTek RTL-8139 Fast Ethernet driver");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
MODULE_LICENSE("GPL");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   612
MODULE_VERSION(DRV_VERSION);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   613
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
module_param(use_io, int, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
MODULE_PARM_DESC(use_io, "Force use of I/O access mode. 0=MMIO 1=PIO");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
module_param(multicast_filter_limit, int, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
module_param_array(media, int, NULL, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
module_param_array(full_duplex, int, NULL, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
module_param(debug, int, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
MODULE_PARM_DESC (debug, "8139too bitmapped message enable number");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
MODULE_PARM_DESC (multicast_filter_limit, "8139too maximum number of filtered multicast addresses");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
MODULE_PARM_DESC (media, "8139too: Bits 4+9: force full duplex, bit 5: 100Mbps");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
MODULE_PARM_DESC (full_duplex, "8139too: Force full duplex for board(s) (1)");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
static int read_eeprom (void __iomem *ioaddr, int location, int addr_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
static int rtl8139_open (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
static int mdio_read (struct net_device *dev, int phy_id, int location);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
static void mdio_write (struct net_device *dev, int phy_id, int location,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
			int val);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   630
static void rtl8139_start_thread(struct rtl8139_private *tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
static void rtl8139_tx_timeout (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
static void rtl8139_init_ring (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
				       struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
#ifdef CONFIG_NET_POLL_CONTROLLER
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
static void rtl8139_poll_controller(struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   638
static int rtl8139_set_mac_address(struct net_device *dev, void *p);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   639
static int rtl8139_poll(struct napi_struct *napi, int budget);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
static int rtl8139_close (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
static struct net_device_stats *rtl8139_get_stats (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
static void rtl8139_set_rx_mode (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
static void __set_rx_mode (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
static void rtl8139_hw_start (struct net_device *dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
static void rtl8139_thread (struct work_struct *work);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   648
static void rtl8139_tx_timeout_task(struct work_struct *work);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
static const struct ethtool_ops rtl8139_ethtool_ops;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
/* write MMIO register, with flush */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
/* Flush avoids rtl8139 bug w/ posted MMIO writes */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
#define RTL_W8_F(reg, val8)	do { iowrite8 ((val8), ioaddr + (reg)); ioread8 (ioaddr + (reg)); } while (0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
#define RTL_W16_F(reg, val16)	do { iowrite16 ((val16), ioaddr + (reg)); ioread16 (ioaddr + (reg)); } while (0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
#define RTL_W32_F(reg, val32)	do { iowrite32 ((val32), ioaddr + (reg)); ioread32 (ioaddr + (reg)); } while (0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
/* write MMIO register */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
#define RTL_W8(reg, val8)	iowrite8 ((val8), ioaddr + (reg))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
#define RTL_W16(reg, val16)	iowrite16 ((val16), ioaddr + (reg))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
#define RTL_W32(reg, val32)	iowrite32 ((val32), ioaddr + (reg))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
/* read MMIO register */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
#define RTL_R8(reg)		ioread8 (ioaddr + (reg))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
#define RTL_R16(reg)		ioread16 (ioaddr + (reg))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
#define RTL_R32(reg)		((unsigned long) ioread32 (ioaddr + (reg)))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
static const u16 rtl8139_intr_mask =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
	PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
	TxErr | TxOK | RxErr | RxOK;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
static const u16 rtl8139_norx_intr_mask =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   673
	PCIErr | PCSTimeout | RxUnderrun |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
	TxErr | TxOK | RxErr ;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   676
#if RX_BUF_IDX == 0
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
static const unsigned int rtl8139_rx_config =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   678
	RxCfgRcv8K | RxNoWrap |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   679
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   680
	(RX_DMA_BURST << RxCfgDMAShift);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   681
#elif RX_BUF_IDX == 1
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
static const unsigned int rtl8139_rx_config =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
	RxCfgRcv16K | RxNoWrap |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   685
	(RX_DMA_BURST << RxCfgDMAShift);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   686
#elif RX_BUF_IDX == 2
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   687
static const unsigned int rtl8139_rx_config =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   688
	RxCfgRcv32K | RxNoWrap |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   690
	(RX_DMA_BURST << RxCfgDMAShift);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   691
#elif RX_BUF_IDX == 3
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   692
static const unsigned int rtl8139_rx_config =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   693
	RxCfgRcv64K |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
	(RX_DMA_BURST << RxCfgDMAShift);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   696
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
#error "Invalid configuration for 8139_RXBUF_IDX"
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   698
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   699
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   700
static const unsigned int rtl8139_tx_config =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   701
	TxIFG96 | (TX_DMA_BURST << TxDMAShift) | (TX_RETRY << TxRetryShift);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   702
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   703
static void __rtl8139_cleanup_dev (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   706
	struct pci_dev *pdev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   707
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   708
	assert (dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   709
	assert (tp->pci_dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   710
	pdev = tp->pci_dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   711
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
	if (tp->mmio_addr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
		pci_iounmap (pdev, tp->mmio_addr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   714
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   715
	/* it's ok to call this even if we have no regions to free */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   716
	pci_release_regions (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   717
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
	free_netdev(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
	pci_set_drvdata (pdev, NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   720
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   721
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   722
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
static void rtl8139_chip_reset (void __iomem *ioaddr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
	/* Soft reset the chip. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   728
	RTL_W8 (ChipCmd, CmdReset);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   729
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	/* Check that the chip has finished the reset. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	for (i = 1000; i > 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   732
		barrier();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   733
		if ((RTL_R8 (ChipCmd) & CmdReset) == 0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
			break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
		udelay (10);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
static __devinit struct net_device * rtl8139_init_board (struct pci_dev *pdev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
	void __iomem *ioaddr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
	struct net_device *dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	struct rtl8139_private *tp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	u8 tmp8;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	int rc, disable_dev_on_err = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
	unsigned int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
	unsigned long pio_start, pio_end, pio_flags, pio_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
	u32 version;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
	assert (pdev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
	/* dev and priv zeroed in alloc_etherdev */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	dev = alloc_etherdev (sizeof (*tp));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	if (dev == NULL) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
		dev_err(&pdev->dev, "Unable to alloc new net device\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
		return ERR_PTR(-ENOMEM);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
	SET_NETDEV_DEV(dev, &pdev->dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   763
	tp->pci_dev = pdev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   765
	/* enable device (incl. PCI PM wakeup and hotplug setup) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	rc = pci_enable_device (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	if (rc)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
		goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	pio_start = pci_resource_start (pdev, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	pio_end = pci_resource_end (pdev, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
	pio_flags = pci_resource_flags (pdev, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	pio_len = pci_resource_len (pdev, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
	mmio_start = pci_resource_start (pdev, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	mmio_end = pci_resource_end (pdev, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   777
	mmio_flags = pci_resource_flags (pdev, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
	mmio_len = pci_resource_len (pdev, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	/* set this immediately, we need to know before
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
	 * we talk to the chip directly */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
	pr_debug("PIO region size == 0x%02lX\n", pio_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
	pr_debug("MMIO region size == 0x%02lX\n", mmio_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   785
retry:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	if (use_io) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
		/* make sure PCI base addr 0 is PIO */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
		if (!(pio_flags & IORESOURCE_IO)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
			dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
			rc = -ENODEV;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
			goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   792
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		/* check for weird/broken PCI region reporting */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		if (pio_len < RTL_MIN_IO_SIZE) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
			dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
			rc = -ENODEV;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
			goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
		/* make sure PCI base addr 1 is MMIO */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
		if (!(mmio_flags & IORESOURCE_MEM)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   802
			dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
			rc = -ENODEV;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
			goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
		if (mmio_len < RTL_MIN_IO_SIZE) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
			dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
			rc = -ENODEV;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
			goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	rc = pci_request_regions (pdev, DRV_NAME);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
	if (rc)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
		goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
	disable_dev_on_err = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	/* enable PCI bus-mastering */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	pci_set_master (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   821
	if (use_io) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   822
		ioaddr = pci_iomap(pdev, 0, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
		if (!ioaddr) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
			dev_err(&pdev->dev, "cannot map PIO, aborting\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
			rc = -EIO;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
			goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   828
		dev->base_addr = pio_start;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
		tp->regs_len = pio_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
		/* ioremap MMIO region */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
		ioaddr = pci_iomap(pdev, 1, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
		if (ioaddr == NULL) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
			dev_err(&pdev->dev, "cannot remap MMIO, trying PIO\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
			pci_release_regions(pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
			use_io = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
			goto retry;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
		dev->base_addr = (long) ioaddr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
		tp->regs_len = mmio_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	tp->mmio_addr = ioaddr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   843
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	/* Bring old chips out of low-power mode. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   845
	RTL_W8 (HltClk, 'R');
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   846
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
	/* check for missing/broken hardware */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	if (RTL_R32 (TxConfig) == 0xFFFFFFFF) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		dev_err(&pdev->dev, "Chip not responding, ignoring board\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   850
		rc = -EIO;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
		goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   852
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
	/* identify chip attached to board */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
	version = RTL_R32 (TxConfig) & HW_REVID_MASK;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
	for (i = 0; i < ARRAY_SIZE (rtl_chip_info); i++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
		if (version == rtl_chip_info[i].version) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   858
			tp->chipset = i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
			goto match;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
	/* if unknown chip, assume array element #0, original RTL-8139 in this case */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   863
	dev_dbg(&pdev->dev, "unknown chip version, assuming RTL-8139\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
	dev_dbg(&pdev->dev, "TxConfig = 0x%lx\n", RTL_R32 (TxConfig));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   865
	tp->chipset = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
match:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
	pr_debug("chipset id (%d) == index %d, '%s'\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
		 version, i, rtl_chip_info[i].name);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   870
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
	if (tp->chipset >= CH_8139B) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		u8 new_tmp8 = tmp8 = RTL_R8 (Config1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
		pr_debug("PCI PM wakeup\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
		if ((rtl_chip_info[tp->chipset].flags & HasLWake) &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
		    (tmp8 & LWAKE))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
			new_tmp8 &= ~LWAKE;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		new_tmp8 |= Cfg1_PM_Enable;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
		if (new_tmp8 != tmp8) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
			RTL_W8 (Config1, tmp8);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
			RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
		if (rtl_chip_info[tp->chipset].flags & HasLWake) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
			tmp8 = RTL_R8 (Config4);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
			if (tmp8 & LWPTN) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
				RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   887
				RTL_W8 (Config4, tmp8 & ~LWPTN);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
				RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
		pr_debug("Old chip wakeup\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
		tmp8 = RTL_R8 (Config1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		tmp8 &= ~(SLEEP | PWRDN);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		RTL_W8 (Config1, tmp8);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   897
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
	rtl8139_chip_reset (ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   900
	return dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   901
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
err_out:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	__rtl8139_cleanup_dev (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	if (disable_dev_on_err)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
		pci_disable_device (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	return ERR_PTR(rc);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   907
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   908
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   909
static const struct net_device_ops rtl8139_netdev_ops = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	.ndo_open		= rtl8139_open,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
	.ndo_stop		= rtl8139_close,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   912
	.ndo_get_stats		= rtl8139_get_stats,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
	.ndo_change_mtu		= eth_change_mtu,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	.ndo_validate_addr	= eth_validate_addr,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
	.ndo_set_mac_address 	= rtl8139_set_mac_address,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	.ndo_start_xmit		= rtl8139_start_xmit,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	.ndo_set_multicast_list	= rtl8139_set_rx_mode,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	.ndo_do_ioctl		= netdev_ioctl,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   919
	.ndo_tx_timeout		= rtl8139_tx_timeout,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
#ifdef CONFIG_NET_POLL_CONTROLLER
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
	.ndo_poll_controller	= rtl8139_poll_controller,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   925
static int __devinit rtl8139_init_one (struct pci_dev *pdev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
				       const struct pci_device_id *ent)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   927
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   928
	struct net_device *dev = NULL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   929
	struct rtl8139_private *tp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   930
	int i, addr_len, option;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	void __iomem *ioaddr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   932
	static int board_idx = -1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	assert (pdev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
	assert (ent != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
	board_idx++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   938
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
	/* when we're built into the kernel, the driver version message
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
	 * is only printed if at least one 8139 board has been found
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
#ifndef MODULE
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
	{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
		static int printed_version;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   945
		if (!printed_version++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   946
			pr_info(RTL8139_DRIVER_NAME "\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   947
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
	if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
	    pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pdev->revision >= 0x20) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
		dev_info(&pdev->dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
			   "This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip, use 8139cp\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
		       	   pdev->vendor, pdev->device, pdev->revision);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		return -ENODEV;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
	if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	    pdev->device == PCI_DEVICE_ID_REALTEK_8139 &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
	    pdev->subsystem_vendor == PCI_VENDOR_ID_ATHEROS &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	    pdev->subsystem_device == PCI_DEVICE_ID_REALTEK_8139) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   962
		pr_info("OQO Model 2 detected. Forcing PIO\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   963
		use_io = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	dev = rtl8139_init_board (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	if (IS_ERR(dev))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		return PTR_ERR(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
	assert (dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
	tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
	tp->dev = dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   973
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	assert (ioaddr != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
	for (i = 0; i < 3; i++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
		((__le16 *) (dev->dev_addr))[i] =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		    cpu_to_le16(read_eeprom (ioaddr, i + 7, addr_len));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
	/* The Rtl8139-specific entries in the device structure. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	dev->netdev_ops = &rtl8139_netdev_ops;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
	dev->ethtool_ops = &rtl8139_ethtool_ops;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
	dev->watchdog_timeo = TX_TIMEOUT;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
	netif_napi_add(dev, &tp->napi, rtl8139_poll, 64);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
	/* note: the hardware is not capable of sg/csum/highdma, however
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
	 * through the use of skb_copy_and_csum_dev we enable these
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   991
	 * features
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
	dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_HIGHDMA;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   995
	dev->irq = pdev->irq;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   996
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
	/* tp zeroed and aligned in alloc_etherdev */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
	tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1000
	/* note: tp->chipset set in rtl8139_init_board */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	tp->drv_flags = board_info[ent->driver_data].hw_flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	tp->mmio_addr = ioaddr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	tp->msg_enable =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
		(debug < 0 ? RTL8139_DEF_MSG_ENABLE : ((1 << debug) - 1));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	spin_lock_init (&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1006
	spin_lock_init (&tp->rx_lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	INIT_DELAYED_WORK(&tp->thread, rtl8139_thread);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1008
	tp->mii.dev = dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	tp->mii.mdio_read = mdio_read;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
	tp->mii.mdio_write = mdio_write;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	tp->mii.phy_id_mask = 0x3f;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
	tp->mii.reg_num_mask = 0x1f;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
	/* dev is fully set up and ready to use now */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1015
	pr_debug("about to register device named %s (%p)...\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1016
		 dev->name, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1017
	i = register_netdev (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
	if (i) goto err_out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	pci_set_drvdata (pdev, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	netdev_info(dev, "%s at 0x%lx, %pM, IRQ %d\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
		    board_info[ent->driver_data].name,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
		    dev->base_addr, dev->dev_addr, dev->irq);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	netdev_dbg(dev, "Identified 8139 chip type '%s'\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1027
		   rtl_chip_info[tp->chipset].name);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1028
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
	/* Find the connected MII xcvrs.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	   Doing this in open() would allow detecting external xcvrs later, but
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1031
	   takes too much time. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1032
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
	if (tp->drv_flags & HAS_MII_XCVR) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1034
		int phy, phy_idx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1035
		for (phy = 0; phy < 32 && phy_idx < sizeof(tp->phys); phy++) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
			int mii_status = mdio_read(dev, phy, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
			if (mii_status != 0xffff  &&  mii_status != 0x0000) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
				u16 advertising = mdio_read(dev, phy, 4);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
				tp->phys[phy_idx++] = phy;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
				netdev_info(dev, "MII transceiver %d status 0x%04x advertising %04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
					    phy, mii_status, advertising);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1043
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
		if (phy_idx == 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1045
			netdev_info(dev, "No MII transceivers found! Assuming SYM transceiver\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
			tp->phys[0] = 32;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
	} else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
		tp->phys[0] = 32;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	tp->mii.phy_id = tp->phys[0];
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1053
	/* The lower four bits are the media type. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1054
	option = (board_idx >= MAX_UNITS) ? 0 : media[board_idx];
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	if (option > 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1056
		tp->mii.full_duplex = (option & 0x210) ? 1 : 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1057
		tp->default_port = option & 0xFF;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
		if (tp->default_port)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
			tp->mii.force_media = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	if (board_idx < MAX_UNITS  &&  full_duplex[board_idx] > 0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
		tp->mii.full_duplex = full_duplex[board_idx];
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	if (tp->mii.full_duplex) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1064
		netdev_info(dev, "Media type forced to Full Duplex\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1065
		/* Changing the MII-advertised media because might prevent
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
		   re-connection. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
		tp->mii.force_media = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1069
	if (tp->default_port) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
		netdev_info(dev, "  Forcing %dMbps %s-duplex operation\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
			    (option & 0x20 ? 100 : 10),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1072
			    (option & 0x10 ? "full" : "half"));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1073
		mdio_write(dev, tp->phys[0], 0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
				   ((option & 0x20) ? 0x2000 : 0) | 	/* 100Mbps? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1075
				   ((option & 0x10) ? 0x0100 : 0)); /* Full duplex? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	/* Put the chip into low-power mode. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1079
	if (rtl_chip_info[tp->chipset].flags & HasHltClk)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
		RTL_W8 (HltClk, 'H');	/* 'R' would leave the clock running. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1081
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1082
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
err_out:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1085
	__rtl8139_cleanup_dev (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1086
	pci_disable_device (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1087
	return i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
static void __devexit rtl8139_remove_one (struct pci_dev *pdev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	struct net_device *dev = pci_get_drvdata (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	assert (dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1096
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1097
	flush_scheduled_work();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
	unregister_netdev (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1100
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	__rtl8139_cleanup_dev (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
	pci_disable_device (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
/* Serial EEPROM section. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
/*  EEPROM_Ctrl bits. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
#define EE_SHIFT_CLK	0x04	/* EEPROM shift clock. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1110
#define EE_CS			0x08	/* EEPROM chip select. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
#define EE_DATA_WRITE	0x02	/* EEPROM chip data in. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
#define EE_WRITE_0		0x00
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
#define EE_WRITE_1		0x02
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
#define EE_DATA_READ	0x01	/* EEPROM chip data out. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
#define EE_ENB			(0x80 | EE_CS)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
/* Delay between EEPROM clock transitions.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
   No extra delay is needed with 33Mhz PCI, but 66Mhz may change this.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1120
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1121
#define eeprom_delay()	(void)RTL_R32(Cfg9346)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1122
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
/* The EEPROM commands include the alway-set leading bit. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
#define EE_WRITE_CMD	(5)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
#define EE_READ_CMD		(6)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
#define EE_ERASE_CMD	(7)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_len)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	unsigned retval = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	int read_cmd = location | (EE_READ_CMD << addr_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1133
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
	RTL_W8 (Cfg9346, EE_ENB & ~EE_CS);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	RTL_W8 (Cfg9346, EE_ENB);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
	eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1138
	/* Shift the read command bits out. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1139
	for (i = 4 + addr_len; i >= 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
		int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
		RTL_W8 (Cfg9346, EE_ENB | dataval);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
		eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
		RTL_W8 (Cfg9346, EE_ENB | dataval | EE_SHIFT_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1144
		eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1145
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
	RTL_W8 (Cfg9346, EE_ENB);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
	eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1148
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
	for (i = 16; i > 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
		RTL_W8 (Cfg9346, EE_ENB | EE_SHIFT_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
		eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
		retval =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
		    (retval << 1) | ((RTL_R8 (Cfg9346) & EE_DATA_READ) ? 1 :
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
				     0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
		RTL_W8 (Cfg9346, EE_ENB);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
		eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1157
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1158
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
	/* Terminate the EEPROM access. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1160
	RTL_W8 (Cfg9346, ~EE_CS);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
	eeprom_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1163
	return retval;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1164
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1165
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1166
/* MII serial management: mostly bogus for now. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
/* Read and write the MII management registers using software-generated
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
   serial MDIO protocol.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1169
   The maximum data clock rate is 2.5 Mhz.  The minimum timing is usually
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
   met by back-to-back PCI I/O cycles, but we insert a delay to avoid
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1171
   "overclocking" issues. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1172
#define MDIO_DIR		0x80
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
#define MDIO_DATA_OUT	0x04
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
#define MDIO_DATA_IN	0x02
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
#define MDIO_CLK		0x01
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
#define MDIO_WRITE0 (MDIO_DIR)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
#define MDIO_WRITE1 (MDIO_DIR | MDIO_DATA_OUT)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
#define mdio_delay()	RTL_R8(Config4)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
static const char mii_2_8139_map[8] = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1183
	BasicModeCtrl,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1184
	BasicModeStatus,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1185
	0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1186
	0,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1187
	NWayAdvert,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1188
	NWayLPAR,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1189
	NWayExpansion,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1190
	0
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1192
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1193
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
/* Syncronize the MII management interface by shifting 32 one bits out. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
static void mdio_sync (void __iomem *ioaddr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
	for (i = 32; i >= 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1201
		RTL_W8 (Config4, MDIO_WRITE1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1202
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1203
		RTL_W8 (Config4, MDIO_WRITE1 | MDIO_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1205
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1206
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1207
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1208
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1209
static int mdio_read (struct net_device *dev, int phy_id, int location)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	int retval = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
	int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	if (phy_id > 31) {	/* Really a 8139.  Use internal registers. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
		void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
		return location < 8 && mii_2_8139_map[location] ?
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1222
		    RTL_R16 (mii_2_8139_map[location]) : 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1223
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1225
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1226
	mdio_sync (ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
	/* Shift the read command bits out. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1228
	for (i = 15; i >= 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
		int dataval = (mii_cmd & (1 << i)) ? MDIO_DATA_OUT : 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1230
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
		RTL_W8 (Config4, MDIO_DIR | dataval);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1233
		RTL_W8 (Config4, MDIO_DIR | dataval | MDIO_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1237
	/* Read the two transition, 16 data, and wire-idle bits. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
	for (i = 19; i > 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
		RTL_W8 (Config4, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
		retval = (retval << 1) | ((RTL_R8 (Config4) & MDIO_DATA_IN) ? 1 : 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1242
		RTL_W8 (Config4, MDIO_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1247
	return (retval >> 1) & 0xffff;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1251
static void mdio_write (struct net_device *dev, int phy_id, int location,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
			int value)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location << 18) | value;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1258
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1259
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
	if (phy_id > 31) {	/* Really a 8139.  Use internal registers. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1262
		void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
		if (location == 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
			RTL_W16 (BasicModeCtrl, value);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
			RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
		} else if (location < 8 && mii_2_8139_map[location])
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
			RTL_W16 (mii_2_8139_map[location], value);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1269
		return;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1272
#ifdef CONFIG_8139TOO_8129
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
	mdio_sync (ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	/* Shift the command bits out. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
	for (i = 31; i >= 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
		int dataval =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
		    (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
		RTL_W8 (Config4, dataval);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1280
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1281
		RTL_W8 (Config4, dataval | MDIO_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
	/* Clear out extra bits. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
	for (i = 2; i > 0; i--) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1286
		RTL_W8 (Config4, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1288
		RTL_W8 (Config4, MDIO_CLK);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1289
		mdio_delay ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
static int rtl8139_open (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1296
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
	int retval;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1301
	retval = request_irq (dev->irq, rtl8139_interrupt, IRQF_SHARED, dev->name, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	if (retval)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
		return retval;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	tp->tx_bufs = dma_alloc_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
					   &tp->tx_bufs_dma, GFP_KERNEL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	tp->rx_ring = dma_alloc_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
					   &tp->rx_ring_dma, GFP_KERNEL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
	if (tp->tx_bufs == NULL || tp->rx_ring == NULL) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
		free_irq(dev->irq, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
		if (tp->tx_bufs)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
			dma_free_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1314
					    tp->tx_bufs, tp->tx_bufs_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1315
		if (tp->rx_ring)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1316
			dma_free_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
					    tp->rx_ring, tp->rx_ring_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		return -ENOMEM;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	napi_enable(&tp->napi);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
	tp->mii.full_duplex = tp->mii.force_media;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
	tp->tx_flag = (TX_FIFO_THRESH << 11) & 0x003f0000;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1328
	rtl8139_init_ring (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	rtl8139_hw_start (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	netif_start_queue (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	netif_dbg(tp, ifup, dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
		  "%s() ioaddr %#llx IRQ %d GP Pins %02x %s-duplex\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1334
		  __func__,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1335
		  (unsigned long long)pci_resource_start (tp->pci_dev, 1),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1336
		  dev->irq, RTL_R8 (MediaStatus),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1337
		  tp->mii.full_duplex ? "full" : "half");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1338
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
	rtl8139_start_thread(tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1340
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1341
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
static void rtl_check_media (struct net_device *dev, unsigned int init_media)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1348
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
	if (tp->phys[0] >= 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		mii_check_media(&tp->mii, netif_msg_link(tp), init_media);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1352
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
/* Start the hardware at open or resume. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
static void rtl8139_hw_start (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1356
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
	u32 i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1360
	u8 tmp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1362
	/* Bring old chips out of low-power mode. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1363
	if (rtl_chip_info[tp->chipset].flags & HasHltClk)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1364
		RTL_W8 (HltClk, 'R');
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1365
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1366
	rtl8139_chip_reset (ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1367
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1368
	/* unlock Config[01234] and BMCR register writes */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1369
	RTL_W8_F (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1370
	/* Restore our idea of the MAC address. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1371
	RTL_W32_F (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0)));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1372
	RTL_W32_F (MAC0 + 4, le16_to_cpu (*(__le16 *) (dev->dev_addr + 4)));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	tp->cur_rx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1376
	/* init Rx ring buffer DMA address */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
	RTL_W32_F (RxBuf, tp->rx_ring_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	/* Must enable Tx/Rx before setting transfer thresholds! */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1380
	RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
	tp->rx_config = rtl8139_rx_config | AcceptBroadcast | AcceptMyPhys;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
	RTL_W32 (RxConfig, tp->rx_config);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
	RTL_W32 (TxConfig, rtl8139_tx_config);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1386
	rtl_check_media (dev, 1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1387
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1388
	if (tp->chipset >= CH_8139B) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1389
		/* Disable magic packet scanning, which is enabled
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
		 * when PM is enabled in Config1.  It can be reenabled
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
		 * via ETHTOOL_SWOL if desired.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1392
		RTL_W8 (Config3, RTL_R8 (Config3) & ~Cfg3_Magic);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1393
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
	netdev_dbg(dev, "init buffer addresses\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1397
	/* Lock Config[01234] and BMCR register writes */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
	RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
	/* init Tx buffer DMA addresses */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	for (i = 0; i < NUM_TX_DESC; i++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
		RTL_W32_F (TxAddr0 + (i * 4), tp->tx_bufs_dma + (tp->tx_buf[i] - tp->tx_bufs));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
	RTL_W32 (RxMissed, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
	rtl8139_set_rx_mode (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	/* no early-rx interrupts */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
	RTL_W16 (MultiIntr, RTL_R16 (MultiIntr) & MultiIntrClear);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1411
	/* make sure RxTx has started */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1412
	tmp = RTL_R8 (ChipCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
	if ((!(tmp & CmdRxEnb)) || (!(tmp & CmdTxEnb)))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1414
		RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	/* Enable all known interrupts by setting the interrupt mask. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	RTL_W16 (IntrMask, rtl8139_intr_mask);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
static void rtl8139_init_ring (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1425
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1426
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1427
	tp->cur_rx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	tp->cur_tx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1429
	tp->dirty_tx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1431
	for (i = 0; i < NUM_TX_DESC; i++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
		tp->tx_buf[i] = &tp->tx_bufs[i * TX_BUF_SIZE];
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
/* This must be global for CONFIG_8139TOO_TUNE_TWISTER case */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1437
static int next_tick = 3 * HZ;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
#ifndef CONFIG_8139TOO_TUNE_TWISTER
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1440
static inline void rtl8139_tune_twister (struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
				  struct rtl8139_private *tp) {}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1443
enum TwisterParamVals {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1444
	PARA78_default	= 0x78fa8388,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
	PARA7c_default	= 0xcb38de43,	/* param[0][3] */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	PARA7c_xxx	= 0xcb38de43,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1447
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1448
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1449
static const unsigned long param[4][4] = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1450
	{0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	{0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	{0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	{0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
static void rtl8139_tune_twister (struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
				  struct rtl8139_private *tp)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1459
	int linkcase;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1461
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
	/* This is a complicated state machine to configure the "twister" for
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1463
	   impedance/echos based on the cable length.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1464
	   All of this is magic and undocumented.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	switch (tp->twistie) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1467
	case 1:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1468
		if (RTL_R16 (CSCR) & CSCR_LinkOKBit) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
			/* We have link beat, let us tune the twister. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1470
			RTL_W16 (CSCR, CSCR_LinkDownOffCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1471
			tp->twistie = 2;	/* Change to state 2. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
			next_tick = HZ / 10;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1473
		} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
			/* Just put in some reasonable defaults for when beat returns. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
			RTL_W16 (CSCR, CSCR_LinkDownCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
			RTL_W32 (FIFOTMS, 0x20);	/* Turn on cable test mode. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
			RTL_W32 (PARA78, PARA78_default);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
			RTL_W32 (PARA7c, PARA7c_default);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
			tp->twistie = 0;	/* Bail from future actions. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
	case 2:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
		/* Read how long it took to hear the echo. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1484
		linkcase = RTL_R16 (CSCR) & CSCR_LinkStatusBits;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
		if (linkcase == 0x7000)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
			tp->twist_row = 3;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
		else if (linkcase == 0x3000)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
			tp->twist_row = 2;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
		else if (linkcase == 0x1000)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1490
			tp->twist_row = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
		else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
			tp->twist_row = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
		tp->twist_col = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
		tp->twistie = 3;	/* Change to state 2. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
		next_tick = HZ / 10;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1497
	case 3:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1498
		/* Put out four tuning parameters, one per 100msec. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1499
		if (tp->twist_col == 0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1500
			RTL_W16 (FIFOTMS, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
		RTL_W32 (PARA7c, param[(int) tp->twist_row]
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
			 [(int) tp->twist_col]);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
		next_tick = HZ / 10;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
		if (++tp->twist_col >= 4) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
			/* For short cables we are done.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1506
			   For long cables (row == 3) check for mistune. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1507
			tp->twistie =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
			    (tp->twist_row == 3) ? 4 : 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1509
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1510
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	case 4:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1512
		/* Special case for long cables: check for mistune. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
		if ((RTL_R16 (CSCR) &
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1514
		     CSCR_LinkStatusBits) == 0x7000) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
			tp->twistie = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
			break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1517
		} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
			RTL_W32 (PARA7c, 0xfb38de03);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
			tp->twistie = 5;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
			next_tick = HZ / 10;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
	case 5:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		/* Retune for shorter cable (column 2). */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1525
		RTL_W32 (FIFOTMS, 0x20);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		RTL_W32 (PARA78, PARA78_default);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1527
		RTL_W32 (PARA7c, PARA7c_default);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
		RTL_W32 (FIFOTMS, 0x00);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
		tp->twist_row = 2;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
		tp->twist_col = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
		tp->twistie = 3;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
		next_tick = HZ / 10;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
	default:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1536
		/* do nothing */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1537
		break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
#endif /* CONFIG_8139TOO_TUNE_TWISTER */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
static inline void rtl8139_thread_iter (struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
				 struct rtl8139_private *tp,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
				 void __iomem *ioaddr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	int mii_lpa;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
	mii_lpa = mdio_read (dev, tp->phys[0], MII_LPA);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	if (!tp->mii.force_media && mii_lpa != 0xffff) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		int duplex = ((mii_lpa & LPA_100FULL) ||
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1552
			      (mii_lpa & 0x01C0) == 0x0040);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1553
		if (tp->mii.full_duplex != duplex) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1554
			tp->mii.full_duplex = duplex;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
			if (mii_lpa) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
				netdev_info(dev, "Setting %s-duplex based on MII #%d link partner ability of %04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1558
					    tp->mii.full_duplex ? "full" : "half",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1559
					    tp->phys[0], mii_lpa);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
			} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
				netdev_info(dev, "media is unconnected, link down, or incompatible connection\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
#if 0
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
			RTL_W8 (Config1, tp->mii.full_duplex ? 0x60 : 0x20);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
			RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1568
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1569
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
	next_tick = HZ * 60;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1573
	rtl8139_tune_twister (dev, tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
	netdev_dbg(dev, "Media selection tick, Link partner %04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
		   RTL_R16(NWayLPAR));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1577
	netdev_dbg(dev, "Other registers are IntMask %04x IntStatus %04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
		   RTL_R16(IntrMask), RTL_R16(IntrStatus));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
	netdev_dbg(dev, "Chip config %02x %02x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
		   RTL_R8(Config0), RTL_R8(Config1));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1583
static void rtl8139_thread (struct work_struct *work)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1584
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
	struct rtl8139_private *tp =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
		container_of(work, struct rtl8139_private, thread.work);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	struct net_device *dev = tp->mii.dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	unsigned long thr_delay = next_tick;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
	rtnl_lock();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1591
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1592
	if (!netif_running(dev))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1593
		goto out_unlock;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	if (tp->watchdog_fired) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
		tp->watchdog_fired = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
		rtl8139_tx_timeout_task(work);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	} else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1599
		rtl8139_thread_iter(dev, tp, tp->mmio_addr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	if (tp->have_thread)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
		schedule_delayed_work(&tp->thread, thr_delay);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
out_unlock:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
	rtnl_unlock ();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1606
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
static void rtl8139_start_thread(struct rtl8139_private *tp)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
	tp->twistie = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
	if (tp->chipset == CH_8139_K)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1611
		tp->twistie = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
	else if (tp->drv_flags & HAS_LNK_CHNG)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1613
		return;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
	tp->have_thread = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1616
	tp->watchdog_fired = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1617
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	schedule_delayed_work(&tp->thread, next_tick);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1620
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
static inline void rtl8139_tx_clear (struct rtl8139_private *tp)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
	tp->cur_tx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
	tp->dirty_tx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
	/* XXX account for unsent Tx packets in tp->stats.tx_dropped */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
static void rtl8139_tx_timeout_task (struct work_struct *work)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
	struct rtl8139_private *tp =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		container_of(work, struct rtl8139_private, thread.work);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	struct net_device *dev = tp->mii.dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1635
	int i;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
	u8 tmp8;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1638
	netdev_dbg(dev, "Transmit timeout, status %02x %04x %04x media %02x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		   RTL_R8(ChipCmd), RTL_R16(IntrStatus),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		   RTL_R16(IntrMask), RTL_R8(MediaStatus));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
	/* Emit info to figure out what went wrong. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
	netdev_dbg(dev, "Tx queue start entry %ld  dirty entry %ld\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1643
		   tp->cur_tx, tp->dirty_tx);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
	for (i = 0; i < NUM_TX_DESC; i++)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		netdev_dbg(dev, "Tx descriptor %d is %08lx%s\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
			   i, RTL_R32(TxStatus0 + (i * 4)),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
			   i == tp->dirty_tx % NUM_TX_DESC ?
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
			   " (queue head)" : "");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1649
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
	tp->xstats.tx_timeouts++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
	/* disable Tx ASAP, if not already */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
	tmp8 = RTL_R8 (ChipCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
	if (tmp8 & CmdTxEnb)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
		RTL_W8 (ChipCmd, CmdRxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
	spin_lock_bh(&tp->rx_lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
	/* Disable interrupts by clearing the interrupt mask. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	RTL_W16 (IntrMask, 0x0000);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
	/* Stop a shared interrupt from scavenging while we are. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
	rtl8139_tx_clear (tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
	/* ...and finally, reset everything */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
	if (netif_running(dev)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		rtl8139_hw_start (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		netif_wake_queue (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	spin_unlock_bh(&tp->rx_lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1674
static void rtl8139_tx_timeout (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1675
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
	tp->watchdog_fired = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1679
	if (!tp->have_thread) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
		INIT_DELAYED_WORK(&tp->thread, rtl8139_thread);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1681
		schedule_delayed_work(&tp->thread, next_tick);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1682
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1685
static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
					     struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1687
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
	unsigned int entry;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
	unsigned int len = skb->len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
	unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1694
	/* Calculate the next Tx descriptor entry. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
	entry = tp->cur_tx % NUM_TX_DESC;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
	/* Note: the chip doesn't have auto-pad! */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1698
	if (likely(len < TX_BUF_SIZE)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
		if (len < ETH_ZLEN)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1702
		dev_kfree_skb(skb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1704
		dev_kfree_skb(skb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1705
		dev->stats.tx_dropped++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
		return NETDEV_TX_OK;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	spin_lock_irqsave(&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
	/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
	 * Writing to TxStatus triggers a DMA transfer of the data
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1712
	 * copied to tp->tx_buf[entry] above. Use a memory barrier
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	 * to make sure that the device sees the updated data.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1714
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	wmb();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1716
	RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1717
		   tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1718
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
	dev->trans_start = jiffies;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1720
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	tp->cur_tx++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1723
	if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
		netif_stop_queue (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
	spin_unlock_irqrestore(&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1727
	netif_dbg(tp, tx_queued, dev, "Queued Tx packet size %u to slot %d\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1728
		  len, entry);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
	return NETDEV_TX_OK;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
static void rtl8139_tx_interrupt (struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
				  struct rtl8139_private *tp,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1736
				  void __iomem *ioaddr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
	unsigned long dirty_tx, tx_left;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	assert (dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
	assert (ioaddr != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
	dirty_tx = tp->dirty_tx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1744
	tx_left = tp->cur_tx - dirty_tx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	while (tx_left > 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
		int entry = dirty_tx % NUM_TX_DESC;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		int txstatus;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1749
		txstatus = RTL_R32 (TxStatus0 + (entry * sizeof (u32)));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
		if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted)))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
			break;	/* It still hasn't been Txed */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
		/* Note: TxCarrierLost is always asserted at 100mbps. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
		if (txstatus & (TxOutOfWindow | TxAborted)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
			/* There was an major error, log it. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
			netif_dbg(tp, tx_err, dev, "Transmit error, Tx status %08x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1758
				  txstatus);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
			dev->stats.tx_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
			if (txstatus & TxAborted) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
				dev->stats.tx_aborted_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
				RTL_W32 (TxConfig, TxClearAbt);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1763
				RTL_W16 (IntrStatus, TxErr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1764
				wmb();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1765
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1766
			if (txstatus & TxCarrierLost)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
				dev->stats.tx_carrier_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
			if (txstatus & TxOutOfWindow)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1769
				dev->stats.tx_window_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
		} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
			if (txstatus & TxUnderrun) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
				/* Add 64 to the Tx FIFO threshold. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1773
				if (tp->tx_flag < 0x00300000)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1774
					tp->tx_flag += 0x00020000;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1775
				dev->stats.tx_fifo_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
			dev->stats.collisions += (txstatus >> 24) & 15;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1778
			dev->stats.tx_bytes += txstatus & 0x7ff;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1779
			dev->stats.tx_packets++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1781
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1782
		dirty_tx++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
		tx_left--;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
#ifndef RTL8139_NDEBUG
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
	if (tp->cur_tx - dirty_tx > NUM_TX_DESC) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
		netdev_err(dev, "Out-of-sync dirty pointer, %ld vs. %ld\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
			   dirty_tx, tp->cur_tx);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
		dirty_tx += NUM_TX_DESC;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1792
#endif /* RTL8139_NDEBUG */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1793
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
	/* only wake the queue if we did work, and the queue is stopped */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
	if (tp->dirty_tx != dirty_tx) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
		tp->dirty_tx = dirty_tx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
		mb();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
		netif_wake_queue (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1803
/* TODO: clean this up!  Rx reset need not be this intensive */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
static void rtl8139_rx_err (u32 rx_status, struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
			    struct rtl8139_private *tp, void __iomem *ioaddr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	u8 tmp8;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
#ifdef CONFIG_8139_OLD_RX_RESET
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	int tmp_work;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	netif_dbg(tp, rx_err, dev, "Ethernet frame had errors, status %08x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
		  rx_status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
	dev->stats.rx_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
	if (!(rx_status & RxStatusOK)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
		if (rx_status & RxTooLong) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1817
			netdev_dbg(dev, "Oversized Ethernet frame, status %04x!\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
				   rx_status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
			/* A.C.: The chip hangs here. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
		if (rx_status & (RxBadSymbol | RxBadAlign))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
			dev->stats.rx_frame_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		if (rx_status & (RxRunt | RxTooLong))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1824
			dev->stats.rx_length_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1825
		if (rx_status & RxCRCErr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1826
			dev->stats.rx_crc_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1828
		tp->xstats.rx_lost_in_ring++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1829
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1830
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
#ifndef CONFIG_8139_OLD_RX_RESET
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	tmp8 = RTL_R8 (ChipCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	RTL_W8 (ChipCmd, tmp8 & ~CmdRxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	RTL_W8 (ChipCmd, tmp8);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1835
	RTL_W32 (RxConfig, tp->rx_config);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1836
	tp->cur_rx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
	/* Reset the receiver, based on RealTek recommendation. (Bug?) */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1840
	/* disable receive */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
	RTL_W8_F (ChipCmd, CmdTxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
	tmp_work = 200;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1843
	while (--tmp_work > 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1844
		udelay(1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
		tmp8 = RTL_R8 (ChipCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1846
		if (!(tmp8 & CmdRxEnb))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1847
			break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
	if (tmp_work <= 0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1850
		netdev_warn(dev, "rx stop wait too long\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1851
	/* restart receive */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
	tmp_work = 200;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	while (--tmp_work > 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
		RTL_W8_F (ChipCmd, CmdRxEnb | CmdTxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
		udelay(1);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		tmp8 = RTL_R8 (ChipCmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
		if ((tmp8 & CmdRxEnb) && (tmp8 & CmdTxEnb))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
			break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1860
	if (tmp_work <= 0)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1861
		netdev_warn(dev, "tx/rx enable wait too long\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1862
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	/* and reinitialize all rx related registers */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	RTL_W8_F (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
	/* Must enable Tx/Rx before setting transfer thresholds! */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1866
	RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
	tp->rx_config = rtl8139_rx_config | AcceptBroadcast | AcceptMyPhys;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
	RTL_W32 (RxConfig, tp->rx_config);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
	tp->cur_rx = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1871
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
	netdev_dbg(dev, "init buffer addresses\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1873
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1874
	/* Lock Config[01234] and BMCR register writes */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1875
	RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1876
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
	/* init Rx ring buffer DMA address */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	RTL_W32_F (RxBuf, tp->rx_ring_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
	/* A.C.: Reset the multicast list. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
	__set_rx_mode (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1883
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
#if RX_BUF_IDX == 3
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
static inline void wrap_copy(struct sk_buff *skb, const unsigned char *ring,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
				 u32 offset, unsigned int size)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	u32 left = RX_BUF_LEN - offset;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	if (size > left) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
		skb_copy_to_linear_data(skb, ring + offset, left);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
		skb_copy_to_linear_data_offset(skb, left, ring, size - left);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
	} else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		skb_copy_to_linear_data(skb, ring + offset, size);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
static void rtl8139_isr_ack(struct rtl8139_private *tp)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
	u16 status;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
	status = RTL_R16 (IntrStatus) & RxAckBits;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1906
	/* Clear out errors and receive interrupts */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
	if (likely(status != 0)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
		if (unlikely(status & (RxFIFOOver | RxOverflow))) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
			tp->dev->stats.rx_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
			if (status & RxFIFOOver)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
				tp->dev->stats.rx_fifo_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
		RTL_W16_F (IntrStatus, RxAckBits);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
static int rtl8139_rx(struct net_device *dev, struct rtl8139_private *tp,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		      int budget)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
	int received = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
	unsigned char *rx_ring = tp->rx_ring;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
	unsigned int cur_rx = tp->cur_rx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
	unsigned int rx_size = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
	netdev_dbg(dev, "In %s(), current %04x BufAddr %04x, free to %04x, Cmd %02x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1927
		   __func__, (u16)cur_rx,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
		   RTL_R16(RxBufAddr), RTL_R16(RxBufPtr), RTL_R8(ChipCmd));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1930
	while (netif_running(dev) && received < budget &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
	       (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		u32 ring_offset = cur_rx % RX_BUF_LEN;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		u32 rx_status;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1934
		unsigned int pkt_size;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1935
		struct sk_buff *skb;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
		rmb();
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1938
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1939
		/* read size+status of next frame from DMA ring buffer */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		rx_status = le32_to_cpu (*(__le32 *) (rx_ring + ring_offset));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
		rx_size = rx_status >> 16;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
		pkt_size = rx_size - 4;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
		netif_dbg(tp, rx_status, dev, "%s() status %04x, size %04x, cur %04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1945
			  __func__, rx_status, rx_size, cur_rx);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
#if RTL8139_DEBUG > 2
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		print_hex_dump(KERN_DEBUG, "Frame contents: ",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
			       DUMP_PREFIX_OFFSET, 16, 1,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
			       &rx_ring[ring_offset], 70, true);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
		/* Packet copy from FIFO still in progress.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
		 * Theoretically, this should never happen
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
		 * since EarlyRx is disabled.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
		 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1956
		if (unlikely(rx_size == 0xfff0)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1957
			if (!tp->fifo_copy_timeout)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1958
				tp->fifo_copy_timeout = jiffies + 2;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1959
			else if (time_after(jiffies, tp->fifo_copy_timeout)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
				netdev_dbg(dev, "hung FIFO. Reset\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
				rx_size = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
				goto no_early_rx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1963
			}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1964
			netif_dbg(tp, intr, dev, "fifo copy in progress\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
			tp->xstats.early_rx++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
			break;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
no_early_rx:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
		tp->fifo_copy_timeout = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
		/* If Rx err or invalid rx_size/rx_status received
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1973
		 * (which happens if we get lost in the ring),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1974
		 * Rx process gets reset, so we abort any further
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
		 * Rx processing.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
		if (unlikely((rx_size > (MAX_ETH_FRAME_SIZE+4)) ||
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
			     (rx_size < 8) ||
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
			     (!(rx_status & RxStatusOK)))) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
			rtl8139_rx_err (rx_status, dev, tp, ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
			received = -1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1982
			goto out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1983
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
		/* Malloc up new buffer, compatible with net-2e. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
		/* Omit the four octet CRC from the length. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
		skb = netdev_alloc_skb_ip_align(dev, pkt_size);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
		if (likely(skb)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
#if RX_BUF_IDX == 3
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
			wrap_copy(skb, rx_ring, ring_offset+4, pkt_size);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1992
#else
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
			skb_copy_to_linear_data (skb, &rx_ring[ring_offset + 4], pkt_size);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
			skb_put (skb, pkt_size);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
			skb->protocol = eth_type_trans (skb, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
			dev->stats.rx_bytes += pkt_size;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
			dev->stats.rx_packets++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
			netif_receive_skb (skb);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
			if (net_ratelimit())
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
				netdev_warn(dev, "Memory squeeze, dropping packet\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
			dev->stats.rx_dropped++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		received++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		cur_rx = (cur_rx + rx_size + 4 + 3) & ~3;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
		RTL_W16 (RxBufPtr, (u16) (cur_rx - 16));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
		rtl8139_isr_ack(tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2015
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2016
	if (unlikely(!received || rx_size == 0xfff0))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
		rtl8139_isr_ack(tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2019
	netdev_dbg(dev, "Done %s(), current %04x BufAddr %04x, free to %04x, Cmd %02x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
		   __func__, cur_rx,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
		   RTL_R16(RxBufAddr), RTL_R16(RxBufPtr), RTL_R8(ChipCmd));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2022
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	tp->cur_rx = cur_rx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
	 * The receive buffer should be mostly empty.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	 * Tell NAPI to reenable the Rx irq.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
	if (tp->fifo_copy_timeout)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
		received = budget;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2032
out:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	return received;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
static void rtl8139_weird_interrupt (struct net_device *dev,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
				     struct rtl8139_private *tp,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
				     void __iomem *ioaddr,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2040
				     int status, int link_changed)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
	netdev_dbg(dev, "Abnormal interrupt, status %08x\n", status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2043
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2044
	assert (dev != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
	assert (tp != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2046
	assert (ioaddr != NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2047
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
	/* Update the error count. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2049
	dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
	RTL_W32 (RxMissed, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
	if ((status & RxUnderrun) && link_changed &&
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2053
	    (tp->drv_flags & HAS_LNK_CHNG)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
		rtl_check_media(dev, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
		status &= ~RxUnderrun;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
	if (status & (RxUnderrun | RxErr))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
		dev->stats.rx_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
	if (status & PCSTimeout)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
		dev->stats.rx_length_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
	if (status & RxUnderrun)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
		dev->stats.rx_fifo_errors++;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
	if (status & PCIErr) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		u16 pci_cmd_status;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
		pci_read_config_word (tp->pci_dev, PCI_STATUS, &pci_cmd_status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
		pci_write_config_word (tp->pci_dev, PCI_STATUS, pci_cmd_status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2069
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2070
		netdev_err(dev, "PCI Bus error %04x\n", pci_cmd_status);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2071
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
static int rtl8139_poll(struct napi_struct *napi, int budget)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	struct rtl8139_private *tp = container_of(napi, struct rtl8139_private, napi);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	struct net_device *dev = tp->dev;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	int work_done;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
	spin_lock(&tp->rx_lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
	work_done = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2083
	if (likely(RTL_R16(IntrStatus) & RxAckBits))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2084
		work_done += rtl8139_rx(dev, tp, budget);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
	if (work_done < budget) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2088
		/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		 * Order is important since data can get interrupted
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		 * again when we think we are done.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
		 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		spin_lock_irqsave(&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2093
		RTL_W16_F(IntrMask, rtl8139_intr_mask);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2094
		__napi_complete(napi);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2095
		spin_unlock_irqrestore(&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2096
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
	spin_unlock(&tp->rx_lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
	return work_done;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
/* The interrupt handler does all of the Rx thread work and cleans up
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
   after the Tx thread. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
	struct net_device *dev = (struct net_device *) dev_instance;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2109
	u16 status, ackstat;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2110
	int link_changed = 0; /* avoid bogus "uninit" warning */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
	int handled = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
	spin_lock (&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
	status = RTL_R16 (IntrStatus);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
	/* shared irq? */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
	if (unlikely((status & rtl8139_intr_mask) == 0))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
		goto out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
	handled = 1;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
	/* h/w no longer present (hotplug?) or major error, bail */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
	if (unlikely(status == 0xFFFF))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
		goto out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
	/* close possible race's with dev_close */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2127
	if (unlikely(!netif_running(dev))) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
		RTL_W16 (IntrMask, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
		goto out;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
	/* Acknowledge all of the current interrupt sources ASAP, but
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
	   an first get an additional status bit from CSCR. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
	if (unlikely(status & RxUnderrun))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
		link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2137
	ackstat = status & ~(RxAckBits | TxErr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2138
	if (ackstat)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
		RTL_W16 (IntrStatus, ackstat);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2141
	/* Receive packets are processed by poll routine.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2142
	   If not running start it now. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2143
	if (status & RxAckBits){
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2144
		if (napi_schedule_prep(&tp->napi)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2145
			RTL_W16_F (IntrMask, rtl8139_norx_intr_mask);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
			__napi_schedule(&tp->napi);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2148
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
	/* Check uncommon events with one test. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
	if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr)))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
		rtl8139_weird_interrupt (dev, tp, ioaddr,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
					 status, link_changed);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2155
	if (status & (TxOK | TxErr)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2156
		rtl8139_tx_interrupt (dev, tp, ioaddr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
		if (status & TxErr)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
			RTL_W16 (IntrStatus, TxErr);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
 out:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
	spin_unlock (&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
	netdev_dbg(dev, "exiting interrupt, intr_status=%#4.4x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
		   RTL_R16(IntrStatus));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
	return IRQ_RETVAL(handled);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2166
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2167
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
#ifdef CONFIG_NET_POLL_CONTROLLER
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2169
/*
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
 * Polling receive - used by netconsole and other diagnostic tools
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
 * to allow network i/o with interrupts disabled.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
static void rtl8139_poll_controller(struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
	disable_irq(dev->irq);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
	rtl8139_interrupt(dev->irq, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
	enable_irq(dev->irq);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
static int rtl8139_set_mac_address(struct net_device *dev, void *p)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2182
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2183
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2185
	struct sockaddr *addr = p;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
	if (!is_valid_ether_addr(addr->sa_data))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2188
		return -EADDRNOTAVAIL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2193
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2194
	RTL_W8_F(Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
	RTL_W32_F(MAC0 + 0, cpu_to_le32 (*(u32 *) (dev->dev_addr + 0)));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
	RTL_W32_F(MAC0 + 4, cpu_to_le32 (*(u32 *) (dev->dev_addr + 4)));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2197
	RTL_W8_F(Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2200
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
static int rtl8139_close (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2205
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
	unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
	netif_stop_queue(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2211
	napi_disable(&tp->napi);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
	netif_dbg(tp, ifdown, dev, "Shutting down ethercard, status was 0x%04x\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
		  RTL_R16(IntrStatus));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2215
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2216
	spin_lock_irqsave (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
	/* Stop the chip's Tx and Rx DMA processes. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	RTL_W8 (ChipCmd, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
	/* Disable interrupts by clearing the interrupt mask. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
	RTL_W16 (IntrMask, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	/* Update the error counts. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
	dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	RTL_W32 (RxMissed, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	spin_unlock_irqrestore (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	free_irq (dev->irq, dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
	rtl8139_tx_clear (tp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	dma_free_coherent(&tp->pci_dev->dev, RX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2235
			  tp->rx_ring, tp->rx_ring_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2236
	dma_free_coherent(&tp->pci_dev->dev, TX_BUF_TOT_LEN,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2237
			  tp->tx_bufs, tp->tx_bufs_dma);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2238
	tp->rx_ring = NULL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2239
	tp->tx_bufs = NULL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
	/* Green! Put the chip in low-power mode. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2242
	RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2243
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
	if (rtl_chip_info[tp->chipset].flags & HasHltClk)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
		RTL_W8 (HltClk, 'H');	/* 'R' would leave the clock running. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
/* Get the ethtool Wake-on-LAN settings.  Assumes that wol points to
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2252
   kernel memory, *wol has been initialized as {ETHTOOL_GWOL}, and
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
   other threads or interrupts aren't messing with the 8139.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
static void rtl8139_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2259
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2260
	if (rtl_chip_info[tp->chipset].flags & HasLWake) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		u8 cfg3 = RTL_R8 (Config3);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
		u8 cfg5 = RTL_R8 (Config5);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		wol->supported = WAKE_PHY | WAKE_MAGIC
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
			| WAKE_UCAST | WAKE_MCAST | WAKE_BCAST;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
		wol->wolopts = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		if (cfg3 & Cfg3_LinkUp)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
			wol->wolopts |= WAKE_PHY;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2270
		if (cfg3 & Cfg3_Magic)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2271
			wol->wolopts |= WAKE_MAGIC;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		/* (KON)FIXME: See how netdev_set_wol() handles the
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
		   following constants.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
		if (cfg5 & Cfg5_UWF)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
			wol->wolopts |= WAKE_UCAST;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
		if (cfg5 & Cfg5_MWF)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
			wol->wolopts |= WAKE_MCAST;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2278
		if (cfg5 & Cfg5_BWF)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
			wol->wolopts |= WAKE_BCAST;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2280
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2283
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2284
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
/* Set the ethtool Wake-on-LAN settings.  Return 0 or -errno.  Assumes
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
   that wol points to kernel memory and other threads or interrupts
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
   aren't messing with the 8139.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2288
static int rtl8139_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2289
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2291
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2292
	u32 support;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2293
	u8 cfg3, cfg5;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
	support = ((rtl_chip_info[tp->chipset].flags & HasLWake)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		   ? (WAKE_PHY | WAKE_MAGIC
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		      | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		   : 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2299
	if (wol->wolopts & ~support)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2300
		return -EINVAL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2301
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2302
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
	cfg3 = RTL_R8 (Config3) & ~(Cfg3_LinkUp | Cfg3_Magic);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
	if (wol->wolopts & WAKE_PHY)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
		cfg3 |= Cfg3_LinkUp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
	if (wol->wolopts & WAKE_MAGIC)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
		cfg3 |= Cfg3_Magic;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2308
	RTL_W8 (Cfg9346, Cfg9346_Unlock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2309
	RTL_W8 (Config3, cfg3);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
	RTL_W8 (Cfg9346, Cfg9346_Lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2311
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
	cfg5 = RTL_R8 (Config5) & ~(Cfg5_UWF | Cfg5_MWF | Cfg5_BWF);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2313
	/* (KON)FIXME: These are untested.  We may have to set the
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	   CRC0, Wakeup0 and LSBCRC0 registers too, but I have no
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2315
	   documentation.  */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	if (wol->wolopts & WAKE_UCAST)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
		cfg5 |= Cfg5_UWF;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	if (wol->wolopts & WAKE_MCAST)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2319
		cfg5 |= Cfg5_MWF;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
	if (wol->wolopts & WAKE_BCAST)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
		cfg5 |= Cfg5_BWF;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
	RTL_W8 (Config5, cfg5);	/* need not unlock via Cfg9346 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2323
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2324
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
static void rtl8139_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2331
	strcpy(info->driver, DRV_NAME);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2332
	strcpy(info->version, DRV_VERSION);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	strcpy(info->bus_info, pci_name(tp->pci_dev));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2334
	info->regdump_len = tp->regs_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2335
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2336
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
static int rtl8139_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
	mii_ethtool_gset(&tp->mii, cmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
static int rtl8139_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2348
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2349
	int rc;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2351
	rc = mii_ethtool_sset(&tp->mii, cmd);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2352
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	return rc;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
static int rtl8139_nway_reset(struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
	return mii_nway_restart(&tp->mii);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
static u32 rtl8139_get_link(struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
	return mii_link_ok(&tp->mii);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2366
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
static u32 rtl8139_get_msglevel(struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2369
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2370
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	return tp->msg_enable;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
static void rtl8139_set_msglevel(struct net_device *dev, u32 datum)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
	tp->msg_enable = datum;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
static int rtl8139_get_regs_len(struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	struct rtl8139_private *tp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
	/* TODO: we are too slack to do reg dumping for pio, for now */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	if (use_io)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
		return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
	return tp->regs_len;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
static void rtl8139_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *regbuf)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2392
	struct rtl8139_private *tp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2393
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2394
	/* TODO: we are too slack to do reg dumping for pio, for now */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2395
	if (use_io)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
		return;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2397
	tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	regs->version = RTL_REGS_VER;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
	memcpy_fromio(regbuf, tp->mmio_addr, regs->len);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2403
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2404
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2405
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
static int rtl8139_get_sset_count(struct net_device *dev, int sset)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	switch (sset) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
	case ETH_SS_STATS:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
		return RTL_NUM_STATS;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2411
	default:
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2412
		return -EOPNOTSUPP;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2413
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2414
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
static void rtl8139_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2419
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2420
	data[0] = tp->xstats.early_rx;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
	data[1] = tp->xstats.tx_buf_mapped;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	data[2] = tp->xstats.tx_timeouts;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2423
	data[3] = tp->xstats.rx_lost_in_ring;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2424
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2425
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2426
static void rtl8139_get_strings(struct net_device *dev, u32 stringset, u8 *data)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2428
	memcpy(data, ethtool_stats_keys, sizeof(ethtool_stats_keys));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
static const struct ethtool_ops rtl8139_ethtool_ops = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
	.get_drvinfo		= rtl8139_get_drvinfo,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	.get_settings		= rtl8139_get_settings,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
	.set_settings		= rtl8139_set_settings,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2435
	.get_regs_len		= rtl8139_get_regs_len,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
	.get_regs		= rtl8139_get_regs,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
	.nway_reset		= rtl8139_nway_reset,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
	.get_link		= rtl8139_get_link,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
	.get_msglevel		= rtl8139_get_msglevel,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
	.set_msglevel		= rtl8139_set_msglevel,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
	.get_wol		= rtl8139_get_wol,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2442
	.set_wol		= rtl8139_set_wol,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	.get_strings		= rtl8139_get_strings,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
	.get_sset_count		= rtl8139_get_sset_count,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
	.get_ethtool_stats	= rtl8139_get_ethtool_stats,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2446
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2447
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
	int rc;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
	if (!netif_running(dev))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2454
		return -EINVAL;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
	spin_lock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
	rc = generic_mii_ioctl(&tp->mii, if_mii(rq), cmd, NULL);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
	spin_unlock_irq(&tp->lock);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
	return rc;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2461
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
static struct net_device_stats *rtl8139_get_stats (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2466
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2467
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	if (netif_running(dev)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2471
		spin_lock_irqsave (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
		dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2473
		RTL_W32 (RxMissed, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
		spin_unlock_irqrestore (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	return &dev->stats;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2478
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
/* Set or clear the multicast filter for this adaptor.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2481
   This routine is not state sensitive and need not be SMP locked. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2482
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
static void __set_rx_mode (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2485
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2486
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
	u32 mc_filter[2];	/* Multicast hash filter */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2488
	int rx_mode;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2489
	u32 tmp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2490
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2491
	netdev_dbg(dev, "rtl8139_set_rx_mode(%04x) done -- Rx config %08lx\n",
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
		   dev->flags, RTL_R32(RxConfig));
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
	/* Note: do not reorder, GCC is clever about common statements. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	if (dev->flags & IFF_PROMISC) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
		rx_mode =
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2497
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		    AcceptAllPhys;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
	} else if ((netdev_mc_count(dev) > multicast_filter_limit) ||
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
		   (dev->flags & IFF_ALLMULTI)) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
		/* Too many to filter perfectly -- accept all multicasts. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		mc_filter[1] = mc_filter[0] = 0xffffffff;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
	} else {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		struct dev_mc_list *mclist;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
		rx_mode = AcceptBroadcast | AcceptMyPhys;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		mc_filter[1] = mc_filter[0] = 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2509
		netdev_for_each_mc_addr(mclist, dev) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
			rx_mode |= AcceptMulticast;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	/* We can safely update without stopping the chip. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
	tmp = rtl8139_rx_config | rx_mode;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
	if (tp->rx_config != tmp) {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2520
		RTL_W32_F (RxConfig, tmp);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2521
		tp->rx_config = tmp;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2522
	}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2523
	RTL_W32_F (MAR0 + 0, mc_filter[0]);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
	RTL_W32_F (MAR0 + 4, mc_filter[1]);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2525
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
static void rtl8139_set_rx_mode (struct net_device *dev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2530
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2531
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2532
	spin_lock_irqsave (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
	__set_rx_mode(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
	spin_unlock_irqrestore (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
#ifdef CONFIG_PM
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
static int rtl8139_suspend (struct pci_dev *pdev, pm_message_t state)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2540
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
	struct net_device *dev = pci_get_drvdata (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	struct rtl8139_private *tp = netdev_priv(dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
	void __iomem *ioaddr = tp->mmio_addr;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	unsigned long flags;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	pci_save_state (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	if (!netif_running (dev))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2549
		return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2550
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2551
	netif_device_detach (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
	spin_lock_irqsave (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
	/* Disable interrupts, stop Tx and Rx. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	RTL_W16 (IntrMask, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
	RTL_W8 (ChipCmd, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2559
	/* Update the error counts. */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2560
	dev->stats.rx_missed_errors += RTL_R32 (RxMissed);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2561
	RTL_W32 (RxMissed, 0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2562
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2563
	spin_unlock_irqrestore (&tp->lock, flags);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2564
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2565
	pci_set_power_state (pdev, PCI_D3hot);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2568
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2569
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2570
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
static int rtl8139_resume (struct pci_dev *pdev)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
	struct net_device *dev = pci_get_drvdata (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2574
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	pci_restore_state (pdev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	if (!netif_running (dev))
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
		return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
	pci_set_power_state (pdev, PCI_D0);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	rtl8139_init_ring (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
	rtl8139_hw_start (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
	netif_device_attach (dev);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
	return 0;
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2583
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
#endif /* CONFIG_PM */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
static struct pci_driver rtl8139_pci_driver = {
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	.name		= DRV_NAME,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
	.id_table	= rtl8139_pci_tbl,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
	.probe		= rtl8139_init_one,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
	.remove		= __devexit_p(rtl8139_remove_one),
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2593
#ifdef CONFIG_PM
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	.suspend	= rtl8139_suspend,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	.resume		= rtl8139_resume,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
#endif /* CONFIG_PM */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
};
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2599
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
static int __init rtl8139_init_module (void)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
	/* when we're a module, we always print a version message,
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2603
	 * even if no 8139 board is found.
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2604
	 */
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2605
#ifdef MODULE
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	pr_info(RTL8139_DRIVER_NAME "\n");
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
#endif
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2609
	return pci_register_driver(&rtl8139_pci_driver);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2610
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2611
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
static void __exit rtl8139_cleanup_module (void)
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
{
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2615
	pci_unregister_driver (&rtl8139_pci_driver);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2616
}
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2617
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
module_init(rtl8139_init_module);
ffeab8c18590 Added 8139too driver for 2.6.34, thanks to Malcolm Lewis.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2620
module_exit(rtl8139_cleanup_module);