devices/8139too-3.4-orig.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2490 6ad972f38438
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

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