devices/8139too-3.4-ethercat.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2582 87e502828b3f
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
 *  $Id$
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
 *  Copyright (C) 2006-2009  Florian Pose, Ingenieurgemeinschaft IgH
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 *  published by the Free Software Foundation.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
 *  Public License for more details.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
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
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *****************************************************************************/
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
/**
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
   \file
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
   EtherCAT driver for RTL8139-compatible NICs.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
*/
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
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
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
  Former documentation:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
	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
    41
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
	Maintained by Jeff Garzik <jgarzik@pobox.com>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
	Copyright 2000-2002 Jeff Garzik
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
	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
    46
	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
    47
	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
    48
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    49
	-----<snip>-----
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    50
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    51
        	Written 1997-2001 by Donald Becker.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
		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
    53
		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
    54
		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
    55
		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
    56
		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
    57
		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
    58
		system is licensed under the GPL.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
		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
    61
		PCI ethernet chips.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
		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
    64
		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
    65
		MD 21403
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
		Support and updates available at
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
		http://www.scyld.com/network/rtl8139.html
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
		Twister-tuning table provided by Kinston
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
		<shangh@realtek.com.tw>.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    73
	-----<snip>-----
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    74
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
	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
    76
	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
    77
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
	Contributors:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    80
		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
    81
		(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
    82
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    83
		Tigran Aivazian - bug fixes, skbuff free cleanup
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
		Martin Mares - suggestions for PCI cleanup
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
		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
    88
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
		Ernst Gill - fixes ported from BSD driver
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
		Daniel Kobras - identified specific locations of
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
			posted MMIO write bugginess
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
		Gerard Sharp - bug fix, testing and feedback
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
		David Ford - Rx ring wrap fix
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
		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
    99
		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
   100
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
		Donald Becker/Chris Butterworth/Marcus Westergren -
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
		Noticed various Rx packet size-related buglets.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
		Santiago Garcia Mantinan - testing and feedback
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
		Jens David - 2.2.x kernel backports
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
		Martin Dennett - incredibly helpful insight on undocumented
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
		features of the 8139 chips
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
		Jean-Jacques Michel - bug fix
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
		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
   114
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
		Andrew Morton - Clear blocked signals, avoid
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
		buffer overrun setting current->comm.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
		Kalle Olavi Niemitalo - Wake-on-LAN ioctls
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
		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
   121
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
	Submitting bug reports:
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
		"rtl8139-diag -mmmaaavvveefN" output
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
		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
   126
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   129
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
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
#define DRV_NAME	"ec_8139too"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   132
#define DRV_VERSION	"0.9.28"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   133
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   135
#include <linux/module.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
#include <linux/kernel.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
#include <linux/compiler.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
#include <linux/pci.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
#include <linux/init.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
#include <linux/interrupt.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
#include <linux/netdevice.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   142
#include <linux/etherdevice.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
#include <linux/rtnetlink.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
#include <linux/delay.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
#include <linux/ethtool.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
#include <linux/mii.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
#include <linux/completion.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
#include <linux/crc32.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   149
#include <linux/io.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   150
#include <linux/uaccess.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
#include <linux/gfp.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   152
#include <asm/irq.h>
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   153
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   154
#include "../globals.h"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   155
#include "ecdev.h"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   156
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
#define RTL8139_DRIVER_NAME DRV_NAME \
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
                            " EtherCAT-capable Fast Ethernet driver " \
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   159
                            DRV_VERSION ", master " EC_MASTER_VERSION
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   161
#define PFX DRV_NAME ": "
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
/* Default Message level */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   164
#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
   165
                                 NETIF_MSG_PROBE  | \
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
                                 NETIF_MSG_LINK)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
/* 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
   170
#define RTL8139_DEBUG 0
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
/* 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
   173
#undef RTL8139_NDEBUG
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
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
#ifdef RTL8139_NDEBUG
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
#  define assert(expr) do {} while (0)
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 assert(expr) \
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
        if (unlikely(!(expr))) {				\
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
		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
   182
		       #expr, __FILE__, __func__, __LINE__);	\
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
        }
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
/* A few user-configurable values. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   188
/* media options */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   189
#define MAX_UNITS 8
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   190
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
   191
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
   192
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
/* 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
   194
#ifdef CONFIG_8139TOO_PIO
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   195
static int use_io = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
static int use_io = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   200
/* 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
   201
   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
   202
static int multicast_filter_limit = 32;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   203
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   204
/* bitmapped message enable number */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   205
static int debug = -1;
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
/*
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   208
 * Receive ring size
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   209
 * 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
   210
 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   211
#if defined(CONFIG_SH_DREAMCAST)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   212
#define RX_BUF_IDX 0	/* 8K ring */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   213
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   214
#define RX_BUF_IDX	2	/* 32K ring */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   215
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   216
#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
   217
#define RX_BUF_PAD	16
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   218
#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
   219
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   220
#if RX_BUF_LEN == 65536
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   221
#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
   222
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   223
#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
   224
#endif
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
/* Number of Tx descriptor registers. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   227
#define NUM_TX_DESC	4
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   228
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   229
/* 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
   230
#define MAX_ETH_FRAME_SIZE	1536
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   231
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   232
/* 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
   233
#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
   234
#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
   235
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
/* PCI Tuning Parameters
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
   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
   238
#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
   239
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   240
/* 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
   241
#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
   242
#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
   243
#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
   244
#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
   245
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   246
/* Operational parameters that usually are not changed. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   247
/* 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
   248
#define TX_TIMEOUT  (6*HZ)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
enum {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   252
	HAS_MII_XCVR = 0x010000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   253
	HAS_CHIP_XCVR = 0x020000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
	HAS_LNK_CHNG = 0x040000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   257
#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
   258
#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
   259
#define RTL_MIN_IO_SIZE 0x80
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
#define RTL8139B_IO_SIZE 256
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
#define RTL8129_CAPS	HAS_MII_XCVR
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
#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
   264
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
typedef enum {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
	RTL8139 = 0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
	RTL8129,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
} board_t;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
/* indexed by board_t, above */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
static const struct {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
	const char *name;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
	u32 hw_flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
} board_info[] __devinitdata = {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
	{ "RealTek RTL8139", RTL8139_CAPS },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
	{ "RealTek RTL8129", RTL8129_CAPS },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
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
   282
	{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
   283
	{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
   284
	{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
   285
	{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
   286
	{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
   287
	{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
   288
	{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
   289
	{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
   290
	{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
   291
	{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
   292
	{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
   293
	{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
   294
	{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
   295
	{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
   296
	{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
   297
	{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
   298
	{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
   299
	{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
   300
	{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
   301
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   302
#ifdef CONFIG_SH_SECUREEDGE5410
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   303
	/* 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
   304
	{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
   305
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   306
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   307
	{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
   308
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
	/* 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
   311
	 * 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
   312
	 * 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
   313
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   314
	{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
   315
	{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
   316
	{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
   317
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
	{0,}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   319
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   320
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   321
/* prevent driver from being loaded automatically */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   322
//MODULE_DEVICE_TABLE (pci, rtl8139_pci_tbl);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   323
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   324
static struct {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   325
	const char str[ETH_GSTRING_LEN];
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   326
} ethtool_stats_keys[] = {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   327
	{ "early_rx" },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   328
	{ "tx_buf_mapped" },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   329
	{ "tx_timeouts" },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   330
	{ "rx_lost_in_ring" },
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   331
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   332
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   333
/* 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
   334
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   335
/* Symbolic offsets to registers. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   336
enum RTL8139_registers {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   337
	MAC0		= 0,	 /* Ethernet hardware address. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   338
	MAR0		= 8,	 /* Multicast filter. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   339
	TxStatus0	= 0x10,	 /* Transmit status (Four 32bit registers). */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   340
	TxAddr0		= 0x20,	 /* Tx descriptors (also four 32bit). */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
	RxBuf		= 0x30,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
	ChipCmd		= 0x37,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
	RxBufPtr	= 0x38,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   344
	RxBufAddr	= 0x3A,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
	IntrMask	= 0x3C,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
	IntrStatus	= 0x3E,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
	TxConfig	= 0x40,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
	RxConfig	= 0x44,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
	Timer		= 0x48,	 /* A general-purpose counter. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
	RxMissed	= 0x4C,  /* 24 bits valid, write clears. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
	Cfg9346		= 0x50,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
	Config0		= 0x51,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
	Config1		= 0x52,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
	TimerInt	= 0x54,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
	MediaStatus	= 0x58,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
	Config3		= 0x59,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
	Config4		= 0x5A,	 /* absent on RTL-8139A */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
	HltClk		= 0x5B,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
	MultiIntr	= 0x5C,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
	TxSummary	= 0x60,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
	BasicModeCtrl	= 0x62,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
	BasicModeStatus	= 0x64,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
	NWayAdvert	= 0x66,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
	NWayLPAR	= 0x68,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
	NWayExpansion	= 0x6A,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
	/* Undocumented registers, but required for proper operation. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
	FIFOTMS		= 0x70,	 /* FIFO Control and test. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
	CSCR		= 0x74,	 /* Chip Status and Configuration Register. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
	PARA78		= 0x78,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
	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
   371
	PARA7c		= 0x7c,	 /* Magic transceiver parameter register. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
	Config5		= 0xD8,	 /* absent on RTL-8139A */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
enum ClearBitMasks {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
	MultiIntrClear	= 0xF000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
	ChipCmdClear	= 0xE2,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
	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
   379
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
enum ChipCmdBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
	CmdReset	= 0x10,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
	CmdRxEnb	= 0x08,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
	CmdTxEnb	= 0x04,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
	RxBufEmpty	= 0x01,
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
/* 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
   389
enum IntrStatusBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
	PCIErr		= 0x8000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
	PCSTimeout	= 0x4000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
	RxFIFOOver	= 0x40,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
	RxUnderrun	= 0x20,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
	RxOverflow	= 0x10,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
	TxErr		= 0x08,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
	TxOK		= 0x04,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
	RxErr		= 0x02,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
	RxOK		= 0x01,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
	RxAckBits	= RxFIFOOver | RxOverflow | RxOK,
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
enum TxStatusBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   404
	TxHostOwns	= 0x2000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
	TxUnderrun	= 0x4000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
	TxStatOK	= 0x8000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
	TxOutOfWindow	= 0x20000000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
	TxAborted	= 0x40000000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
	TxCarrierLost	= 0x80000000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
enum RxStatusBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   412
	RxMulticast	= 0x8000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
	RxPhysical	= 0x4000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
	RxBroadcast	= 0x2000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
	RxBadSymbol	= 0x0020,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
	RxRunt		= 0x0010,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
	RxTooLong	= 0x0008,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   418
	RxCRCErr	= 0x0004,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   419
	RxBadAlign	= 0x0002,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   420
	RxStatusOK	= 0x0001,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
/* Bits in RxConfig. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   424
enum rx_mode_bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   425
	AcceptErr	= 0x20,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   426
	AcceptRunt	= 0x10,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   427
	AcceptBroadcast	= 0x08,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   428
	AcceptMulticast	= 0x04,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
	AcceptMyPhys	= 0x02,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
	AcceptAllPhys	= 0x01,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
/* Bits in TxConfig. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   434
enum tx_config_bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   435
        /* 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
   436
        TxIFGShift	= 24,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   437
        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
   438
        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
   439
        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
   440
        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
   441
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
	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
   443
	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
   444
	TxClearAbt	= (1 << 0),	/* Clear abort (WO) */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
	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
   446
	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
   447
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
	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
   449
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
/* Bits in Config1 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
enum Config1Bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
	Cfg1_PM_Enable	= 0x01,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
	Cfg1_VPD_Enable	= 0x02,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
	Cfg1_PIO	= 0x04,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
	Cfg1_MMIO	= 0x08,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
	LWAKE		= 0x10,		/* not on 8139, 8139A */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
	Cfg1_Driver_Load = 0x20,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
	Cfg1_LED0	= 0x40,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
	Cfg1_LED1	= 0x80,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
	SLEEP		= (1 << 1),	/* only on 8139, 8139A */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
	PWRDN		= (1 << 0),	/* only on 8139, 8139A */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
};
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
/* Bits in Config3 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
enum Config3Bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
	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
   468
	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
   469
	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
   470
	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
   471
	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
   472
	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
   473
	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
   474
	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
   475
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   476
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   477
/* Bits in Config4 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   478
enum Config4Bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   479
	LWPTN	= (1 << 2),	/* not on 8139, 8139A */
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   482
/* Bits in Config5 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   483
enum Config5Bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   484
	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
   485
	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
   486
	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
   487
	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
   488
	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
   489
	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
   490
	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
   491
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   492
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   493
enum RxConfigBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   494
	/* rx fifo threshold */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   495
	RxCfgFIFOShift	= 13,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   496
	RxCfgFIFONone	= (7 << RxCfgFIFOShift),
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
	/* Max DMA burst */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   499
	RxCfgDMAShift	= 8,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   500
	RxCfgDMAUnlimited = (7 << RxCfgDMAShift),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   501
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   502
	/* rx ring buffer length */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   503
	RxCfgRcv8K	= 0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   504
	RxCfgRcv16K	= (1 << 11),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   505
	RxCfgRcv32K	= (1 << 12),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   506
	RxCfgRcv64K	= (1 << 11) | (1 << 12),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   507
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   508
	/* 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
   509
	RxNoWrap	= (1 << 7),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   510
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   511
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   512
/* Twister tuning parameters from RealTek.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   513
   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
   514
enum CSCRBits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   515
	CSCR_LinkOKBit		= 0x0400,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   516
	CSCR_LinkChangeBit	= 0x0800,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   517
	CSCR_LinkStatusBits	= 0x0f000,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   518
	CSCR_LinkDownOffCmd	= 0x003c0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   519
	CSCR_LinkDownCmd	= 0x0f3c0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   520
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   521
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   522
enum Cfg9346Bits {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   523
	Cfg9346_Lock	= 0x00,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   524
	Cfg9346_Unlock	= 0xC0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   525
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   526
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   527
typedef enum {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   528
	CH_8139	= 0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   529
	CH_8139_K,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   530
	CH_8139A,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   531
	CH_8139A_G,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   532
	CH_8139B,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   533
	CH_8130,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   534
	CH_8139C,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   535
	CH_8100,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   536
	CH_8100B_8139D,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   537
	CH_8101,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   538
} chip_t;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   539
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   540
enum chip_flags {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   541
	HasHltClk	= (1 << 0),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   542
	HasLWake	= (1 << 1),
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   545
#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
   546
	(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
   547
#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
   548
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   549
/* directly indexed by chip_t, above */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   550
static const struct {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   551
	const char *name;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
	u32 version; /* from RTL8139C/RTL8139D docs */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
	u32 flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   554
} rtl_chip_info[] = {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   555
	{ "RTL-8139",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   556
	  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
   557
	  HasHltClk,
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
	{ "RTL-8139 rev K",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   561
	  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
   562
	  HasHltClk,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   563
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   564
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
	{ "RTL-8139A",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
	  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
   567
	  HasHltClk, /* XXX undocumented? */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   568
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   569
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   570
	{ "RTL-8139A rev G",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   571
	  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
   572
	  HasHltClk, /* XXX undocumented? */
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   575
	{ "RTL-8139B",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   576
	  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
   577
	  HasLWake,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   578
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   579
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   580
	{ "RTL-8130",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   581
	  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
   582
	  HasLWake,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   583
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   584
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   585
	{ "RTL-8139C",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   586
	  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
   587
	  HasLWake,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   588
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   589
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   590
	{ "RTL-8100",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   591
	  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
   592
 	  HasLWake,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   593
 	},
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
	{ "RTL-8100B/8139D",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   596
	  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
   597
	  HasHltClk /* XXX undocumented? */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   598
	| HasLWake,
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   601
	{ "RTL-8101",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   602
	  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
   603
	  HasLWake,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   604
	},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   605
};
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
struct rtl_extra_stats {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   608
	unsigned long early_rx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   609
	unsigned long tx_buf_mapped;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   610
	unsigned long tx_timeouts;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   611
	unsigned long rx_lost_in_ring;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   614
struct rtl8139_stats {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   615
	u64	packets;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   616
	u64	bytes;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   617
	struct u64_stats_sync	syncp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   618
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   619
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   620
struct rtl8139_private {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   621
	void __iomem		*mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   622
	int			drv_flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   623
	struct pci_dev		*pci_dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   624
	u32			msg_enable;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   625
	struct napi_struct	napi;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   626
	struct net_device	*dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   627
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   628
	unsigned char		*rx_ring;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   629
	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
   630
	struct rtl8139_stats	rx_stats;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   631
	dma_addr_t		rx_ring_dma;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   632
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   633
	unsigned int		tx_flag;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   634
	unsigned long		cur_tx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   635
	unsigned long		dirty_tx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   636
	struct rtl8139_stats	tx_stats;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   637
	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
   638
	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
   639
	dma_addr_t		tx_bufs_dma;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   640
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   641
	signed char		phys[4];	/* MII device addresses. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   642
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   643
				/* Twister tune state. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   644
	char			twistie, twist_row, twist_col;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   645
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   646
	unsigned int		watchdog_fired : 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   647
	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
   648
	unsigned int		have_thread : 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   649
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   650
	spinlock_t		lock;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   651
	spinlock_t		rx_lock;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   652
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   653
	chip_t			chipset;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   654
	u32			rx_config;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   655
	struct rtl_extra_stats	xstats;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   656
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   657
	struct delayed_work	thread;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   658
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   659
	struct mii_if_info	mii;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   660
	unsigned int		regs_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   661
	unsigned long		fifo_copy_timeout;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   662
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   663
	ec_device_t *ecdev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   664
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   665
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   666
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   667
MODULE_DESCRIPTION("RealTek RTL-8139 EtherCAT driver");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   668
MODULE_LICENSE("GPL");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   669
MODULE_VERSION(EC_MASTER_VERSION);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   670
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   671
module_param(use_io, int, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   672
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
   673
module_param(multicast_filter_limit, int, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   674
module_param_array(media, int, NULL, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   675
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
   676
module_param(debug, int, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   677
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
   678
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
   679
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
   680
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
   681
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   682
void ec_poll(struct net_device *);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   683
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   684
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
   685
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
   686
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
   687
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
   688
			int val);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   689
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
   690
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
   691
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
   692
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
   693
				       struct net_device *dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   694
#ifdef CONFIG_NET_POLL_CONTROLLER
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   695
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
   696
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   697
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
   698
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
   699
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
   700
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
   701
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
   702
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
   703
						    struct rtnl_link_stats64
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   704
						    *stats);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   705
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
   706
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
   707
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
   708
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
   709
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
   710
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
   711
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   712
/* write MMIO register, with flush */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   713
/* 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
   714
#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
   715
#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
   716
#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
   717
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   718
/* write MMIO register */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   719
#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
   720
#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
   721
#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
   722
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   723
/* read MMIO register */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   724
#define RTL_R8(reg)		ioread8 (ioaddr + (reg))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   725
#define RTL_R16(reg)		ioread16 (ioaddr + (reg))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   726
#define RTL_R32(reg)		ioread32 (ioaddr + (reg))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   727
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
static const u16 rtl8139_intr_mask =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   730
	PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   731
	TxErr | TxOK | RxErr | RxOK;
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
static const u16 rtl8139_norx_intr_mask =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   734
	PCIErr | PCSTimeout | RxUnderrun |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   735
	TxErr | TxOK | RxErr ;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   736
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   737
#if RX_BUF_IDX == 0
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   738
static const unsigned int rtl8139_rx_config =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   739
	RxCfgRcv8K | RxNoWrap |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   740
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   741
	(RX_DMA_BURST << RxCfgDMAShift);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   742
#elif RX_BUF_IDX == 1
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   743
static const unsigned int rtl8139_rx_config =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   744
	RxCfgRcv16K | RxNoWrap |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   745
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   746
	(RX_DMA_BURST << RxCfgDMAShift);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   747
#elif RX_BUF_IDX == 2
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   748
static const unsigned int rtl8139_rx_config =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   749
	RxCfgRcv32K | RxNoWrap |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   750
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   751
	(RX_DMA_BURST << RxCfgDMAShift);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   752
#elif RX_BUF_IDX == 3
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   753
static const unsigned int rtl8139_rx_config =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   754
	RxCfgRcv64K |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   755
	(RX_FIFO_THRESH << RxCfgFIFOShift) |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   756
	(RX_DMA_BURST << RxCfgDMAShift);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   757
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   758
#error "Invalid configuration for 8139_RXBUF_IDX"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   759
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   760
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   761
static const unsigned int rtl8139_tx_config =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   762
	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
   763
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   764
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
   765
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   766
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   767
	struct pci_dev *pdev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   768
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   769
	assert (dev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   770
	assert (tp->pci_dev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   771
	pdev = tp->pci_dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   772
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   773
	if (tp->mmio_addr)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   774
		pci_iounmap (pdev, tp->mmio_addr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   775
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   776
	/* 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
   777
	pci_release_regions (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   778
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   779
	free_netdev(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   780
	pci_set_drvdata (pdev, NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   781
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   782
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   783
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   784
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
   785
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   786
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   787
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
	/* Soft reset the chip. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   789
	RTL_W8 (ChipCmd, CmdReset);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   790
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   791
	/* 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
   792
	for (i = 1000; i > 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   793
		barrier();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   794
		if ((RTL_R8 (ChipCmd) & CmdReset) == 0)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   795
			break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   796
		udelay (10);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   797
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   798
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   799
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   800
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   801
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
   802
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   803
	void __iomem *ioaddr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   804
	struct net_device *dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   805
	struct rtl8139_private *tp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   806
	u8 tmp8;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   807
	int rc, disable_dev_on_err = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   808
	unsigned int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   809
	unsigned long pio_start, pio_end __attribute__ ((unused)), pio_flags,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   810
                  pio_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   811
	unsigned long mmio_start __attribute__ ((unused)),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   812
                  mmio_end __attribute__ ((unused)), mmio_flags, mmio_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   813
	u32 version;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   814
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   815
	assert (pdev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   816
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   817
	/* dev and priv zeroed in alloc_etherdev */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   818
	dev = alloc_etherdev (sizeof (*tp));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   819
	if (dev == NULL)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   820
		return ERR_PTR(-ENOMEM);
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
	SET_NETDEV_DEV(dev, &pdev->dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   823
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   824
	tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   825
	tp->pci_dev = pdev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   826
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   827
	/* 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
   828
	rc = pci_enable_device (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   829
	if (rc)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   830
		goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   831
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   832
	pio_start = pci_resource_start (pdev, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   833
	pio_end = pci_resource_end (pdev, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   834
	pio_flags = pci_resource_flags (pdev, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   835
	pio_len = pci_resource_len (pdev, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   836
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   837
	mmio_start = pci_resource_start (pdev, 1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   838
	mmio_end = pci_resource_end (pdev, 1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   839
	mmio_flags = pci_resource_flags (pdev, 1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   840
	mmio_len = pci_resource_len (pdev, 1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   841
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   842
	/* 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
   843
	 * we talk to the chip directly */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   844
	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
   845
	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
   846
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   847
retry:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   848
	if (use_io) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   849
		/* 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
   850
		if (!(pio_flags & IORESOURCE_IO)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   851
			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
   852
			rc = -ENODEV;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   853
			goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   854
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   855
		/* check for weird/broken PCI region reporting */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   856
		if (pio_len < RTL_MIN_IO_SIZE) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   857
			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
   858
			rc = -ENODEV;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   859
			goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   860
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   861
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   862
		/* 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
   863
		if (!(mmio_flags & IORESOURCE_MEM)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   864
			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
   865
			rc = -ENODEV;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   866
			goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   867
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   868
		if (mmio_len < RTL_MIN_IO_SIZE) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   869
			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
   870
			rc = -ENODEV;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   871
			goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   872
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   873
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   874
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   875
	rc = pci_request_regions (pdev, DRV_NAME);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   876
	if (rc)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   877
		goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   878
	disable_dev_on_err = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   879
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   880
	/* enable PCI bus-mastering */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   881
	pci_set_master (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   882
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   883
	if (use_io) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   884
		ioaddr = pci_iomap(pdev, 0, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   885
		if (!ioaddr) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   886
			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
   887
			rc = -EIO;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   888
			goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   889
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   890
		dev->base_addr = pio_start;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   891
		tp->regs_len = pio_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   892
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   893
		/* ioremap MMIO region */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   894
		ioaddr = pci_iomap(pdev, 1, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   895
		if (ioaddr == NULL) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   896
			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
   897
			pci_release_regions(pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   898
			use_io = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   899
			goto retry;
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
		dev->base_addr = (long) ioaddr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   902
		tp->regs_len = mmio_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   903
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   904
	tp->mmio_addr = ioaddr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   905
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   906
	/* 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
   907
	RTL_W8 (HltClk, 'R');
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
	/* check for missing/broken hardware */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   910
	if (RTL_R32 (TxConfig) == 0xFFFFFFFF) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   911
		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
   912
		rc = -EIO;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   913
		goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   914
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   915
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   916
	/* identify chip attached to board */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   917
	version = RTL_R32 (TxConfig) & HW_REVID_MASK;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   918
	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
   919
		if (version == rtl_chip_info[i].version) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   920
			tp->chipset = i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   921
			goto match;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   922
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   923
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   924
	/* 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
   925
	i = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   926
	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
   927
	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
   928
	tp->chipset = 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
match:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   931
	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
   932
		 version, i, rtl_chip_info[i].name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   933
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   934
	if (tp->chipset >= CH_8139B) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   935
		u8 new_tmp8 = tmp8 = RTL_R8 (Config1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   936
		pr_debug("PCI PM wakeup\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   937
		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
   938
		    (tmp8 & LWAKE))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   939
			new_tmp8 &= ~LWAKE;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   940
		new_tmp8 |= Cfg1_PM_Enable;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   941
		if (new_tmp8 != tmp8) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   942
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   943
			RTL_W8 (Config1, tmp8);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   944
			RTL_W8 (Cfg9346, Cfg9346_Lock);
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
		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
   947
			tmp8 = RTL_R8 (Config4);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   948
			if (tmp8 & LWPTN) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   949
				RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   950
				RTL_W8 (Config4, tmp8 & ~LWPTN);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   951
				RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   952
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   953
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   954
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   955
		pr_debug("Old chip wakeup\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   956
		tmp8 = RTL_R8 (Config1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   957
		tmp8 &= ~(SLEEP | PWRDN);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   958
		RTL_W8 (Config1, tmp8);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   959
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   960
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   961
	rtl8139_chip_reset (ioaddr);
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
	return dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   964
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   965
err_out:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   966
	__rtl8139_cleanup_dev (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   967
	if (disable_dev_on_err)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   968
		pci_disable_device (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   969
	return ERR_PTR(rc);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   970
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   971
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   972
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
   973
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   974
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   975
	unsigned long flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   976
	netdev_features_t changed = features ^ dev->features;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   977
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   978
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   979
	if (!(changed & (NETIF_F_RXALL)))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   980
		return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   981
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   982
	spin_lock_irqsave(&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   983
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   984
	if (changed & NETIF_F_RXALL) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   985
		int rx_mode = tp->rx_config;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   986
		if (features & NETIF_F_RXALL)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   987
			rx_mode |= (AcceptErr | AcceptRunt);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   988
		else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   989
			rx_mode &= ~(AcceptErr | AcceptRunt);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   990
		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
   991
		RTL_W32_F(RxConfig, tp->rx_config);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   992
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   993
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   994
	spin_unlock_irqrestore(&tp->lock, flags);
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
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   997
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   998
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   999
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
  1000
	.ndo_open		= rtl8139_open,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1001
	.ndo_stop		= rtl8139_close,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1002
	.ndo_get_stats64	= rtl8139_get_stats64,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1003
	.ndo_change_mtu		= eth_change_mtu,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1004
	.ndo_validate_addr	= eth_validate_addr,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1005
	.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
  1006
	.ndo_start_xmit		= rtl8139_start_xmit,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1007
	.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
  1008
	.ndo_do_ioctl		= netdev_ioctl,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1009
	.ndo_tx_timeout		= rtl8139_tx_timeout,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1010
#ifdef CONFIG_NET_POLL_CONTROLLER
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1011
	.ndo_poll_controller	= rtl8139_poll_controller,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1012
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1013
	.ndo_set_features	= rtl8139_set_features,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1014
};
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
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
  1017
				       const struct pci_device_id *ent)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1018
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1019
	struct net_device *dev = NULL;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1020
	struct rtl8139_private *tp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1021
	int i, addr_len, option;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1022
	void __iomem *ioaddr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1023
	static int board_idx = -1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1024
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1025
	assert (pdev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1026
	assert (ent != NULL);
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
	board_idx++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1029
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1030
	/* 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
  1031
	 * 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
  1032
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1033
#ifndef MODULE
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
		static int printed_version;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1036
		if (!printed_version++)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1037
			pr_info(RTL8139_DRIVER_NAME "\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1038
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1039
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1040
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1041
	if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1042
	    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
  1043
		dev_info(&pdev->dev,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1044
			   "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
  1045
		       	   pdev->vendor, pdev->device, pdev->revision);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1046
		return -ENODEV;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1047
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1048
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1049
	if (pdev->vendor == PCI_VENDOR_ID_REALTEK &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1050
	    pdev->device == PCI_DEVICE_ID_REALTEK_8139 &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1051
	    pdev->subsystem_vendor == PCI_VENDOR_ID_ATHEROS &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1052
	    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
  1053
		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
  1054
		use_io = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1055
	}
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 = rtl8139_init_board (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1058
	if (IS_ERR(dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1059
		return PTR_ERR(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1060
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1061
	assert (dev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1062
	tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1063
	tp->dev = 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
	ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1066
	assert (ioaddr != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1067
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1068
	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
  1069
	for (i = 0; i < 3; i++)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1070
		((__le16 *) (dev->dev_addr))[i] =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1071
		    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
  1072
	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
  1073
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1074
	/* 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
  1075
	dev->netdev_ops = &rtl8139_netdev_ops;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1076
	dev->ethtool_ops = &rtl8139_ethtool_ops;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1077
	dev->watchdog_timeo = TX_TIMEOUT;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1078
	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
  1079
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1080
	/* 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
  1081
	 * 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
  1082
	 * features
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1083
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1084
	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
  1085
	dev->vlan_features = dev->features;
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
	dev->hw_features |= NETIF_F_RXALL;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1088
	dev->hw_features |= NETIF_F_RXFCS;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1089
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1090
	dev->irq = pdev->irq;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1091
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1092
	/* tp zeroed and aligned in alloc_etherdev */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1093
	tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1094
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1095
	/* 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
  1096
	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
  1097
	tp->mmio_addr = ioaddr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1098
	tp->msg_enable =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1099
		(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
  1100
	spin_lock_init (&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1101
	spin_lock_init (&tp->rx_lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1102
	INIT_DELAYED_WORK(&tp->thread, rtl8139_thread);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1103
	tp->mii.dev = dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1104
	tp->mii.mdio_read = mdio_read;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1105
	tp->mii.mdio_write = mdio_write;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1106
	tp->mii.phy_id_mask = 0x3f;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1107
	tp->mii.reg_num_mask = 0x1f;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1108
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1109
	/* 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
  1110
	// offer device to EtherCAT master module
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1111
	tp->ecdev = ecdev_offer(dev, ec_poll, THIS_MODULE);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1112
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1113
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1114
		pr_debug("about to register device named %s (%p)...\n", dev->name, dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1115
		i = register_netdev (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1116
		if (i) goto err_out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1117
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1118
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1119
	pci_set_drvdata (pdev, dev);
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
	pr_info("%s: %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
  1122
		dev->name,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1123
		board_info[ent->driver_data].name,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1124
		dev->base_addr,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1125
		dev->dev_addr,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1126
		dev->irq);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1127
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1128
	pr_debug("%s:  Identified 8139 chip type '%s'\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1129
		dev->name, rtl_chip_info[tp->chipset].name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1130
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1131
	/* Find the connected MII xcvrs.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1132
	   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
  1133
	   takes too much time. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1134
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1135
	if (tp->drv_flags & HAS_MII_XCVR) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1136
		int phy, phy_idx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1137
		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
  1138
			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
  1139
			if (mii_status != 0xffff  &&  mii_status != 0x0000) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1140
				u16 advertising = mdio_read(dev, phy, 4);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1141
				tp->phys[phy_idx++] = phy;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1142
				pr_info("%s: MII transceiver %d status 0x%4.4x advertising %4.4x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1143
					   dev->name, phy, mii_status, advertising);
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
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1146
		if (phy_idx == 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1147
			pr_info("%s: 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
  1148
				   dev->name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1149
			tp->phys[0] = 32;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1150
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1151
	} else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1152
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1153
		tp->phys[0] = 32;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1154
	tp->mii.phy_id = tp->phys[0];
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1155
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1156
	/* 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
  1157
	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
  1158
	if (option > 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1159
		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
  1160
		tp->default_port = option & 0xFF;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1161
		if (tp->default_port)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1162
			tp->mii.force_media = 1;
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
	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
  1165
		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
  1166
	if (tp->mii.full_duplex) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1167
		pr_info("%s: Media type forced to Full Duplex.\n", dev->name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1168
		/* 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
  1169
		   re-connection. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1170
		tp->mii.force_media = 1;
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
	if (tp->default_port) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1173
		pr_info("  Forcing %dMbps %s-duplex operation.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1174
			   (option & 0x20 ? 100 : 10),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1175
			   (option & 0x10 ? "full" : "half"));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1176
		mdio_write(dev, tp->phys[0], 0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1177
				   ((option & 0x20) ? 0x2000 : 0) | 	/* 100Mbps? */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1178
				   ((option & 0x10) ? 0x0100 : 0)); /* Full duplex? */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1179
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1180
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1181
	/* Put the chip into low-power mode. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1182
	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
  1183
		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
  1184
2582
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1185
	if (tp->ecdev) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1186
		i = ecdev_open(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1187
		if (i) {
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1188
			ecdev_withdraw(tp->ecdev);
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1189
			goto err_out;
87e502828b3f Use return value of ecdev_open(); thanks to Patrick Bruenn.
Florian Pose <fp@igh-essen.com>
parents: 2490
diff changeset
  1190
		}
2490
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1191
	}
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
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1194
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1195
err_out:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1196
	__rtl8139_cleanup_dev (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1197
	pci_disable_device (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1198
	return i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1199
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1200
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
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
  1203
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1204
	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
  1205
	struct rtl8139_private *tp = netdev_priv(dev);
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
	assert (dev != NULL);
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
	if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1210
		ecdev_close(tp->ecdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1211
		ecdev_withdraw(tp->ecdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1212
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1213
	else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1214
		cancel_delayed_work_sync(&tp->thread);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1215
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1216
		unregister_netdev (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1217
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1218
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1219
	__rtl8139_cleanup_dev (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1220
	pci_disable_device (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1221
}
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1224
/* Serial EEPROM section. */
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
/*  EEPROM_Ctrl bits. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1227
#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
  1228
#define EE_CS			0x08	/* EEPROM chip select. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1229
#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
  1230
#define EE_WRITE_0		0x00
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1231
#define EE_WRITE_1		0x02
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1232
#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
  1233
#define EE_ENB			(0x80 | EE_CS)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1234
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1235
/* Delay between EEPROM clock transitions.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1236
   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
  1237
 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1238
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1239
#define eeprom_delay()	(void)RTL_R8(Cfg9346)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1240
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1241
/* 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
  1242
#define EE_WRITE_CMD	(5)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1243
#define EE_READ_CMD		(6)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1244
#define EE_ERASE_CMD	(7)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1245
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1246
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
  1247
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1248
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1249
	unsigned retval = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1250
	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
  1251
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1252
	RTL_W8 (Cfg9346, EE_ENB & ~EE_CS);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1253
	RTL_W8 (Cfg9346, EE_ENB);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1254
	eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1255
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1256
	/* Shift the read command bits out. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1257
	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
  1258
		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
  1259
		RTL_W8 (Cfg9346, EE_ENB | dataval);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1260
		eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1261
		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
  1262
		eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1263
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1264
	RTL_W8 (Cfg9346, EE_ENB);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1265
	eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1266
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1267
	for (i = 16; i > 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1268
		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
  1269
		eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1270
		retval =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1271
		    (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
  1272
				     0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1273
		RTL_W8 (Cfg9346, EE_ENB);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1274
		eeprom_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1275
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1276
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1277
	/* Terminate the EEPROM access. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1278
	RTL_W8 (Cfg9346, ~EE_CS);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1279
	eeprom_delay ();
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
	return retval;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1282
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1283
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1284
/* MII serial management: mostly bogus for now. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1285
/* 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
  1286
   serial MDIO protocol.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1287
   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
  1288
   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
  1289
   "overclocking" issues. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1290
#define MDIO_DIR		0x80
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1291
#define MDIO_DATA_OUT	0x04
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1292
#define MDIO_DATA_IN	0x02
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1293
#define MDIO_CLK		0x01
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1294
#define MDIO_WRITE0 (MDIO_DIR)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1295
#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
  1296
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1297
#define mdio_delay()	RTL_R8(Config4)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1298
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1299
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1300
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
  1301
	BasicModeCtrl,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1302
	BasicModeStatus,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1303
	0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1304
	0,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1305
	NWayAdvert,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1306
	NWayLPAR,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1307
	NWayExpansion,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1308
	0
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1309
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1310
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1311
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1312
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1313
/* 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
  1314
static void mdio_sync (void __iomem *ioaddr)
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
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1317
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1318
	for (i = 32; i >= 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1319
		RTL_W8 (Config4, MDIO_WRITE1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1320
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1321
		RTL_W8 (Config4, MDIO_WRITE1 | MDIO_CLK);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1322
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1323
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1324
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1325
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1326
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1327
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
  1328
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1329
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1330
	int retval = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1331
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1332
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1333
	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
  1334
	int i;
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
	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
  1338
		void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1339
		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
  1340
		    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
  1341
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1342
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1343
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1344
	mdio_sync (ioaddr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1345
	/* Shift the read command bits out. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1346
	for (i = 15; i >= 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1347
		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
  1348
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1349
		RTL_W8 (Config4, MDIO_DIR | dataval);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1350
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1351
		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
  1352
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1353
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1354
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1355
	/* 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
  1356
	for (i = 19; i > 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1357
		RTL_W8 (Config4, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1358
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1359
		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
  1360
		RTL_W8 (Config4, MDIO_CLK);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1361
		mdio_delay ();
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
#endif
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
	return (retval >> 1) & 0xffff;
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
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
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
  1370
			int value)
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
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1373
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1374
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1375
	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
  1376
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1377
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1378
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1379
	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
  1380
		void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1381
		if (location == 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1382
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1383
			RTL_W16 (BasicModeCtrl, value);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1384
			RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1385
		} 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
  1386
			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
  1387
		return;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1390
#ifdef CONFIG_8139TOO_8129
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1391
	mdio_sync (ioaddr);
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
	/* Shift the command bits out. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1394
	for (i = 31; i >= 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1395
		int dataval =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1396
		    (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
  1397
		RTL_W8 (Config4, dataval);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1398
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1399
		RTL_W8 (Config4, dataval | MDIO_CLK);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1400
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1401
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1402
	/* Clear out extra bits. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1403
	for (i = 2; i > 0; i--) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1404
		RTL_W8 (Config4, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1405
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1406
		RTL_W8 (Config4, MDIO_CLK);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1407
		mdio_delay ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1408
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1409
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1410
}
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1413
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
  1414
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1415
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1416
	int retval;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1417
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1418
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1419
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1420
		retval = request_irq(dev->irq, rtl8139_interrupt,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1421
			IRQF_SHARED, dev->name, dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1422
		if (retval)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1423
			return retval;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1424
	}
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->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
  1427
					   &tp->tx_bufs_dma, GFP_KERNEL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1428
	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
  1429
					   &tp->rx_ring_dma, GFP_KERNEL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1430
	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
  1431
		if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1432
			free_irq(dev->irq, dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1433
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1434
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1435
		if (tp->tx_bufs)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1436
			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
  1437
					    tp->tx_bufs, tp->tx_bufs_dma);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1438
		if (tp->rx_ring)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1439
			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
  1440
					    tp->rx_ring, tp->rx_ring_dma);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1441
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1442
		return -ENOMEM;
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
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1445
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1446
	napi_enable(&tp->napi);
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
	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
  1449
	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
  1450
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1451
	rtl8139_init_ring (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1452
	rtl8139_hw_start (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1453
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1454
		netif_start_queue (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1455
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1456
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1457
	netif_dbg(tp, ifup, dev,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1458
		  "%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
  1459
		  __func__,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1460
		  (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
  1461
		  dev->irq, RTL_R8 (MediaStatus),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1462
		  tp->mii.full_duplex ? "full" : "half");
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
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1465
		rtl8139_start_thread(tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1466
	}
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
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1469
}
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1472
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
  1473
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1474
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1475
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1476
	if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1477
		void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1478
		u16 state = RTL_R16(BasicModeStatus) & BMSR_LSTATUS;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1479
		ecdev_set_link(tp->ecdev, state ? 1 : 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1480
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1481
	else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1482
		if (tp->phys[0] >= 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1483
			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
  1484
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1485
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1486
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1487
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1488
/* Start the hardware at open or resume. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1489
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
  1490
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1491
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1492
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1493
	u32 i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1494
	u8 tmp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1495
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1496
	/* 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
  1497
	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
  1498
		RTL_W8 (HltClk, 'R');
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
	rtl8139_chip_reset (ioaddr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1501
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1502
	/* unlock Config[01234] and BMCR register writes */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1503
	RTL_W8_F (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1504
	/* Restore our idea of the MAC address. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1505
	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
  1506
	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
  1507
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1508
	tp->cur_rx = 0;
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
	/* init Rx ring buffer DMA address */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1511
	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
  1512
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1513
	/* 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
  1514
	RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1515
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1516
	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
  1517
	RTL_W32 (RxConfig, tp->rx_config);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1518
	RTL_W32 (TxConfig, rtl8139_tx_config);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1519
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1520
	rtl_check_media (dev, 1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1521
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1522
	if (tp->chipset >= CH_8139B) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1523
		/* Disable magic packet scanning, which is enabled
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1524
		 * 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
  1525
		 * via ETHTOOL_SWOL if desired.  */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1526
		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
  1527
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1528
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1529
	netdev_dbg(dev, "init buffer addresses\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1530
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1531
	/* Lock Config[01234] and BMCR register writes */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1532
	RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1533
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1534
	/* init Tx buffer DMA addresses */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1535
	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
  1536
		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
  1537
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1538
	RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1539
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1540
	rtl8139_set_rx_mode (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1541
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1542
	/* no early-rx interrupts */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1543
	RTL_W16 (MultiIntr, RTL_R16 (MultiIntr) & MultiIntrClear);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1544
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1545
	/* make sure RxTx has started */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1546
	tmp = RTL_R8 (ChipCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1547
	if ((!(tmp & CmdRxEnb)) || (!(tmp & CmdTxEnb)))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1548
		RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1549
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1550
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1551
		/* 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
  1552
		RTL_W16 (IntrMask, rtl8139_intr_mask);
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
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1555
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1556
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1557
/* 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
  1558
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
  1559
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1560
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1561
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1562
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1563
	tp->cur_rx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1564
	tp->cur_tx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1565
	tp->dirty_tx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1566
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1567
	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
  1568
		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
  1569
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1570
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1571
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1572
/* 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
  1573
static int next_tick = 3 * HZ;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1574
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1575
#ifndef CONFIG_8139TOO_TUNE_TWISTER
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1576
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
  1577
				  struct rtl8139_private *tp) {}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1578
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1579
enum TwisterParamVals {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1580
	PARA78_default	= 0x78fa8388,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1581
	PARA7c_default	= 0xcb38de43,	/* param[0][3] */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1582
	PARA7c_xxx	= 0xcb38de43,
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1585
static const unsigned long param[4][4] = {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1586
	{0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1587
	{0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1588
	{0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83},
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1589
	{0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1590
};
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
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
  1593
				  struct rtl8139_private *tp)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1594
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1595
	int linkcase;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1596
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1597
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1598
	/* 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
  1599
	   impedance/echos based on the cable length.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1600
	   All of this is magic and undocumented.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1601
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1602
	switch (tp->twistie) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1603
	case 1:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1604
		if (RTL_R16 (CSCR) & CSCR_LinkOKBit) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1605
			/* 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
  1606
			RTL_W16 (CSCR, CSCR_LinkDownOffCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1607
			tp->twistie = 2;	/* Change to state 2. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1608
			next_tick = HZ / 10;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1609
		} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1610
			/* 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
  1611
			RTL_W16 (CSCR, CSCR_LinkDownCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1612
			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
  1613
			RTL_W32 (PARA78, PARA78_default);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1614
			RTL_W32 (PARA7c, PARA7c_default);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1615
			tp->twistie = 0;	/* Bail from future actions. */
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
		break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1618
	case 2:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1619
		/* 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
  1620
		linkcase = RTL_R16 (CSCR) & CSCR_LinkStatusBits;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1621
		if (linkcase == 0x7000)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1622
			tp->twist_row = 3;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1623
		else if (linkcase == 0x3000)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1624
			tp->twist_row = 2;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1625
		else if (linkcase == 0x1000)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1626
			tp->twist_row = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1627
		else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1628
			tp->twist_row = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1629
		tp->twist_col = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1630
		tp->twistie = 3;	/* Change to state 2. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1631
		next_tick = HZ / 10;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1632
		break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1633
	case 3:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1634
		/* 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
  1635
		if (tp->twist_col == 0)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1636
			RTL_W16 (FIFOTMS, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1637
		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
  1638
			 [(int) tp->twist_col]);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1639
		next_tick = HZ / 10;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1640
		if (++tp->twist_col >= 4) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1641
			/* For short cables we are done.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1642
			   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
  1643
			tp->twistie =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1644
			    (tp->twist_row == 3) ? 4 : 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1645
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1646
		break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1647
	case 4:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1648
		/* 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
  1649
		if ((RTL_R16 (CSCR) &
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1650
		     CSCR_LinkStatusBits) == 0x7000) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1651
			tp->twistie = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1652
			break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1653
		} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1654
			RTL_W32 (PARA7c, 0xfb38de03);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1655
			tp->twistie = 5;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1656
			next_tick = HZ / 10;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1657
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1658
		break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1659
	case 5:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1660
		/* Retune for shorter cable (column 2). */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1661
		RTL_W32 (FIFOTMS, 0x20);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1662
		RTL_W32 (PARA78, PARA78_default);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1663
		RTL_W32 (PARA7c, PARA7c_default);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1664
		RTL_W32 (FIFOTMS, 0x00);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1665
		tp->twist_row = 2;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1666
		tp->twist_col = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1667
		tp->twistie = 3;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1668
		next_tick = HZ / 10;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1669
		break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1670
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1671
	default:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1672
		/* do nothing */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1673
		break;
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
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1676
#endif /* CONFIG_8139TOO_TUNE_TWISTER */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1677
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1678
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
  1679
				 struct rtl8139_private *tp,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1680
				 void __iomem *ioaddr)
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
	int mii_lpa;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1683
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1684
	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
  1685
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1686
	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
  1687
		int duplex = ((mii_lpa & LPA_100FULL) ||
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1688
			      (mii_lpa & 0x01C0) == 0x0040);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1689
		if (tp->mii.full_duplex != duplex) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1690
			tp->mii.full_duplex = duplex;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1691
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1692
			if (mii_lpa) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1693
				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
  1694
					    tp->mii.full_duplex ? "full" : "half",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1695
					    tp->phys[0], mii_lpa);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1696
			} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1697
				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
  1698
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1699
#if 0
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1700
			RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1701
			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
  1702
			RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1703
#endif
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
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1706
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1707
	next_tick = HZ * 60;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1708
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1709
	rtl8139_tune_twister (dev, tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1710
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1711
	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
  1712
		   RTL_R16(NWayLPAR));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1713
	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
  1714
		   RTL_R16(IntrMask), RTL_R16(IntrStatus));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1715
	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
  1716
		   RTL_R8(Config0), RTL_R8(Config1));
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1719
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
  1720
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1721
	struct rtl8139_private *tp =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1722
		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
  1723
	struct net_device *dev = tp->mii.dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1724
	unsigned long thr_delay = next_tick;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1725
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1726
	rtnl_lock();
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
	if (!netif_running(dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1729
		goto out_unlock;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1730
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1731
	if (tp->watchdog_fired) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1732
		tp->watchdog_fired = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1733
		rtl8139_tx_timeout_task(work);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1734
	} else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1735
		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
  1736
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1737
	if (tp->have_thread)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1738
		schedule_delayed_work(&tp->thread, thr_delay);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1739
out_unlock:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1740
	rtnl_unlock ();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1741
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1742
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1743
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
  1744
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1745
	tp->twistie = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1746
	if (tp->chipset == CH_8139_K)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1747
		tp->twistie = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1748
	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
  1749
		return;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1750
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1751
	tp->have_thread = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1752
	tp->watchdog_fired = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1753
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1754
	schedule_delayed_work(&tp->thread, next_tick);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1755
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1756
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1757
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
  1758
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1759
	tp->cur_tx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1760
	tp->dirty_tx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1761
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1762
	/* 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
  1763
}
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
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
  1766
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1767
	struct rtl8139_private *tp =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1768
		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
  1769
	struct net_device *dev = tp->mii.dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1770
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1771
	int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1772
	u8 tmp8;
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
	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
  1775
		   RTL_R8(ChipCmd), RTL_R16(IntrStatus),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1776
		   RTL_R16(IntrMask), RTL_R8(MediaStatus));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1777
	/* 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
  1778
	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
  1779
		   tp->cur_tx, tp->dirty_tx);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1780
	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
  1781
		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
  1782
			   i, RTL_R32(TxStatus0 + (i * 4)),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1783
			   i == tp->dirty_tx % NUM_TX_DESC ?
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1784
			   " (queue head)" : "");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1785
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1786
	tp->xstats.tx_timeouts++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1787
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1788
	/* disable Tx ASAP, if not already */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1789
	tmp8 = RTL_R8 (ChipCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1790
	if (tmp8 & CmdTxEnb)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1791
		RTL_W8 (ChipCmd, CmdRxEnb);
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 (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1794
		rtl8139_tx_clear (tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1795
		rtl8139_hw_start (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1796
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1797
	else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1798
	  spin_lock_bh(&tp->rx_lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1799
	  /* Disable interrupts by clearing the interrupt mask. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1800
	  RTL_W16 (IntrMask, 0x0000);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1801
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1802
	  /* 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
  1803
	  spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1804
	  rtl8139_tx_clear (tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1805
	  spin_unlock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1806
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1807
	  /* ...and finally, reset everything */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1808
	  if (netif_running(dev)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1809
	    rtl8139_hw_start (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1810
	    netif_wake_queue (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1811
	  }
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1812
	  spin_unlock_bh(&tp->rx_lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1813
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1814
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1815
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1816
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
  1817
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1818
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1819
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1820
	tp->watchdog_fired = 1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1821
	if (!tp->ecdev && !tp->have_thread) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1822
		INIT_DELAYED_WORK(&tp->thread, rtl8139_thread);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1823
		schedule_delayed_work(&tp->thread, next_tick);
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1827
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
  1828
					     struct net_device *dev)
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
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1831
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1832
	unsigned int entry;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1833
	unsigned int len = skb->len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1834
	unsigned long flags = 0;
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
	/* Calculate the next Tx descriptor entry. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1837
	entry = tp->cur_tx % NUM_TX_DESC;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1838
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1839
	/* 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
  1840
	if (likely(len < TX_BUF_SIZE)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1841
		if (len < ETH_ZLEN)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1842
			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
  1843
		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
  1844
		if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1845
			dev_kfree_skb(skb);
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
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1848
		if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1849
			dev_kfree_skb(skb);
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
		dev->stats.tx_dropped++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1852
		return NETDEV_TX_OK;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1853
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1854
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1855
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1856
		spin_lock_irqsave(&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1857
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1858
	/*
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1859
	 * 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
  1860
	 * 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
  1861
	 * 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
  1862
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1863
	wmb();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1864
	RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1865
		   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
  1866
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1867
	tp->cur_tx++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1868
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1869
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1870
		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
  1871
			netif_stop_queue (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1872
		spin_unlock_irqrestore(&tp->lock, flags);
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
	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
  1876
		  len, entry);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1877
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1878
	return NETDEV_TX_OK;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1879
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1880
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1881
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1882
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
  1883
				  struct rtl8139_private *tp,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1884
				  void __iomem *ioaddr)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1885
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1886
	unsigned long dirty_tx, tx_left;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1887
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1888
	assert (dev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1889
	assert (ioaddr != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1890
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1891
	dirty_tx = tp->dirty_tx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1892
	tx_left = tp->cur_tx - dirty_tx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1893
	while (tx_left > 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1894
		int entry = dirty_tx % NUM_TX_DESC;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1895
		int txstatus;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1896
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1897
		txstatus = RTL_R32 (TxStatus0 + (entry * sizeof (u32)));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1898
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1899
		if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted)))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1900
			break;	/* It still hasn't been Txed */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1901
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1902
		/* Note: TxCarrierLost is always asserted at 100mbps. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1903
		if (txstatus & (TxOutOfWindow | TxAborted)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1904
			/* There was an major error, log it. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1905
			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
  1906
				  txstatus);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1907
			dev->stats.tx_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1908
			if (txstatus & TxAborted) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1909
				dev->stats.tx_aborted_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1910
				RTL_W32 (TxConfig, TxClearAbt);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1911
				RTL_W16 (IntrStatus, TxErr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1912
				wmb();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1913
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1914
			if (txstatus & TxCarrierLost)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1915
				dev->stats.tx_carrier_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1916
			if (txstatus & TxOutOfWindow)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1917
				dev->stats.tx_window_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1918
		} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1919
			if (txstatus & TxUnderrun) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1920
				/* Add 64 to the Tx FIFO threshold. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1921
				if (tp->tx_flag < 0x00300000)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1922
					tp->tx_flag += 0x00020000;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1923
				dev->stats.tx_fifo_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1924
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1925
			dev->stats.collisions += (txstatus >> 24) & 15;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1926
			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
  1927
			tp->tx_stats.packets++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1928
			tp->tx_stats.bytes += txstatus & 0x7ff;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1929
			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
  1930
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1931
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1932
		dirty_tx++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1933
		tx_left--;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1936
#ifndef RTL8139_NDEBUG
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1937
	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
  1938
		pr_err("%s: 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
  1939
		        dev->name, dirty_tx, tp->cur_tx);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1940
		dirty_tx += NUM_TX_DESC;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1941
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1942
#endif /* RTL8139_NDEBUG */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1943
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1944
	/* 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
  1945
	if (tp->dirty_tx != dirty_tx) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1946
		tp->dirty_tx = dirty_tx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1947
		mb();
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1948
		if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1949
			netif_wake_queue (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1950
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1951
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1952
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1953
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1954
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1955
/* 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
  1956
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
  1957
			    struct rtl8139_private *tp, void __iomem *ioaddr)
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
	u8 tmp8;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1960
#ifdef CONFIG_8139_OLD_RX_RESET
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1961
	int tmp_work;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1962
#endif
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
	if (netif_msg_rx_err (tp))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1965
		pr_debug("%s: Ethernet frame had errors, status %8.8x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1966
			dev->name, rx_status);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1967
	dev->stats.rx_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1968
	if (!(rx_status & RxStatusOK)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1969
		if (rx_status & RxTooLong) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1970
			pr_debug("%s: Oversized Ethernet frame, status %4.4x!\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1971
			 	dev->name, rx_status);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1972
			/* A.C.: The chip hangs here. */
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
		if (rx_status & (RxBadSymbol | RxBadAlign))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1975
			dev->stats.rx_frame_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1976
		if (rx_status & (RxRunt | RxTooLong))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1977
			dev->stats.rx_length_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1978
		if (rx_status & RxCRCErr)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1979
			dev->stats.rx_crc_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1980
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1981
		tp->xstats.rx_lost_in_ring++;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1984
#ifndef CONFIG_8139_OLD_RX_RESET
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1985
	tmp8 = RTL_R8 (ChipCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1986
	RTL_W8 (ChipCmd, tmp8 & ~CmdRxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1987
	RTL_W8 (ChipCmd, tmp8);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1988
	RTL_W32 (RxConfig, tp->rx_config);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1989
	tp->cur_rx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1990
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1991
	/* 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
  1992
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1993
	/* disable receive */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1994
	RTL_W8_F (ChipCmd, CmdTxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1995
	tmp_work = 200;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1996
	while (--tmp_work > 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1997
		udelay(1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1998
		tmp8 = RTL_R8 (ChipCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  1999
		if (!(tmp8 & CmdRxEnb))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2000
			break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2001
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2002
	if (tmp_work <= 0)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2003
		pr_warning(PFX "rx stop wait too long\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2004
	/* restart receive */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2005
	tmp_work = 200;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2006
	while (--tmp_work > 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2007
		RTL_W8_F (ChipCmd, CmdRxEnb | CmdTxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2008
		udelay(1);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2009
		tmp8 = RTL_R8 (ChipCmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2010
		if ((tmp8 & CmdRxEnb) && (tmp8 & CmdTxEnb))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2011
			break;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2012
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2013
	if (tmp_work <= 0)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2014
		pr_warning(PFX "tx/rx enable wait too long\n");
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
	/* and reinitialize all rx related registers */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2017
	RTL_W8_F (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2018
	/* 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
  2019
	RTL_W8 (ChipCmd, CmdRxEnb | CmdTxEnb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2020
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2021
	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
  2022
	RTL_W32 (RxConfig, tp->rx_config);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2023
	tp->cur_rx = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2024
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2025
	pr_debug("init buffer addresses\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2026
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2027
	/* Lock Config[01234] and BMCR register writes */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2028
	RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2029
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2030
	/* init Rx ring buffer DMA address */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2031
	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
  2032
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2033
	/* A.C.: Reset the multicast list. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2034
	__set_rx_mode (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2035
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2036
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2037
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2038
#if RX_BUF_IDX == 3
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2039
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
  2040
				 u32 offset, unsigned int size)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2041
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2042
	u32 left = RX_BUF_LEN - offset;
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
	if (size > left) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2045
		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
  2046
		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
  2047
	} else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2048
		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
  2049
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2050
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2051
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2052
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
  2053
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2054
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2055
	u16 status;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2056
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2057
	status = RTL_R16 (IntrStatus) & RxAckBits;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2058
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2059
	/* Clear out errors and receive interrupts */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2060
	if (likely(status != 0)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2061
		if (unlikely(status & (RxFIFOOver | RxOverflow))) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2062
			tp->dev->stats.rx_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2063
			if (status & RxFIFOOver)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2064
				tp->dev->stats.rx_fifo_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2065
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2066
		RTL_W16_F (IntrStatus, RxAckBits);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2067
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2068
}
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
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
  2071
		      int budget)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2072
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2073
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2074
	int received = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2075
	unsigned char *rx_ring = tp->rx_ring;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2076
	unsigned int cur_rx = tp->cur_rx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2077
	unsigned int rx_size = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2078
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2079
	pr_debug("%s: In rtl8139_rx(), current %4.4x BufAddr %4.4x,"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2080
		 " free to %4.4x, Cmd %2.2x.\n", dev->name, (u16)cur_rx,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2081
		 RTL_R16 (RxBufAddr),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2082
		 RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
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
	while ((tp->ecdev || netif_running(dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2085
			&& received < budget
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2086
			&& (RTL_R8 (ChipCmd) & RxBufEmpty) == 0) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2087
		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
  2088
		u32 rx_status;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2089
		unsigned int pkt_size;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2090
		struct sk_buff *skb;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2091
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2092
		rmb();
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
		/* 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
  2095
		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
  2096
		rx_size = rx_status >> 16;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2097
		if (likely(!(dev->features & NETIF_F_RXFCS)))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2098
			pkt_size = rx_size - 4;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2099
		else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2100
			pkt_size = rx_size;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2101
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2102
		if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2103
			if (netif_msg_rx_status(tp))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2104
				pr_debug("%s:  rtl8139_rx() status %4.4x, size %4.4x,"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2105
					" cur %4.4x.\n", dev->name, rx_status,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2106
				 rx_size, cur_rx);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2107
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2108
#if RTL8139_DEBUG > 2
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
			int i;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2111
			pr_debug("%s: Frame contents ", dev->name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2112
			for (i = 0; i < 70; i++)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2113
				pr_cont(" %2.2x",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2114
					rx_ring[ring_offset + i]);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2115
			pr_cont(".\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2116
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2117
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2118
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2119
		/* Packet copy from FIFO still in progress.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2120
		 * Theoretically, this should never happen
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2121
		 * since EarlyRx is disabled.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2122
		 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2123
		if (unlikely(rx_size == 0xfff0)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2124
			if (!tp->fifo_copy_timeout)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2125
				tp->fifo_copy_timeout = jiffies + 2;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2126
			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
  2127
				pr_debug("%s: hung FIFO. Reset.", dev->name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2128
				rx_size = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2129
				goto no_early_rx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2130
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2131
			if (netif_msg_intr(tp)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2132
				pr_debug("%s: fifo copy in progress.",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2133
				       dev->name);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2134
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2135
			tp->xstats.early_rx++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2136
			break;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2139
no_early_rx:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2140
		tp->fifo_copy_timeout = 0;
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
		/* 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
  2143
		 * (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
  2144
		 * 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
  2145
		 * Rx processing.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2146
		 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2147
		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
  2148
			     (rx_size < 8) ||
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2149
			     (!(rx_status & RxStatusOK)))) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2150
			if ((dev->features & NETIF_F_RXALL) &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2151
			    (rx_size <= (MAX_ETH_FRAME_SIZE + 4)) &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2152
			    (rx_size >= 8) &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2153
			    (!(rx_status & RxStatusOK))) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2154
				/* 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
  2155
				 * 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
  2156
				 * errors without resetting the chip. --Ben
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2157
				 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2158
				dev->stats.rx_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2159
				if (rx_status & RxCRCErr) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2160
					dev->stats.rx_crc_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2161
					goto keep_pkt;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2162
				}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2163
				if (rx_status & RxRunt) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2164
					dev->stats.rx_length_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2165
					goto keep_pkt;
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
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2168
			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
  2169
			received = -1;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2170
			goto out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2171
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2172
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2173
keep_pkt:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2174
		if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2175
			ecdev_receive(tp->ecdev,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2176
					&rx_ring[ring_offset + 4], pkt_size);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2177
					dev->last_rx = jiffies;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2178
					dev->stats.rx_bytes += pkt_size;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2179
					dev->stats.rx_packets++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2180
		} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2181
			/* 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
  2182
			/* 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
  2183
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2184
			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
  2185
			if (likely(skb)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2186
#if RX_BUF_IDX == 3
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2187
				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
  2188
#else
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2189
				skb_copy_to_linear_data (skb, &rx_ring[ring_offset + 4],
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2190
						pkt_size);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2191
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2192
				skb_put (skb, pkt_size);
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
				skb->protocol = eth_type_trans (skb, dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2195
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2196
				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
  2197
				tp->rx_stats.packets++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2198
				tp->rx_stats.bytes += pkt_size;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2199
				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
  2200
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2201
				netif_receive_skb (skb);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2202
			} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2203
				if (net_ratelimit())
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2204
					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
  2205
				dev->stats.rx_dropped++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2206
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2207
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2208
		received++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2209
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2210
		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
  2211
		RTL_W16 (RxBufPtr, (u16) (cur_rx - 16));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2212
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2213
		rtl8139_isr_ack(tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2214
	}
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
	if (unlikely(!received || rx_size == 0xfff0))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2217
		rtl8139_isr_ack(tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2218
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2219
	pr_debug("%s: Done rtl8139_rx(), current %4.4x BufAddr %4.4x,"
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2220
		 " free to %4.4x, Cmd %2.2x.\n", dev->name, cur_rx,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2221
		 RTL_R16 (RxBufAddr),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2222
		 RTL_R16 (RxBufPtr), RTL_R8 (ChipCmd));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2223
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2224
	tp->cur_rx = cur_rx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2225
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2226
	/*
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2227
	 * The receive buffer should be mostly empty.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2228
	 * Tell NAPI to reenable the Rx irq.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2229
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2230
	if (tp->fifo_copy_timeout)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2231
		received = budget;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2232
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2233
out:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2234
	return received;
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
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
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
  2239
				     struct rtl8139_private *tp,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2240
				     void __iomem *ioaddr,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2241
				     int status, int link_changed)
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
	pr_debug("%s: Abnormal interrupt, status %8.8x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2244
		 dev->name, status);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2245
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2246
	assert (dev != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2247
	assert (tp != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2248
	assert (ioaddr != NULL);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2249
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2250
	/* Update the error count. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2251
	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
  2252
	RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2253
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2254
	if ((status & RxUnderrun) && link_changed &&
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2255
	    (tp->drv_flags & HAS_LNK_CHNG)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2256
		rtl_check_media(dev, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2257
		status &= ~RxUnderrun;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2258
	}
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
	if (status & (RxUnderrun | RxErr))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2261
		dev->stats.rx_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2262
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2263
	if (status & PCSTimeout)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2264
		dev->stats.rx_length_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2265
	if (status & RxUnderrun)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2266
		dev->stats.rx_fifo_errors++;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2267
	if (status & PCIErr) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2268
		u16 pci_cmd_status;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2269
		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
  2270
		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
  2271
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2272
		pr_err("%s: PCI Bus error %4.4x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2273
			dev->name, pci_cmd_status);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2274
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2275
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2276
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2277
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
  2278
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2279
	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
  2280
	struct net_device *dev = tp->dev;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2281
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2282
	int work_done;
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(&tp->rx_lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2285
	work_done = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2286
	if (likely(RTL_R16(IntrStatus) & RxAckBits))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2287
		work_done += rtl8139_rx(dev, tp, budget);
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
	if (work_done < budget) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2290
		unsigned long flags;
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
		 * 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
  2293
		 * again when we think we are done.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2294
		 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2295
		spin_lock_irqsave(&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2296
		__napi_complete(napi);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2297
		RTL_W16_F(IntrMask, rtl8139_intr_mask);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2298
		spin_unlock_irqrestore(&tp->lock, flags);
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
	spin_unlock(&tp->rx_lock);
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
	return work_done;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2303
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2304
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2305
void ec_poll(struct net_device *dev)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2306
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2307
	rtl8139_interrupt(0, dev);
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2310
/* 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
  2311
   after the Tx thread. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2312
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
  2313
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2314
	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
  2315
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2316
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2317
	u16 status, ackstat;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2318
	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
  2319
	int handled = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2320
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2321
	if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2322
		status = RTL_R16 (IntrStatus);
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
	else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2325
		spin_lock (&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2326
		status = RTL_R16 (IntrStatus);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2327
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2328
		/* shared irq? */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2329
		if (unlikely((status & rtl8139_intr_mask) == 0))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2330
			goto out;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2333
	handled = 1;
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
	/* 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
  2336
	if (unlikely(status == 0xFFFF))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2337
		goto out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2338
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2339
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2340
		/* close possible race's with dev_close */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2341
		if (unlikely(!netif_running(dev))) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2342
			RTL_W16 (IntrMask, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2343
			goto out;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2344
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2345
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2346
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2347
	/* 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
  2348
	   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
  2349
	if (unlikely(status & RxUnderrun))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2350
		link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit;
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
	ackstat = status & ~(RxAckBits | TxErr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2353
	if (ackstat)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2354
		RTL_W16 (IntrStatus, ackstat);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2355
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2356
	/* Receive packets are processed by poll routine.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2357
	   If not running start it now. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2358
	if (status & RxAckBits){
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2359
		if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2360
			/* EtherCAT device: Just receive all frames */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2361
			rtl8139_rx(dev, tp, 100); // FIXME
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2362
		} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2363
			/* Mark for polling */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2364
			if (napi_schedule_prep(&tp->napi)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2365
				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
  2366
				__napi_schedule(&tp->napi);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2367
			}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2368
		}
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2371
	/* Check uncommon events with one test. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2372
	if (unlikely(status & (PCIErr | PCSTimeout | RxUnderrun | RxErr)))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2373
		rtl8139_weird_interrupt (dev, tp, ioaddr,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2374
					 status, link_changed);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2375
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2376
	if (status & (TxOK | TxErr)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2377
		rtl8139_tx_interrupt (dev, tp, ioaddr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2378
		if (status & TxErr)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2379
			RTL_W16 (IntrStatus, TxErr);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2380
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2381
out:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2382
	if (!tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2383
		spin_unlock (&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2384
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2385
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2386
	pr_debug("%s: exiting interrupt, intr_status=%#4.4x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2387
		 dev->name, RTL_R16 (IntrStatus));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2388
	return IRQ_RETVAL(handled);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2389
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2390
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2391
#ifdef CONFIG_NET_POLL_CONTROLLER
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
 * 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
  2394
 * 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
  2395
 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2396
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
  2397
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2398
	disable_irq_nosync(dev->irq);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2399
	rtl8139_interrupt(dev->irq, dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2400
	enable_irq(dev->irq);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2401
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2402
#endif
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
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
  2405
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2406
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2407
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2408
	struct sockaddr *addr = p;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2409
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2410
	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
  2411
		return -EADDRNOTAVAIL;
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
	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
  2414
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2415
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2416
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2417
	RTL_W8_F(Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2418
	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
  2419
	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
  2420
	RTL_W8_F(Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2421
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2422
	spin_unlock_irq(&tp->lock);
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
	return 0;
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2427
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
  2428
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2429
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2430
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2431
	unsigned long flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2432
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2433
	if (tp->ecdev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2434
		/* 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
  2435
		RTL_W8 (ChipCmd, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2436
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2437
		/* Disable interrupts by clearing the interrupt mask. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2438
		RTL_W16 (IntrMask, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2439
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2440
		/* Update the error counts. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2441
		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
  2442
		RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2443
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2444
		netif_stop_queue(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2445
		napi_disable(&tp->napi);
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
		if (netif_msg_ifdown(tp))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2448
			pr_debug("%s: Shutting down ethercard, status was 0x%4.4x.\n",
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2449
				dev->name, RTL_R16 (IntrStatus));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2450
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2451
		spin_lock_irqsave (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2452
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2453
		/* 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
  2454
		RTL_W8 (ChipCmd, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2455
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2456
		/* Disable interrupts by clearing the interrupt mask. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2457
		RTL_W16 (IntrMask, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2458
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2459
		/* Update the error counts. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2460
		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
  2461
		RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2462
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2463
		spin_unlock_irqrestore (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2464
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2465
		free_irq (dev->irq, 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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2468
	rtl8139_tx_clear (tp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2469
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2470
	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
  2471
			  tp->rx_ring, tp->rx_ring_dma);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2472
	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
  2473
			  tp->tx_bufs, tp->tx_bufs_dma);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2474
	tp->rx_ring = NULL;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2475
	tp->tx_bufs = NULL;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2476
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2477
	/* 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
  2478
	RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2479
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2480
	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
  2481
		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
  2482
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2483
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2484
}
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
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2487
/* 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
  2488
   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
  2489
   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
  2490
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
  2491
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2492
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2493
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2494
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2495
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2496
	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
  2497
		u8 cfg3 = RTL_R8 (Config3);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2498
		u8 cfg5 = RTL_R8 (Config5);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2499
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2500
		wol->supported = WAKE_PHY | WAKE_MAGIC
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2501
			| WAKE_UCAST | WAKE_MCAST | WAKE_BCAST;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2502
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2503
		wol->wolopts = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2504
		if (cfg3 & Cfg3_LinkUp)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2505
			wol->wolopts |= WAKE_PHY;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2506
		if (cfg3 & Cfg3_Magic)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2507
			wol->wolopts |= WAKE_MAGIC;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2508
		/* (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
  2509
		   following constants.  */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2510
		if (cfg5 & Cfg5_UWF)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2511
			wol->wolopts |= WAKE_UCAST;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2512
		if (cfg5 & Cfg5_MWF)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2513
			wol->wolopts |= WAKE_MCAST;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2514
		if (cfg5 & Cfg5_BWF)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2515
			wol->wolopts |= WAKE_BCAST;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2516
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2517
	spin_unlock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2518
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2519
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
/* 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
  2522
   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
  2523
   aren't messing with the 8139.  */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2524
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
  2525
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2526
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2527
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2528
	u32 support;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2529
	u8 cfg3, cfg5;
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
	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
  2532
		   ? (WAKE_PHY | WAKE_MAGIC
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2533
		      | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2534
		   : 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2535
	if (wol->wolopts & ~support)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2536
		return -EINVAL;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2537
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2538
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2539
	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
  2540
	if (wol->wolopts & WAKE_PHY)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2541
		cfg3 |= Cfg3_LinkUp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2542
	if (wol->wolopts & WAKE_MAGIC)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2543
		cfg3 |= Cfg3_Magic;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2544
	RTL_W8 (Cfg9346, Cfg9346_Unlock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2545
	RTL_W8 (Config3, cfg3);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2546
	RTL_W8 (Cfg9346, Cfg9346_Lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2547
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2548
	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
  2549
	/* (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
  2550
	   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
  2551
	   documentation.  */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2552
	if (wol->wolopts & WAKE_UCAST)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2553
		cfg5 |= Cfg5_UWF;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2554
	if (wol->wolopts & WAKE_MCAST)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2555
		cfg5 |= Cfg5_MWF;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2556
	if (wol->wolopts & WAKE_BCAST)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2557
		cfg5 |= Cfg5_BWF;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2558
	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
  2559
	spin_unlock_irq(&tp->lock);
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 0;
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
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
  2565
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2566
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2567
	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
  2568
	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
  2569
	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
  2570
	info->regdump_len = tp->regs_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2571
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2572
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2573
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
  2574
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2575
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2576
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2577
	mii_ethtool_gset(&tp->mii, cmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2578
	spin_unlock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2579
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2580
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2581
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2582
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
  2583
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2584
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2585
	int rc;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2586
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2587
	rc = mii_ethtool_sset(&tp->mii, cmd);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2588
	spin_unlock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2589
	return rc;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2590
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2591
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2592
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
  2593
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2594
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2595
	return mii_nway_restart(&tp->mii);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2596
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2597
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2598
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
  2599
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2600
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2601
	return mii_link_ok(&tp->mii);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2602
}
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
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
  2605
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2606
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2607
	return tp->msg_enable;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2608
}
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
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
  2611
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2612
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2613
	tp->msg_enable = datum;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2614
}
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
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
  2617
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2618
	struct rtl8139_private *tp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2619
	/* 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
  2620
	if (use_io)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2621
		return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2622
	tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2623
	return tp->regs_len;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2624
}
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 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
  2627
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2628
	struct rtl8139_private *tp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2629
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2630
	/* 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
  2631
	if (use_io)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2632
		return;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2633
	tp = netdev_priv(dev);
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
	regs->version = RTL_REGS_VER;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2636
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2637
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2638
	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
  2639
	spin_unlock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2640
}
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
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
  2643
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2644
	switch (sset) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2645
	case ETH_SS_STATS:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2646
		return RTL_NUM_STATS;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2647
	default:
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2648
		return -EOPNOTSUPP;
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
}
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
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
  2653
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2654
	struct rtl8139_private *tp = netdev_priv(dev);
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
	data[0] = tp->xstats.early_rx;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2657
	data[1] = tp->xstats.tx_buf_mapped;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2658
	data[2] = tp->xstats.tx_timeouts;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2659
	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
  2660
}
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
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
  2663
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2664
	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
  2665
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2666
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2667
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
  2668
	.get_drvinfo		= rtl8139_get_drvinfo,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2669
	.get_settings		= rtl8139_get_settings,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2670
	.set_settings		= rtl8139_set_settings,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2671
	.get_regs_len		= rtl8139_get_regs_len,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2672
	.get_regs		= rtl8139_get_regs,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2673
	.nway_reset		= rtl8139_nway_reset,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2674
	.get_link		= rtl8139_get_link,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2675
	.get_msglevel		= rtl8139_get_msglevel,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2676
	.set_msglevel		= rtl8139_set_msglevel,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2677
	.get_wol		= rtl8139_get_wol,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2678
	.set_wol		= rtl8139_set_wol,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2679
	.get_strings		= rtl8139_get_strings,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2680
	.get_sset_count		= rtl8139_get_sset_count,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2681
	.get_ethtool_stats	= rtl8139_get_ethtool_stats,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2682
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2683
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2684
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
  2685
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2686
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2687
	int rc;
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
	if (tp->ecdev || !netif_running(dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2690
		return -EINVAL;
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
	spin_lock_irq(&tp->lock);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2693
	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
  2694
	spin_unlock_irq(&tp->lock);
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 rc;
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 struct rtnl_link_stats64 *
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2701
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
  2702
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2703
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2704
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2705
	unsigned long flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2706
	unsigned int start;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2707
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2708
	if (tp->ecdev || netif_running(dev)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2709
		spin_lock_irqsave (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2710
		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
  2711
		RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2712
		spin_unlock_irqrestore (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2713
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2714
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2715
	netdev_stats_to_stats64(stats, &dev->stats);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2716
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2717
	do {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2718
		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
  2719
		stats->rx_packets = tp->rx_stats.packets;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2720
		stats->rx_bytes = tp->rx_stats.bytes;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2721
	} 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
  2722
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2723
	do {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2724
		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
  2725
		stats->tx_packets = tp->tx_stats.packets;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2726
		stats->tx_bytes = tp->tx_stats.bytes;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2727
	} 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
  2728
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2729
	return stats;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2730
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2731
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2732
/* 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
  2733
   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
  2734
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2735
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
  2736
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2737
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2738
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2739
	u32 mc_filter[2];	/* Multicast hash filter */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2740
	int rx_mode;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2741
	u32 tmp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2742
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2743
	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
  2744
		   dev->flags, RTL_R32(RxConfig));
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2745
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2746
	/* 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
  2747
	if (dev->flags & IFF_PROMISC) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2748
		rx_mode =
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2749
		    AcceptBroadcast | AcceptMulticast | AcceptMyPhys |
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2750
		    AcceptAllPhys;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2751
		mc_filter[1] = mc_filter[0] = 0xffffffff;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2752
	} 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
  2753
		   (dev->flags & IFF_ALLMULTI)) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2754
		/* 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
  2755
		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2756
		mc_filter[1] = mc_filter[0] = 0xffffffff;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2757
	} else {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2758
		struct netdev_hw_addr *ha;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2759
		rx_mode = AcceptBroadcast | AcceptMyPhys;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2760
		mc_filter[1] = mc_filter[0] = 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2761
		netdev_for_each_mc_addr(ha, dev) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2762
			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
  2763
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2764
			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
  2765
			rx_mode |= AcceptMulticast;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2766
		}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2767
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2768
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2769
	if (dev->features & NETIF_F_RXALL)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2770
		rx_mode |= (AcceptErr | AcceptRunt);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2771
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2772
	/* 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
  2773
	tmp = rtl8139_rx_config | rx_mode;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2774
	if (tp->rx_config != tmp) {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2775
		RTL_W32_F (RxConfig, tmp);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2776
		tp->rx_config = tmp;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2777
	}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2778
	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
  2779
	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
  2780
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2781
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2782
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
  2783
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2784
	unsigned long flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2785
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2786
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2787
	spin_lock_irqsave (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2788
	__set_rx_mode(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2789
	spin_unlock_irqrestore (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2790
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2791
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2792
#ifdef CONFIG_PM
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2793
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2794
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
  2795
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2796
	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
  2797
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2798
	void __iomem *ioaddr = tp->mmio_addr;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2799
	unsigned long flags;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2800
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2801
	pci_save_state (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2802
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2803
	if (tp->ecdev || !netif_running (dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2804
		return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2805
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2806
	netif_device_detach (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2807
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2808
	spin_lock_irqsave (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2809
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2810
	/* Disable interrupts, stop Tx and Rx. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2811
	RTL_W16 (IntrMask, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2812
	RTL_W8 (ChipCmd, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2813
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2814
	/* Update the error counts. */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2815
	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
  2816
	RTL_W32 (RxMissed, 0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2817
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2818
	spin_unlock_irqrestore (&tp->lock, flags);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2819
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2820
	pci_set_power_state (pdev, PCI_D3hot);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2821
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2822
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2823
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2824
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2825
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2826
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
  2827
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2828
	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
  2829
	struct rtl8139_private *tp = netdev_priv(dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2830
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2831
	pci_restore_state (pdev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2832
	if (tp->ecdev || !netif_running (dev))
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2833
		return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2834
	pci_set_power_state (pdev, PCI_D0);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2835
	rtl8139_init_ring (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2836
	rtl8139_hw_start (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2837
	netif_device_attach (dev);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2838
	return 0;
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2839
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2840
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2841
#endif /* CONFIG_PM */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2842
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2843
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2844
static struct pci_driver rtl8139_pci_driver = {
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2845
	.name		= DRV_NAME,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2846
	.id_table	= rtl8139_pci_tbl,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2847
	.probe		= rtl8139_init_one,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2848
	.remove		= __devexit_p(rtl8139_remove_one),
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2849
#ifdef CONFIG_PM
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2850
	.suspend	= rtl8139_suspend,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2851
	.resume		= rtl8139_resume,
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2852
#endif /* CONFIG_PM */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2853
};
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2854
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2855
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2856
static int __init rtl8139_init_module (void)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2857
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2858
	/* 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
  2859
	 * even if no 8139 board is found.
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2860
	 */
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2861
#ifdef MODULE
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2862
	pr_info(RTL8139_DRIVER_NAME "\n");
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2863
#endif
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2864
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2865
	return pci_register_driver(&rtl8139_pci_driver);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2866
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2867
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2868
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2869
static void __exit rtl8139_cleanup_module (void)
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2870
{
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2871
	pci_unregister_driver (&rtl8139_pci_driver);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2872
}
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2873
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2874
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2875
module_init(rtl8139_init_module);
6ad972f38438 Added 8139too driver for kernel 3.4.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
  2876
module_exit(rtl8139_cleanup_module);