Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (150 commits)
  [PATCH] ipw2100: Update version ipw2100 stamp to 1.2.2
  [PATCH] ipw2100: move mutex.h include from ipw2100.c to ipw2100.h
  [PATCH] ipw2100: semaphore to mutexes conversion
  [PATCH] ipw2100: Fix radiotap code gcc warning
  [PATCH] ipw2100: add radiotap headers to packtes captured in monitor mode
  [PATCH] ipw2x00: expend Copyright to 2006
  [PATCH] drivers/net/wireless/ipw2200.c: fix an array overun
  [PATCH] ieee80211: Don't update network statistics from off-channel packets.
  [PATCH] ipw2200: Update ipw2200 version stamp to 1.1.1
  [PATCH] ipw2200: switch to the new ipw2200-fw-3.0 image format
  [PATCH] ipw2200: wireless extension sensitivity threshold support
  [PATCH] ipw2200: Enables the "slow diversity" algorithm
  [PATCH] ipw2200: Set a meaningful silence threshold value
  [PATCH] ipw2200: export `debug' module param only if CONFIG_IPW2200_DEBUG
  [PATCH] ipw2200: Change debug level for firmware error logging
  [PATCH] ipw2200: Filter unsupported channels out in ad-hoc mode
  [PATCH] ipw2200: Fix ipw_sw_reset() implementation inconsistent with comment
  [PATCH] ipw2200: Fix rf_kill is activated after mode change with 'disable=1'
  [PATCH] ipw2200: remove the WPA card associates to non-WPA AP checking
  [PATCH] ipw2200: Add signal level to iwlist scan output
  ...
This commit is contained in:
Linus Torvalds 2006-03-20 10:30:31 -08:00
commit c7cace6437
156 changed files with 5816 additions and 5303 deletions

View file

@ -9,7 +9,7 @@
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \ kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
procfs-guide.xml writing_usb_driver.xml \ procfs-guide.xml writing_usb_driver.xml \
sis900.xml kernel-api.xml journal-api.xml lsm.xml usb.xml \ kernel-api.xml journal-api.xml lsm.xml usb.xml \
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml
### ###

View file

@ -1,585 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
<book id="SiS900Guide">
<bookinfo>
<title>SiS 900/7016 Fast Ethernet Device Driver</title>
<authorgroup>
<author>
<firstname>Ollie</firstname>
<surname>Lho</surname>
</author>
<author>
<firstname>Lei Chun</firstname>
<surname>Chang</surname>
</author>
</authorgroup>
<edition>Document Revision: 0.3 for SiS900 driver v1.06 &amp; v1.07</edition>
<pubdate>November 16, 2000</pubdate>
<copyright>
<year>1999</year>
<holder>Silicon Integrated System Corp.</holder>
</copyright>
<legalnotice>
<para>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
</para>
<para>
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
</para>
<para>
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
</para>
</legalnotice>
<abstract>
<para>
This document gives some information on installation and usage of SiS 900/7016
device driver under Linux.
</para>
</abstract>
</bookinfo>
<toc></toc>
<chapter id="intro">
<title>Introduction</title>
<para>
This document describes the revision 1.06 and 1.07 of SiS 900/7016 Fast Ethernet
device driver under Linux. The driver is developed by Silicon Integrated
System Corp. and distributed freely under the GNU General Public License (GPL).
The driver can be compiled as a loadable module and used under Linux kernel
version 2.2.x. (rev. 1.06)
With minimal changes, the driver can also be used under 2.3.x and 2.4.x kernel
(rev. 1.07), please see
<xref linkend="install"/>. If you are intended to
use the driver for earlier kernels, you are on your own.
</para>
<para>
The driver is tested with usual TCP/IP applications including
FTP, Telnet, Netscape etc. and is used constantly by the developers.
</para>
<para>
Please send all comments/fixes/questions to
<ulink url="mailto:lcchang@sis.com.tw">Lei-Chun Chang</ulink>.
</para>
</chapter>
<chapter id="changes">
<title>Changes</title>
<para>
Changes made in Revision 1.07
<orderedlist>
<listitem>
<para>
Separation of sis900.c and sis900.h in order to move most
constant definition to sis900.h (many of those constants were
corrected)
</para>
</listitem>
<listitem>
<para>
Clean up PCI detection, the pci-scan from Donald Becker were not used,
just simple pci&lowbar;find&lowbar;*.
</para>
</listitem>
<listitem>
<para>
MII detection is modified to support multiple mii transceiver.
</para>
</listitem>
<listitem>
<para>
Bugs in read&lowbar;eeprom, mdio&lowbar;* were removed.
</para>
</listitem>
<listitem>
<para>
Lot of sis900 irrelevant comments were removed/changed and
more comments were added to reflect the real situation.
</para>
</listitem>
<listitem>
<para>
Clean up of physical/virtual address space mess in buffer
descriptors.
</para>
</listitem>
<listitem>
<para>
Better transmit/receive error handling.
</para>
</listitem>
<listitem>
<para>
The driver now uses zero-copy single buffer management
scheme to improve performance.
</para>
</listitem>
<listitem>
<para>
Names of variables were changed to be more consistent.
</para>
</listitem>
<listitem>
<para>
Clean up of auo-negotiation and timer code.
</para>
</listitem>
<listitem>
<para>
Automatic detection and change of PHY on the fly.
</para>
</listitem>
<listitem>
<para>
Bug in mac probing fixed.
</para>
</listitem>
<listitem>
<para>
Fix 630E equalier problem by modifying the equalizer workaround rule.
</para>
</listitem>
<listitem>
<para>
Support for ICS1893 10/100 Interated PHYceiver.
</para>
</listitem>
<listitem>
<para>
Support for media select by ifconfig.
</para>
</listitem>
<listitem>
<para>
Added kernel-doc extratable documentation.
</para>
</listitem>
</orderedlist>
</para>
</chapter>
<chapter id="tested">
<title>Tested Environment</title>
<para>
This driver is developed on the following hardware
<itemizedlist>
<listitem>
<para>
Intel Celeron 500 with SiS 630 (rev 02) chipset
</para>
</listitem>
<listitem>
<para>
SiS 900 (rev 01) and SiS 7016/7014 Fast Ethernet Card
</para>
</listitem>
</itemizedlist>
and tested with these software environments
<itemizedlist>
<listitem>
<para>
Red Hat Linux version 6.2
</para>
</listitem>
<listitem>
<para>
Linux kernel version 2.4.0
</para>
</listitem>
<listitem>
<para>
Netscape version 4.6
</para>
</listitem>
<listitem>
<para>
NcFTP 3.0.0 beta 18
</para>
</listitem>
<listitem>
<para>
Samba version 2.0.3
</para>
</listitem>
</itemizedlist>
</para>
</chapter>
<chapter id="files">
<title>Files in This Package</title>
<para>
In the package you can find these files:
</para>
<para>
<variablelist>
<varlistentry>
<term>sis900.c</term>
<listitem>
<para>
Driver source file in C
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>sis900.h</term>
<listitem>
<para>
Header file for sis900.c
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>sis900.sgml</term>
<listitem>
<para>
DocBook SGML source of the document
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>sis900.txt</term>
<listitem>
<para>
Driver document in plain text
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</chapter>
<chapter id="install">
<title>Installation</title>
<para>
Silicon Integrated System Corp. is cooperating closely with core Linux Kernel
developers. The revisions of SiS 900 driver are distributed by the usuall channels
for kernel tar files and patches. Those kernel tar files for official kernel and
patches for kernel pre-release can be download at
<ulink url="http://ftp.kernel.org/pub/linux/kernel/">official kernel ftp site</ulink>
and its mirrors.
The 1.06 revision can be found in kernel version later than 2.3.15 and pre-2.2.14,
and 1.07 revision can be found in kernel version 2.4.0.
If you have no prior experience in networking under Linux, please read
<ulink url="http://www.tldp.org/">Ethernet HOWTO</ulink> and
<ulink url="http://www.tldp.org/">Networking HOWTO</ulink> available from
Linux Documentation Project (LDP).
</para>
<para>
The driver is bundled in release later than 2.2.11 and 2.3.15 so this
is the most easy case.
Be sure you have the appropriate packages for compiling kernel source.
Those packages are listed in Document/Changes in kernel source
distribution. If you have to install the driver other than those bundled
in kernel release, you should have your driver file
<filename>sis900.c</filename> and <filename>sis900.h</filename>
copied into <filename class="directory">/usr/src/linux/drivers/net/</filename> first.
There are two alternative ways to install the driver
</para>
<sect1>
<title>Building the driver as loadable module</title>
<para>
To build the driver as a loadable kernel module you have to reconfigure
the kernel to activate network support by
</para>
<para><screen>
make menuconfig
</screen></para>
<para>
Choose <quote>Loadable module support ---></quote>,
then select <quote>Enable loadable module support</quote>.
</para>
<para>
Choose <quote>Network Device Support ---></quote>, select
<quote>Ethernet (10 or 100Mbit)</quote>.
Then select <quote>EISA, VLB, PCI and on board controllers</quote>,
and choose <quote>SiS 900/7016 PCI Fast Ethernet Adapter support</quote>
to <quote>M</quote>.
</para>
<para>
After reconfiguring the kernel, you can make the driver module by
</para>
<para><screen>
make modules
</screen></para>
<para>
The driver should be compiled with no errors. After compiling the driver,
the driver can be installed to proper place by
</para>
<para><screen>
make modules_install
</screen></para>
<para>
Load the driver into kernel by
</para>
<para><screen>
insmod sis900
</screen></para>
<para>
When loading the driver into memory, some information message can be view by
</para>
<para>
<screen>
dmesg
</screen>
or
<screen>
cat /var/log/message
</screen>
</para>
<para>
If the driver is loaded properly you will have messages similar to this:
</para>
<para><screen>
sis900.c: v1.07.06 11/07/2000
eth0: SiS 900 PCI Fast Ethernet at 0xd000, IRQ 10, 00:00:e8:83:7f:a4.
eth0: SiS 900 Internal MII PHY transceiver found at address 1.
eth0: Using SiS 900 Internal MII PHY as default
</screen></para>
<para>
showing the version of the driver and the results of probing routine.
</para>
<para>
Once the driver is loaded, network can be brought up by
</para>
<para><screen>
/sbin/ifconfig eth0 IPADDR broadcast BROADCAST netmask NETMASK media TYPE
</screen></para>
<para>
where IPADDR, BROADCAST, NETMASK are your IP address, broadcast address and
netmask respectively. TYPE is used to set medium type used by the device.
Typical values are "10baseT"(twisted-pair 10Mbps Ethernet) or "100baseT"
(twisted-pair 100Mbps Ethernet). For more information on how to configure
network interface, please refer to
<ulink url="http://www.tldp.org/">Networking HOWTO</ulink>.
</para>
<para>
The link status is also shown by kernel messages. For example, after the
network interface is activated, you may have the message:
</para>
<para><screen>
eth0: Media Link On 100mbps full-duplex
</screen></para>
<para>
If you try to unplug the twist pair (TP) cable you will get
</para>
<para><screen>
eth0: Media Link Off
</screen></para>
<para>
indicating that the link is failed.
</para>
</sect1>
<sect1>
<title>Building the driver into kernel</title>
<para>
If you want to make the driver into kernel, choose <quote>Y</quote>
rather than <quote>M</quote> on
<quote>SiS 900/7016 PCI Fast Ethernet Adapter support</quote>
when configuring the kernel. Build the kernel image in the usual way
</para>
<para><screen>
make clean
make bzlilo
</screen></para>
<para>
Next time the system reboot, you have the driver in memory.
</para>
</sect1>
</chapter>
<chapter id="problems">
<title>Known Problems and Bugs</title>
<para>
There are some known problems and bugs. If you find any other bugs please
mail to <ulink url="mailto:lcchang@sis.com.tw">lcchang@sis.com.tw</ulink>
<orderedlist>
<listitem>
<para>
AM79C901 HomePNA PHY is not thoroughly tested, there may be some
bugs in the <quote>on the fly</quote> change of transceiver.
</para>
</listitem>
<listitem>
<para>
A bug is hidden somewhere in the receive buffer management code,
the bug causes NULL pointer reference in the kernel. This fault is
caught before bad things happen and reported with the message:
<computeroutput>
eth0: NULL pointer encountered in Rx ring, skipping
</computeroutput>
which can be viewed with <literal remap="tt">dmesg</literal> or
<literal remap="tt">cat /var/log/message</literal>.
</para>
</listitem>
<listitem>
<para>
The media type change from 10Mbps to 100Mbps twisted-pair ethernet
by ifconfig causes the media link down.
</para>
</listitem>
</orderedlist>
</para>
</chapter>
<chapter id="RHistory">
<title>Revision History</title>
<para>
<itemizedlist>
<listitem>
<para>
November 13, 2000, Revision 1.07, seventh release, 630E problem fixed
and further clean up.
</para>
</listitem>
<listitem>
<para>
November 4, 1999, Revision 1.06, Second release, lots of clean up
and optimization.
</para>
</listitem>
<listitem>
<para>
August 8, 1999, Revision 1.05, Initial Public Release
</para>
</listitem>
</itemizedlist>
</para>
</chapter>
<chapter id="acknowledgements">
<title>Acknowledgements</title>
<para>
This driver was originally derived form
<ulink url="mailto:becker@cesdis1.gsfc.nasa.gov">Donald Becker</ulink>'s
<ulink url="ftp://cesdis.gsfc.nasa.gov/pub/linux/drivers/kern-2.3/pci-skeleton.c"
>pci-skeleton</ulink> and
<ulink url="ftp://cesdis.gsfc.nasa.gov/pub/linux/drivers/kern-2.3/rtl8139.c"
>rtl8139</ulink> drivers. Donald also provided various suggestion
regarded with improvements made in revision 1.06.
</para>
<para>
The 1.05 revision was created by
<ulink url="mailto:cmhuang@sis.com.tw">Jim Huang</ulink>, AMD 79c901
support was added by <ulink url="mailto:lcs@sis.com.tw">Chin-Shan Li</ulink>.
</para>
</chapter>
<chapter id="functions">
<title>List of Functions</title>
!Idrivers/net/sis900.c
</chapter>
</book>

View file

@ -151,6 +151,13 @@ Who: Ralf Baechle <ralf@linux-mips.org>
--------------------------- ---------------------------
What: eepro100 network driver
When: January 2007
Why: replaced by the e100 driver
Who: Adrian Bunk <bunk@stusta.de>
---------------------------
What: Legacy /proc/pci interface (PCI_LEGACY_PROC) What: Legacy /proc/pci interface (PCI_LEGACY_PROC)
When: March 2006 When: March 2006
Why: deprecated since 2.5.53 in favor of lspci(8) Why: deprecated since 2.5.53 in favor of lspci(8)

View file

@ -92,8 +92,6 @@ routing.txt
- the new routing mechanism - the new routing mechanism
shaper.txt shaper.txt
- info on the module that can shape/limit transmitted traffic. - info on the module that can shape/limit transmitted traffic.
sis900.txt
- SiS 900/7016 Fast Ethernet device driver info.
sk98lin.txt sk98lin.txt
- Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit - Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit
Ethernet Adapter family driver info Ethernet Adapter family driver info

View file

@ -3,18 +3,18 @@ Intel(R) PRO/Wireless 2100 Driver for Linux in support of:
Intel(R) PRO/Wireless 2100 Network Connection Intel(R) PRO/Wireless 2100 Network Connection
Copyright (C) 2003-2005, Intel Corporation Copyright (C) 2003-2006, Intel Corporation
README.ipw2100 README.ipw2100
Version: 1.1.3 Version: git-1.1.5
Date : October 17, 2005 Date : January 25, 2006
Index Index
----------------------------------------------- -----------------------------------------------
0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER 0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
1. Introduction 1. Introduction
2. Release 1.1.3 Current Features 2. Release git-1.1.5 Current Features
3. Command Line Parameters 3. Command Line Parameters
4. Sysfs Helper Files 4. Sysfs Helper Files
5. Radio Kill Switch 5. Radio Kill Switch
@ -89,7 +89,7 @@ potential fixes and patches, as well as links to the development mailing list
for the driver project. for the driver project.
2. Release 1.1.3 Current Supported Features 2. Release git-1.1.5 Current Supported Features
----------------------------------------------- -----------------------------------------------
- Managed (BSS) and Ad-Hoc (IBSS) - Managed (BSS) and Ad-Hoc (IBSS)
- WEP (shared key and open) - WEP (shared key and open)
@ -270,7 +270,7 @@ For installation support on the ipw2100 1.1.0 driver on Linux kernels
9. License 9. License
----------------------------------------------- -----------------------------------------------
Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License (version 2) as under the terms of the GNU General Public License (version 2) as

View file

@ -10,7 +10,7 @@ both hardware adapters listed above. In this document the Intel(R)
PRO/Wireless 2915ABG Driver for Linux will be used to reference the PRO/Wireless 2915ABG Driver for Linux will be used to reference the
unified driver. unified driver.
Copyright (C) 2004-2005, Intel Corporation Copyright (C) 2004-2006, Intel Corporation
README.ipw2200 README.ipw2200
@ -26,9 +26,11 @@ Index
1.2. Module parameters 1.2. Module parameters
1.3. Wireless Extension Private Methods 1.3. Wireless Extension Private Methods
1.4. Sysfs Helper Files 1.4. Sysfs Helper Files
1.5. Supported channels
2. Ad-Hoc Networking 2. Ad-Hoc Networking
3. Interacting with Wireless Tools 3. Interacting with Wireless Tools
3.1. iwconfig mode 3.1. iwconfig mode
3.2. iwconfig sens
4. About the Version Numbers 4. About the Version Numbers
5. Firmware installation 5. Firmware installation
6. Support 6. Support
@ -314,6 +316,35 @@ For the device level files, see /sys/bus/pci/drivers/ipw2200:
running ifconfig and is therefore disabled by default. running ifconfig and is therefore disabled by default.
1.5. Supported channels
-----------------------------------------------
Upon loading the Intel(R) PRO/Wireless 2915ABG Driver for Linux, a
message stating the detected geography code and the number of 802.11
channels supported by the card will be displayed in the log.
The geography code corresponds to a regulatory domain as shown in the
table below.
Supported channels
Code Geography 802.11bg 802.11a
--- Restricted 11 0
ZZF Custom US/Canada 11 8
ZZD Rest of World 13 0
ZZA Custom USA & Europe & High 11 13
ZZB Custom NA & Europe 11 13
ZZC Custom Japan 11 4
ZZM Custom 11 0
ZZE Europe 13 19
ZZJ Custom Japan 14 4
ZZR Rest of World 14 0
ZZH High Band 13 4
ZZG Custom Europe 13 4
ZZK Europe 13 24
ZZL Europe 11 13
2. Ad-Hoc Networking 2. Ad-Hoc Networking
----------------------------------------------- -----------------------------------------------
@ -353,6 +384,15 @@ When configuring the mode of the adapter, all run-time configured parameters
are reset to the value used when the module was loaded. This includes are reset to the value used when the module was loaded. This includes
channels, rates, ESSID, etc. channels, rates, ESSID, etc.
3.2 iwconfig sens
-----------------------------------------------
The 'iwconfig ethX sens XX' command will not set the signal sensitivity
threshold, as described in iwconfig documentation, but rather the number
of consecutive missed beacons that will trigger handover, i.e. roaming
to another access point. At the same time, it will set the disassociation
threshold to 3 times the given value.
4. About the Version Numbers 4. About the Version Numbers
----------------------------------------------- -----------------------------------------------
@ -408,7 +448,7 @@ For general information and support, go to:
7. License 7. License
----------------------------------------------- -----------------------------------------------
Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved. Copyright(c) 2003 - 2006 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 as under the terms of the GNU General Public License version 2 as

View file

@ -1,257 +0,0 @@
SiS 900/7016 Fast Ethernet Device Driver
Ollie Lho
Lei Chun Chang
Copyright © 1999 by Silicon Integrated System Corp.
This document gives some information on installation and usage of SiS
900/7016 device driver under Linux.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
_________________________________________________________________
Table of Contents
1. Introduction
2. Changes
3. Tested Environment
4. Files in This Package
5. Installation
Building the driver as loadable module
Building the driver into kernel
6. Known Problems and Bugs
7. Revision History
8. Acknowledgements
_________________________________________________________________
Chapter 1. Introduction
This document describes the revision 1.06 and 1.07 of SiS 900/7016
Fast Ethernet device driver under Linux. The driver is developed by
Silicon Integrated System Corp. and distributed freely under the GNU
General Public License (GPL). The driver can be compiled as a loadable
module and used under Linux kernel version 2.2.x. (rev. 1.06) With
minimal changes, the driver can also be used under 2.3.x and 2.4.x
kernel (rev. 1.07), please see Chapter 5. If you are intended to use
the driver for earlier kernels, you are on your own.
The driver is tested with usual TCP/IP applications including FTP,
Telnet, Netscape etc. and is used constantly by the developers.
Please send all comments/fixes/questions to Lei-Chun Chang.
_________________________________________________________________
Chapter 2. Changes
Changes made in Revision 1.07
1. Separation of sis900.c and sis900.h in order to move most constant
definition to sis900.h (many of those constants were corrected)
2. Clean up PCI detection, the pci-scan from Donald Becker were not
used, just simple pci_find_*.
3. MII detection is modified to support multiple mii transceiver.
4. Bugs in read_eeprom, mdio_* were removed.
5. Lot of sis900 irrelevant comments were removed/changed and more
comments were added to reflect the real situation.
6. Clean up of physical/virtual address space mess in buffer
descriptors.
7. Better transmit/receive error handling.
8. The driver now uses zero-copy single buffer management scheme to
improve performance.
9. Names of variables were changed to be more consistent.
10. Clean up of auo-negotiation and timer code.
11. Automatic detection and change of PHY on the fly.
12. Bug in mac probing fixed.
13. Fix 630E equalier problem by modifying the equalizer workaround
rule.
14. Support for ICS1893 10/100 Interated PHYceiver.
15. Support for media select by ifconfig.
16. Added kernel-doc extratable documentation.
_________________________________________________________________
Chapter 3. Tested Environment
This driver is developed on the following hardware
* Intel Celeron 500 with SiS 630 (rev 02) chipset
* SiS 900 (rev 01) and SiS 7016/7014 Fast Ethernet Card
and tested with these software environments
* Red Hat Linux version 6.2
* Linux kernel version 2.4.0
* Netscape version 4.6
* NcFTP 3.0.0 beta 18
* Samba version 2.0.3
_________________________________________________________________
Chapter 4. Files in This Package
In the package you can find these files:
sis900.c
Driver source file in C
sis900.h
Header file for sis900.c
sis900.sgml
DocBook SGML source of the document
sis900.txt
Driver document in plain text
_________________________________________________________________
Chapter 5. Installation
Silicon Integrated System Corp. is cooperating closely with core Linux
Kernel developers. The revisions of SiS 900 driver are distributed by
the usuall channels for kernel tar files and patches. Those kernel tar
files for official kernel and patches for kernel pre-release can be
download at official kernel ftp site and its mirrors. The 1.06
revision can be found in kernel version later than 2.3.15 and
pre-2.2.14, and 1.07 revision can be found in kernel version 2.4.0. If
you have no prior experience in networking under Linux, please read
Ethernet HOWTO and Networking HOWTO available from Linux Documentation
Project (LDP).
The driver is bundled in release later than 2.2.11 and 2.3.15 so this
is the most easy case. Be sure you have the appropriate packages for
compiling kernel source. Those packages are listed in Document/Changes
in kernel source distribution. If you have to install the driver other
than those bundled in kernel release, you should have your driver file
sis900.c and sis900.h copied into /usr/src/linux/drivers/net/ first.
There are two alternative ways to install the driver
_________________________________________________________________
Building the driver as loadable module
To build the driver as a loadable kernel module you have to
reconfigure the kernel to activate network support by
make menuconfig
Choose "Loadable module support --->", then select "Enable loadable
module support".
Choose "Network Device Support --->", select "Ethernet (10 or
100Mbit)". Then select "EISA, VLB, PCI and on board controllers", and
choose "SiS 900/7016 PCI Fast Ethernet Adapter support" to "M".
After reconfiguring the kernel, you can make the driver module by
make modules
The driver should be compiled with no errors. After compiling the
driver, the driver can be installed to proper place by
make modules_install
Load the driver into kernel by
insmod sis900
When loading the driver into memory, some information message can be
view by
dmesg
or
cat /var/log/message
If the driver is loaded properly you will have messages similar to
this:
sis900.c: v1.07.06 11/07/2000
eth0: SiS 900 PCI Fast Ethernet at 0xd000, IRQ 10, 00:00:e8:83:7f:a4.
eth0: SiS 900 Internal MII PHY transceiver found at address 1.
eth0: Using SiS 900 Internal MII PHY as default
showing the version of the driver and the results of probing routine.
Once the driver is loaded, network can be brought up by
/sbin/ifconfig eth0 IPADDR broadcast BROADCAST netmask NETMASK media TYPE
where IPADDR, BROADCAST, NETMASK are your IP address, broadcast
address and netmask respectively. TYPE is used to set medium type used
by the device. Typical values are "10baseT"(twisted-pair 10Mbps
Ethernet) or "100baseT" (twisted-pair 100Mbps Ethernet). For more
information on how to configure network interface, please refer to
Networking HOWTO.
The link status is also shown by kernel messages. For example, after
the network interface is activated, you may have the message:
eth0: Media Link On 100mbps full-duplex
If you try to unplug the twist pair (TP) cable you will get
eth0: Media Link Off
indicating that the link is failed.
_________________________________________________________________
Building the driver into kernel
If you want to make the driver into kernel, choose "Y" rather than "M"
on "SiS 900/7016 PCI Fast Ethernet Adapter support" when configuring
the kernel. Build the kernel image in the usual way
make clean
make bzlilo
Next time the system reboot, you have the driver in memory.
_________________________________________________________________
Chapter 6. Known Problems and Bugs
There are some known problems and bugs. If you find any other bugs
please mail to lcchang@sis.com.tw
1. AM79C901 HomePNA PHY is not thoroughly tested, there may be some
bugs in the "on the fly" change of transceiver.
2. A bug is hidden somewhere in the receive buffer management code,
the bug causes NULL pointer reference in the kernel. This fault is
caught before bad things happen and reported with the message:
eth0: NULL pointer encountered in Rx ring, skipping which can be
viewed with dmesg or cat /var/log/message.
3. The media type change from 10Mbps to 100Mbps twisted-pair ethernet
by ifconfig causes the media link down.
_________________________________________________________________
Chapter 7. Revision History
* November 13, 2000, Revision 1.07, seventh release, 630E problem
fixed and further clean up.
* November 4, 1999, Revision 1.06, Second release, lots of clean up
and optimization.
* August 8, 1999, Revision 1.05, Initial Public Release
_________________________________________________________________
Chapter 8. Acknowledgements
This driver was originally derived form Donald Becker's pci-skeleton
and rtl8139 drivers. Donald also provided various suggestion regarded
with improvements made in revision 1.06.
The 1.05 revision was created by Jim Huang, AMD 79c901 support was
added by Chin-Shan Li.

View file

@ -319,11 +319,10 @@ static void __init hdpu_fixup_eth_pdata(struct platform_device *pd)
struct mv643xx_eth_platform_data *eth_pd; struct mv643xx_eth_platform_data *eth_pd;
eth_pd = pd->dev.platform_data; eth_pd = pd->dev.platform_data;
eth_pd->port_serial_control =
mv64x60_read(&bh, MV643XX_ETH_PORT_SERIAL_CONTROL_REG(pd->id) & ~1);
eth_pd->force_phy_addr = 1; eth_pd->force_phy_addr = 1;
eth_pd->phy_addr = pd->id; eth_pd->phy_addr = pd->id;
eth_pd->speed = SPEED_100;
eth_pd->duplex = DUPLEX_FULL;
eth_pd->tx_queue_size = 400; eth_pd->tx_queue_size = 400;
eth_pd->rx_queue_size = 800; eth_pd->rx_queue_size = 800;
} }

View file

@ -100,6 +100,10 @@ static int max_interrupt_work = 10;
static char versionA[] __initdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n"; static char versionA[] __initdata = DRV_NAME ".c:" DRV_VERSION " " DRV_RELDATE " becker@scyld.com\n";
static char versionB[] __initdata = "http://www.scyld.com/network/3c509.html\n"; static char versionB[] __initdata = "http://www.scyld.com/network/3c509.html\n";
#if defined(CONFIG_PM) && (defined(CONFIG_MCA) || defined(CONFIG_EISA))
#define EL3_SUSPEND
#endif
#ifdef EL3_DEBUG #ifdef EL3_DEBUG
static int el3_debug = EL3_DEBUG; static int el3_debug = EL3_DEBUG;
#else #else
@ -174,9 +178,6 @@ struct el3_private {
/* skb send-queue */ /* skb send-queue */
int head, size; int head, size;
struct sk_buff *queue[SKB_QUEUE_SIZE]; struct sk_buff *queue[SKB_QUEUE_SIZE];
#ifdef CONFIG_PM_LEGACY
struct pm_dev *pmdev;
#endif
enum { enum {
EL3_MCA, EL3_MCA,
EL3_PNP, EL3_PNP,
@ -201,11 +202,15 @@ static void el3_tx_timeout (struct net_device *dev);
static void el3_down(struct net_device *dev); static void el3_down(struct net_device *dev);
static void el3_up(struct net_device *dev); static void el3_up(struct net_device *dev);
static struct ethtool_ops ethtool_ops; static struct ethtool_ops ethtool_ops;
#ifdef CONFIG_PM_LEGACY #ifdef EL3_SUSPEND
static int el3_suspend(struct pm_dev *pdev); static int el3_suspend(struct device *, pm_message_t);
static int el3_resume(struct pm_dev *pdev); static int el3_resume(struct device *);
static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data); #else
#define el3_suspend NULL
#define el3_resume NULL
#endif #endif
/* generic device remove for all device types */ /* generic device remove for all device types */
#if defined(CONFIG_EISA) || defined(CONFIG_MCA) #if defined(CONFIG_EISA) || defined(CONFIG_MCA)
static int el3_device_remove (struct device *device); static int el3_device_remove (struct device *device);
@ -229,7 +234,9 @@ static struct eisa_driver el3_eisa_driver = {
.driver = { .driver = {
.name = "3c509", .name = "3c509",
.probe = el3_eisa_probe, .probe = el3_eisa_probe,
.remove = __devexit_p (el3_device_remove) .remove = __devexit_p (el3_device_remove),
.suspend = el3_suspend,
.resume = el3_resume,
} }
}; };
#endif #endif
@ -262,6 +269,8 @@ static struct mca_driver el3_mca_driver = {
.bus = &mca_bus_type, .bus = &mca_bus_type,
.probe = el3_mca_probe, .probe = el3_mca_probe,
.remove = __devexit_p(el3_device_remove), .remove = __devexit_p(el3_device_remove),
.suspend = el3_suspend,
.resume = el3_resume,
}, },
}; };
#endif /* CONFIG_MCA */ #endif /* CONFIG_MCA */
@ -362,10 +371,6 @@ static void el3_common_remove (struct net_device *dev)
struct el3_private *lp = netdev_priv(dev); struct el3_private *lp = netdev_priv(dev);
(void) lp; /* Keep gcc quiet... */ (void) lp; /* Keep gcc quiet... */
#ifdef CONFIG_PM_LEGACY
if (lp->pmdev)
pm_unregister(lp->pmdev);
#endif
#if defined(__ISAPNP__) #if defined(__ISAPNP__)
if (lp->type == EL3_PNP) if (lp->type == EL3_PNP)
pnp_device_detach(to_pnp_dev(lp->dev)); pnp_device_detach(to_pnp_dev(lp->dev));
@ -572,16 +577,6 @@ no_pnp:
if (err) if (err)
goto out1; goto out1;
#ifdef CONFIG_PM_LEGACY
/* register power management */
lp->pmdev = pm_register(PM_ISA_DEV, card_idx, el3_pm_callback);
if (lp->pmdev) {
struct pm_dev *p;
p = lp->pmdev;
p->data = (struct net_device *)dev;
}
#endif
el3_cards++; el3_cards++;
lp->next_dev = el3_root_dev; lp->next_dev = el3_root_dev;
el3_root_dev = dev; el3_root_dev = dev;
@ -1480,20 +1475,17 @@ el3_up(struct net_device *dev)
} }
/* Power Management support functions */ /* Power Management support functions */
#ifdef CONFIG_PM_LEGACY #ifdef EL3_SUSPEND
static int static int
el3_suspend(struct pm_dev *pdev) el3_suspend(struct device *pdev, pm_message_t state)
{ {
unsigned long flags; unsigned long flags;
struct net_device *dev; struct net_device *dev;
struct el3_private *lp; struct el3_private *lp;
int ioaddr; int ioaddr;
if (!pdev && !pdev->data) dev = pdev->driver_data;
return -EINVAL;
dev = (struct net_device *)pdev->data;
lp = netdev_priv(dev); lp = netdev_priv(dev);
ioaddr = dev->base_addr; ioaddr = dev->base_addr;
@ -1510,17 +1502,14 @@ el3_suspend(struct pm_dev *pdev)
} }
static int static int
el3_resume(struct pm_dev *pdev) el3_resume(struct device *pdev)
{ {
unsigned long flags; unsigned long flags;
struct net_device *dev; struct net_device *dev;
struct el3_private *lp; struct el3_private *lp;
int ioaddr; int ioaddr;
if (!pdev && !pdev->data) dev = pdev->driver_data;
return -EINVAL;
dev = (struct net_device *)pdev->data;
lp = netdev_priv(dev); lp = netdev_priv(dev);
ioaddr = dev->base_addr; ioaddr = dev->base_addr;
@ -1536,20 +1525,7 @@ el3_resume(struct pm_dev *pdev)
return 0; return 0;
} }
static int #endif /* EL3_SUSPEND */
el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data)
{
switch (rqst) {
case PM_SUSPEND:
return el3_suspend(pdev);
case PM_RESUME:
return el3_resume(pdev);
}
return 0;
}
#endif /* CONFIG_PM_LEGACY */
/* Parameters that may be passed into the module. */ /* Parameters that may be passed into the module. */
static int debug = -1; static int debug = -1;

View file

@ -105,6 +105,7 @@
#include <linux/mca-legacy.h> #include <linux/mca-legacy.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/processor.h> #include <asm/processor.h>
@ -658,7 +659,7 @@ static int init586(struct net_device *dev)
s = jiffies; /* warning: only active with interrupts on !! */ s = jiffies; /* warning: only active with interrupts on !! */
while (!(cfg_cmd->cmd_status & STAT_COMPL)) { while (!(cfg_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
@ -684,7 +685,7 @@ static int init586(struct net_device *dev)
s = jiffies; s = jiffies;
while (!(ias_cmd->cmd_status & STAT_COMPL)) { while (!(ias_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
@ -709,7 +710,7 @@ static int init586(struct net_device *dev)
s = jiffies; s = jiffies;
while (!(tdr_cmd->cmd_status & STAT_COMPL)) { while (!(tdr_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) { if (time_after(jiffies, s + 30*HZ/100)) {
printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__); printk(KERN_WARNING "%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
result = 1; result = 1;
break; break;
@ -798,7 +799,7 @@ static int init586(struct net_device *dev)
elmc_id_attn586(); elmc_id_attn586();
s = jiffies; s = jiffies;
while (!(mc_cmd->cmd_status & STAT_COMPL)) { while (!(mc_cmd->cmd_status & STAT_COMPL)) {
if (jiffies - s > 30*HZ/100) if (time_after(jiffies, s + 30*HZ/100))
break; break;
} }
if (!(mc_cmd->cmd_status & STAT_COMPL)) { if (!(mc_cmd->cmd_status & STAT_COMPL)) {

View file

@ -258,6 +258,7 @@ static int vortex_debug = 1;
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/eisa.h> #include <linux/eisa.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/irq.h> /* For NR_IRQS only. */ #include <asm/irq.h> /* For NR_IRQS only. */
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -841,7 +842,7 @@ enum xcvr_types {
XCVR_100baseFx, XCVR_MII=6, XCVR_NWAY=8, XCVR_ExtMII=9, XCVR_Default=10, XCVR_100baseFx, XCVR_MII=6, XCVR_NWAY=8, XCVR_ExtMII=9, XCVR_Default=10,
}; };
static struct media_table { static const struct media_table {
char *name; char *name;
unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */ unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */
mask:8, /* The transceiver-present bit in Wn3_Config.*/ mask:8, /* The transceiver-present bit in Wn3_Config.*/
@ -1445,7 +1446,7 @@ static int __devinit vortex_probe1(struct device *gendev,
} }
{ {
static const char * ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; static const char * const ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
unsigned int config; unsigned int config;
EL3WINDOW(3); EL3WINDOW(3);
vp->available_media = ioread16(ioaddr + Wn3_Options); vp->available_media = ioread16(ioaddr + Wn3_Options);
@ -2724,7 +2725,7 @@ boomerang_rx(struct net_device *dev)
skb = dev_alloc_skb(PKT_BUF_SZ); skb = dev_alloc_skb(PKT_BUF_SZ);
if (skb == NULL) { if (skb == NULL) {
static unsigned long last_jif; static unsigned long last_jif;
if ((jiffies - last_jif) > 10 * HZ) { if (time_after(jiffies, last_jif + 10 * HZ)) {
printk(KERN_WARNING "%s: memory shortage\n", dev->name); printk(KERN_WARNING "%s: memory shortage\n", dev->name);
last_jif = jiffies; last_jif = jiffies;
} }

View file

@ -29,7 +29,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/irq.h> #include <asm/irq.h>
/* Used for the temporal inet entries and routing */ /* Used for the temporal inet entries and routing */
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/bitops.h> #include <linux/bitops.h>

View file

@ -1276,7 +1276,7 @@ static int cp_change_mtu(struct net_device *dev, int new_mtu)
} }
#endif /* BROKEN */ #endif /* BROKEN */
static char mii_2_8139_map[8] = { static const char mii_2_8139_map[8] = {
BasicModeCtrl, BasicModeCtrl,
BasicModeStatus, BasicModeStatus,
0, 0,

View file

@ -229,7 +229,7 @@ typedef enum {
/* indexed by board_t, above */ /* indexed by board_t, above */
static struct { static const struct {
const char *name; const char *name;
u32 hw_flags; u32 hw_flags;
} board_info[] __devinitdata = { } board_info[] __devinitdata = {
@ -1192,7 +1192,7 @@ static int __devinit read_eeprom (void __iomem *ioaddr, int location, int addr_l
#define mdio_delay() RTL_R8(Config4) #define mdio_delay() RTL_R8(Config4)
static char mii_2_8139_map[8] = { static const char mii_2_8139_map[8] = {
BasicModeCtrl, BasicModeCtrl,
BasicModeStatus, BasicModeStatus,
0, 0,

View file

@ -614,7 +614,7 @@ static void rebuild_rx_bufs(struct net_device *dev)
static int init_i596_mem(struct net_device *dev) static int init_i596_mem(struct net_device *dev)
{ {
struct i596_private *lp = dev->priv; struct i596_private *lp = dev->priv;
#if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) #if !defined(ENABLE_MVME16x_NET) && !defined(ENABLE_BVME6000_NET) || defined(ENABLE_APRICOT)
short ioaddr = dev->base_addr; short ioaddr = dev->base_addr;
#endif #endif
unsigned long flags; unsigned long flags;

View file

@ -66,7 +66,7 @@ config BONDING
'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux. 'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux.
The driver supports multiple bonding modes to allow for both high The driver supports multiple bonding modes to allow for both high
perfomance and high availability operation. performance and high availability operation.
Refer to <file:Documentation/networking/bonding.txt> for more Refer to <file:Documentation/networking/bonding.txt> for more
information. information.
@ -698,8 +698,8 @@ config VORTEX
depends on NET_VENDOR_3COM && (PCI || EISA) depends on NET_VENDOR_3COM && (PCI || EISA)
select MII select MII
---help--- ---help---
This option enables driver support for a large number of 10mbps and This option enables driver support for a large number of 10Mbps and
10/100mbps EISA, PCI and PCMCIA 3Com network cards: 10/100Mbps EISA, PCI and PCMCIA 3Com network cards:
"Vortex" (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI "Vortex" (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI
"Boomerang" (EtherLink XL 3c900 or 3c905) PCI "Boomerang" (EtherLink XL 3c900 or 3c905) PCI
@ -1021,7 +1021,7 @@ config EEXPRESS_PRO
depends on NET_ISA depends on NET_ISA
---help--- ---help---
If you have a network (Ethernet) card of this type, say Y. This If you have a network (Ethernet) card of this type, say Y. This
driver supports intel i82595{FX,TX} based boards. Note however driver supports Intel i82595{FX,TX} based boards. Note however
that the EtherExpress PRO/100 Ethernet card has its own separate that the EtherExpress PRO/100 Ethernet card has its own separate
driver. Please read the Ethernet-HOWTO, available from driver. Please read the Ethernet-HOWTO, available from
<http://www.tldp.org/docs.html#howto>. <http://www.tldp.org/docs.html#howto>.
@ -1208,7 +1208,7 @@ config IBM_EMAC_RX_SKB_HEADROOM
help help
Additional receive skb headroom. Note, that driver Additional receive skb headroom. Note, that driver
will always reserve at least 2 bytes to make IP header will always reserve at least 2 bytes to make IP header
aligned, so usualy there is no need to add any additional aligned, so usually there is no need to add any additional
headroom. headroom.
If unsure, set to 0. If unsure, set to 0.
@ -1372,8 +1372,8 @@ config B44
called b44. called b44.
config FORCEDETH config FORCEDETH
tristate "Reverse Engineered nForce Ethernet support (EXPERIMENTAL)" tristate "nForce Ethernet support"
depends on NET_PCI && PCI && EXPERIMENTAL depends on NET_PCI && PCI
help help
If you have a network (Ethernet) controller of this type, say Y and If you have a network (Ethernet) controller of this type, say Y and
read the Ethernet-HOWTO, available from read the Ethernet-HOWTO, available from
@ -1614,11 +1614,7 @@ config SIS900
---help--- ---help---
This is a driver for the Fast Ethernet PCI network cards based on This is a driver for the Fast Ethernet PCI network cards based on
the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
SiS 630 and SiS 540 chipsets. If you have one of those, say Y and SiS 630 and SiS 540 chipsets.
read the Ethernet-HOWTO, available at
<http://www.tldp.org/docs.html#howto>. Please read
<file:Documentation/networking/sis900.txt> and comments at the
beginning of <file:drivers/net/sis900.c> for more information.
This driver also supports AMD 79C901 HomePNA so that you can use This driver also supports AMD 79C901 HomePNA so that you can use
your phone line as a network cable. your phone line as a network cable.
@ -1934,7 +1930,7 @@ config MYRI_SBUS
will be called myri_sbus. This is recommended. will be called myri_sbus. This is recommended.
config NS83820 config NS83820
tristate "National Semiconduct DP83820 support" tristate "National Semiconductor DP83820 support"
depends on PCI depends on PCI
help help
This is a driver for the National Semiconductor DP83820 series This is a driver for the National Semiconductor DP83820 series
@ -2195,6 +2191,7 @@ config GFAR_NAPI
config MV643XX_ETH config MV643XX_ETH
tristate "MV-643XX Ethernet support" tristate "MV-643XX Ethernet support"
depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || PPC_MULTIPLATFORM depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || PPC_MULTIPLATFORM
select MII
help help
This driver supports the gigabit Ethernet on the Marvell MV643XX This driver supports the gigabit Ethernet on the Marvell MV643XX
chipset which is used in the Momenco Ocelot C and Jaguar ATX and chipset which is used in the Momenco Ocelot C and Jaguar ATX and
@ -2514,7 +2511,7 @@ config PPP_FILTER
Say Y here if you want to be able to filter the packets passing over Say Y here if you want to be able to filter the packets passing over
PPP interfaces. This allows you to control which packets count as PPP interfaces. This allows you to control which packets count as
activity (i.e. which packets will reset the idle timer or bring up activity (i.e. which packets will reset the idle timer or bring up
a demand-dialled link) and which packets are to be dropped entirely. a demand-dialed link) and which packets are to be dropped entirely.
You need to say Y here if you wish to use the pass-filter and You need to say Y here if you wish to use the pass-filter and
active-filter options to pppd. active-filter options to pppd.
@ -2702,8 +2699,8 @@ config SHAPER
<file:Documentation/networking/shaper.txt> for more information. <file:Documentation/networking/shaper.txt> for more information.
An alternative to this traffic shaper is the experimental An alternative to this traffic shaper is the experimental
Class-Based Queueing (CBQ) scheduling support which you get if you Class-Based Queuing (CBQ) scheduling support which you get if you
say Y to "QoS and/or fair queueing" above. say Y to "QoS and/or fair queuing" above.
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called shaper. If unsure, say N. will be called shaper. If unsure, say N.

View file

@ -36,6 +36,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -216,7 +217,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
while ((inb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0) while ((inb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(" not found (no reset ack).\n"); printk(" not found (no reset ack).\n");
return -ENODEV; return -ENODEV;
} }
@ -382,7 +383,7 @@ apne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0) while ((inb(NE_BASE+NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk("%s: ne_reset_8390() did not complete.\n", dev->name); printk("%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -530,7 +531,7 @@ apne_block_output(struct net_device *dev, int count,
dma_start = jiffies; dma_start = jiffies;
while ((inb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0) while ((inb(NE_BASE + NE_EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
apne_reset_8390(dev); apne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View file

@ -68,10 +68,10 @@ config ARCNET_CAP
packet is stuffed with an extra 4 byte "cookie" which doesn't packet is stuffed with an extra 4 byte "cookie" which doesn't
actually appear on the network. After transmit the driver will send actually appear on the network. After transmit the driver will send
back a packet with protocol byte 0 containing the status of the back a packet with protocol byte 0 containing the status of the
transmition: transmission:
0=no hardware acknowledge 0=no hardware acknowledge
1=excessive nak 1=excessive nak
2=transmition accepted by the reciever hardware 2=transmission accepted by the receiver hardware
Received packets are also stuffed with the extra 4 bytes but it will Received packets are also stuffed with the extra 4 bytes but it will
be random data. be random data.

View file

@ -42,7 +42,7 @@ static int build_header(struct sk_buff *skb, struct net_device *dev,
static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length, static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
struct ArcProto rawmode_proto = static struct ArcProto rawmode_proto =
{ {
.suffix = 'r', .suffix = 'r',
.mtu = XMTU, .mtu = XMTU,

View file

@ -97,25 +97,44 @@ static int __init arcrimi_probe(struct net_device *dev)
"must specify the shmem and irq!\n"); "must specify the shmem and irq!\n");
return -ENODEV; return -ENODEV;
} }
if (dev->dev_addr[0] == 0) {
BUGMSG(D_NORMAL, "You need to specify your card's station "
"ID!\n");
return -ENODEV;
}
/* /*
* Grab the memory region at mem_start for BUFFER_SIZE bytes. * Grab the memory region at mem_start for MIRROR_SIZE bytes.
* Later in arcrimi_found() the real size will be determined * Later in arcrimi_found() the real size will be determined
* and this reserve will be released and the correct size * and this reserve will be released and the correct size
* will be taken. * will be taken.
*/ */
if (!request_mem_region(dev->mem_start, BUFFER_SIZE, "arcnet (90xx)")) { if (!request_mem_region(dev->mem_start, MIRROR_SIZE, "arcnet (90xx)")) {
BUGMSG(D_NORMAL, "Card memory already allocated\n"); BUGMSG(D_NORMAL, "Card memory already allocated\n");
return -ENODEV; return -ENODEV;
} }
if (dev->dev_addr[0] == 0) {
release_mem_region(dev->mem_start, BUFFER_SIZE);
BUGMSG(D_NORMAL, "You need to specify your card's station "
"ID!\n");
return -ENODEV;
}
return arcrimi_found(dev); return arcrimi_found(dev);
} }
static int check_mirror(unsigned long addr, size_t size)
{
void __iomem *p;
int res = -1;
if (!request_mem_region(addr, size, "arcnet (90xx)"))
return -1;
p = ioremap(addr, size);
if (p) {
if (readb(p) == TESTvalue)
res = 1;
else
res = 0;
iounmap(p);
}
release_mem_region(addr, size);
return res;
}
/* /*
* Set up the struct net_device associated with this card. Called after * Set up the struct net_device associated with this card. Called after
@ -125,19 +144,28 @@ static int __init arcrimi_found(struct net_device *dev)
{ {
struct arcnet_local *lp; struct arcnet_local *lp;
unsigned long first_mirror, last_mirror, shmem; unsigned long first_mirror, last_mirror, shmem;
void __iomem *p;
int mirror_size; int mirror_size;
int err; int err;
p = ioremap(dev->mem_start, MIRROR_SIZE);
if (!p) {
release_mem_region(dev->mem_start, MIRROR_SIZE);
BUGMSG(D_NORMAL, "Can't ioremap\n");
return -ENODEV;
}
/* reserve the irq */ /* reserve the irq */
if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) { if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev)) {
release_mem_region(dev->mem_start, BUFFER_SIZE); iounmap(p);
release_mem_region(dev->mem_start, MIRROR_SIZE);
BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq); BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
return -ENODEV; return -ENODEV;
} }
shmem = dev->mem_start; shmem = dev->mem_start;
isa_writeb(TESTvalue, shmem); writeb(TESTvalue, p);
isa_writeb(dev->dev_addr[0], shmem + 1); /* actually the node ID */ writeb(dev->dev_addr[0], p + 1); /* actually the node ID */
/* find the real shared memory start/end points, including mirrors */ /* find the real shared memory start/end points, including mirrors */
@ -146,17 +174,18 @@ static int __init arcrimi_found(struct net_device *dev)
* 2k (or there are no mirrors at all) but on some, it's 4k. * 2k (or there are no mirrors at all) but on some, it's 4k.
*/ */
mirror_size = MIRROR_SIZE; mirror_size = MIRROR_SIZE;
if (isa_readb(shmem) == TESTvalue if (readb(p) == TESTvalue
&& isa_readb(shmem - mirror_size) != TESTvalue && check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue) && check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
mirror_size *= 2; mirror_size = 2 * MIRROR_SIZE;
first_mirror = last_mirror = shmem; first_mirror = shmem - mirror_size;
while (isa_readb(first_mirror) == TESTvalue) while (check_mirror(first_mirror, mirror_size) == 1)
first_mirror -= mirror_size; first_mirror -= mirror_size;
first_mirror += mirror_size; first_mirror += mirror_size;
while (isa_readb(last_mirror) == TESTvalue) last_mirror = shmem + mirror_size;
while (check_mirror(last_mirror, mirror_size) == 1)
last_mirror += mirror_size; last_mirror += mirror_size;
last_mirror -= mirror_size; last_mirror -= mirror_size;
@ -181,7 +210,8 @@ static int __init arcrimi_found(struct net_device *dev)
* with the correct size. There is a VERY slim chance this could * with the correct size. There is a VERY slim chance this could
* fail. * fail.
*/ */
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
if (!request_mem_region(dev->mem_start, if (!request_mem_region(dev->mem_start,
dev->mem_end - dev->mem_start + 1, dev->mem_end - dev->mem_start + 1,
"arcnet (90xx)")) { "arcnet (90xx)")) {

View file

@ -52,6 +52,7 @@
#include <net/arp.h> #include <net/arp.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/arcdevice.h> #include <linux/arcdevice.h>
#include <linux/jiffies.h>
/* "do nothing" functions for protocol drivers */ /* "do nothing" functions for protocol drivers */
static void null_rx(struct net_device *dev, int bufnum, static void null_rx(struct net_device *dev, int bufnum,
@ -61,6 +62,7 @@ static int null_build_header(struct sk_buff *skb, struct net_device *dev,
static int null_prepare_tx(struct net_device *dev, struct archdr *pkt, static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
int length, int bufnum); int length, int bufnum);
static void arcnet_rx(struct net_device *dev, int bufnum);
/* /*
* one ArcProto per possible proto ID. None of the elements of * one ArcProto per possible proto ID. None of the elements of
@ -71,7 +73,7 @@ static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
struct ArcProto *arc_proto_map[256], *arc_proto_default, struct ArcProto *arc_proto_map[256], *arc_proto_default,
*arc_bcast_proto, *arc_raw_proto; *arc_bcast_proto, *arc_raw_proto;
struct ArcProto arc_proto_null = static struct ArcProto arc_proto_null =
{ {
.suffix = '?', .suffix = '?',
.mtu = XMTU, .mtu = XMTU,
@ -90,7 +92,6 @@ EXPORT_SYMBOL(arc_proto_map);
EXPORT_SYMBOL(arc_proto_default); EXPORT_SYMBOL(arc_proto_default);
EXPORT_SYMBOL(arc_bcast_proto); EXPORT_SYMBOL(arc_bcast_proto);
EXPORT_SYMBOL(arc_raw_proto); EXPORT_SYMBOL(arc_raw_proto);
EXPORT_SYMBOL(arc_proto_null);
EXPORT_SYMBOL(arcnet_unregister_proto); EXPORT_SYMBOL(arcnet_unregister_proto);
EXPORT_SYMBOL(arcnet_debug); EXPORT_SYMBOL(arcnet_debug);
EXPORT_SYMBOL(alloc_arcdev); EXPORT_SYMBOL(alloc_arcdev);
@ -118,7 +119,7 @@ static int __init arcnet_init(void)
arcnet_debug = debug; arcnet_debug = debug;
printk(VERSION); printk("arcnet loaded.\n");
#ifdef ALPHA_WARNING #ifdef ALPHA_WARNING
BUGLVL(D_EXTRA) { BUGLVL(D_EXTRA) {
@ -178,8 +179,8 @@ EXPORT_SYMBOL(arcnet_dump_skb);
* Dump the contents of an ARCnet buffer * Dump the contents of an ARCnet buffer
*/ */
#if (ARCNET_DEBUG_MAX & (D_RX | D_TX)) #if (ARCNET_DEBUG_MAX & (D_RX | D_TX))
void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc, static void arcnet_dump_packet(struct net_device *dev, int bufnum,
int take_arcnet_lock) char *desc, int take_arcnet_lock)
{ {
struct arcnet_local *lp = dev->priv; struct arcnet_local *lp = dev->priv;
int i, length; int i, length;
@ -208,7 +209,10 @@ void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc,
} }
EXPORT_SYMBOL(arcnet_dump_packet); #else
#define arcnet_dump_packet(dev, bufnum, desc,take_arcnet_lock) do { } while (0)
#endif #endif
@ -733,7 +737,7 @@ static void arcnet_timeout(struct net_device *dev)
spin_unlock_irqrestore(&lp->lock, flags); spin_unlock_irqrestore(&lp->lock, flags);
if (jiffies - lp->last_timeout > 10*HZ) { if (time_after(jiffies, lp->last_timeout + 10*HZ)) {
BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n", BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n",
msg, status, lp->intmask, lp->lasttrans_dest); msg, status, lp->intmask, lp->lasttrans_dest);
lp->last_timeout = jiffies; lp->last_timeout = jiffies;
@ -996,7 +1000,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
* This is a generic packet receiver that calls arcnet??_rx depending on the * This is a generic packet receiver that calls arcnet??_rx depending on the
* protocol ID found. * protocol ID found.
*/ */
void arcnet_rx(struct net_device *dev, int bufnum) static void arcnet_rx(struct net_device *dev, int bufnum)
{ {
struct arcnet_local *lp = dev->priv; struct arcnet_local *lp = dev->priv;
struct archdr pkt; struct archdr pkt;

View file

@ -53,7 +53,7 @@
/* Internal function declarations */ /* Internal function declarations */
static int com90xx_found(int ioaddr, int airq, u_long shmem); static int com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *);
static void com90xx_command(struct net_device *dev, int command); static void com90xx_command(struct net_device *dev, int command);
static int com90xx_status(struct net_device *dev); static int com90xx_status(struct net_device *dev);
static void com90xx_setmask(struct net_device *dev, int mask); static void com90xx_setmask(struct net_device *dev, int mask);
@ -116,14 +116,26 @@ static void __init com90xx_probe(void)
unsigned long airqmask; unsigned long airqmask;
int ports[(0x3f0 - 0x200) / 16 + 1] = int ports[(0x3f0 - 0x200) / 16 + 1] =
{0}; {0};
u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] = unsigned long *shmems;
{0}; void __iomem **iomem;
int numports, numshmems, *port; int numports, numshmems, *port;
u_long *p; u_long *p;
int index;
if (!io && !irq && !shmem && !*device && com90xx_skip_probe) if (!io && !irq && !shmem && !*device && com90xx_skip_probe)
return; return;
shmems = kzalloc(((0x10000-0xa0000) / 0x800) * sizeof(unsigned long),
GFP_KERNEL);
if (!shmems)
return;
iomem = kzalloc(((0x10000-0xa0000) / 0x800) * sizeof(void __iomem *),
GFP_KERNEL);
if (!iomem) {
kfree(shmems);
return;
}
BUGLVL(D_NORMAL) printk(VERSION); BUGLVL(D_NORMAL) printk(VERSION);
/* set up the arrays where we'll store the possible probe addresses */ /* set up the arrays where we'll store the possible probe addresses */
@ -179,6 +191,8 @@ static void __init com90xx_probe(void)
if (!numports) { if (!numports) {
BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n"); BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
kfree(shmems);
kfree(iomem);
return; return;
} }
/* Stage 2: we have now reset any possible ARCnet cards, so we can't /* Stage 2: we have now reset any possible ARCnet cards, so we can't
@ -202,8 +216,8 @@ static void __init com90xx_probe(void)
* 0xD1 byte in the right place, or are read-only. * 0xD1 byte in the right place, or are read-only.
*/ */
numprint = -1; numprint = -1;
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0, p = &shmems[0]; index < numshmems; p++, index++) {
u_long ptr = *p; void __iomem *base;
numprint++; numprint++;
numprint %= 8; numprint %= 8;
@ -213,38 +227,49 @@ static void __init com90xx_probe(void)
} }
BUGMSG2(D_INIT, "%lXh ", *p); BUGMSG2(D_INIT, "%lXh ", *p);
if (!request_mem_region(*p, BUFFER_SIZE, "arcnet (90xx)")) { if (!request_mem_region(*p, MIRROR_SIZE, "arcnet (90xx)")) {
BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n"); BUGMSG2(D_INIT_REASONS, "(request_mem_region)\n");
BUGMSG2(D_INIT_REASONS, "Stage 3: "); BUGMSG2(D_INIT_REASONS, "Stage 3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
*p-- = shmems[--numshmems]; goto out;
continue;
} }
if (isa_readb(ptr) != TESTvalue) { base = ioremap(*p, MIRROR_SIZE);
if (!base) {
BUGMSG2(D_INIT_REASONS, "(ioremap)\n");
BUGMSG2(D_INIT_REASONS, "Stage 3: ");
BUGLVL(D_INIT_REASONS) numprint = 0;
goto out1;
}
if (readb(base) != TESTvalue) {
BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n", BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n",
isa_readb(ptr), TESTvalue); readb(base), TESTvalue);
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
release_mem_region(*p, BUFFER_SIZE); goto out2;
*p-- = shmems[--numshmems];
continue;
} }
/* By writing 0x42 to the TESTvalue location, we also make /* By writing 0x42 to the TESTvalue location, we also make
* sure no "mirror" shmem areas show up - if they occur * sure no "mirror" shmem areas show up - if they occur
* in another pass through this loop, they will be discarded * in another pass through this loop, they will be discarded
* because *cptr != TESTvalue. * because *cptr != TESTvalue.
*/ */
isa_writeb(0x42, ptr); writeb(0x42, base);
if (isa_readb(ptr) != 0x42) { if (readb(base) != 0x42) {
BUGMSG2(D_INIT_REASONS, "(read only)\n"); BUGMSG2(D_INIT_REASONS, "(read only)\n");
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
release_mem_region(*p, BUFFER_SIZE); goto out2;
*p-- = shmems[--numshmems];
continue;
} }
BUGMSG2(D_INIT_REASONS, "\n"); BUGMSG2(D_INIT_REASONS, "\n");
BUGMSG2(D_INIT_REASONS, "S3: "); BUGMSG2(D_INIT_REASONS, "S3: ");
BUGLVL(D_INIT_REASONS) numprint = 0; BUGLVL(D_INIT_REASONS) numprint = 0;
iomem[index] = base;
continue;
out2:
iounmap(base);
out1:
release_mem_region(*p, MIRROR_SIZE);
out:
*p-- = shmems[--numshmems];
index--;
} }
BUGMSG2(D_INIT, "\n"); BUGMSG2(D_INIT, "\n");
@ -252,6 +277,8 @@ static void __init com90xx_probe(void)
BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n"); BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
for (port = &ports[0]; port < ports + numports; port++) for (port = &ports[0]; port < ports + numports; port++)
release_region(*port, ARCNET_TOTAL_SIZE); release_region(*port, ARCNET_TOTAL_SIZE);
kfree(shmems);
kfree(iomem);
return; return;
} }
/* Stage 4: something of a dummy, to report the shmems that are /* Stage 4: something of a dummy, to report the shmems that are
@ -351,30 +378,32 @@ static void __init com90xx_probe(void)
mdelay(RESETtime); mdelay(RESETtime);
} else { } else {
/* just one shmem and port, assume they match */ /* just one shmem and port, assume they match */
isa_writeb(TESTvalue, shmems[0]); writeb(TESTvalue, iomem[0]);
} }
#else #else
inb(_RESET); inb(_RESET);
mdelay(RESETtime); mdelay(RESETtime);
#endif #endif
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0; index < numshmems; index++) {
u_long ptr = *p; u_long ptr = shmems[index];
void __iomem *base = iomem[index];
if (isa_readb(ptr) == TESTvalue) { /* found one */ if (readb(base) == TESTvalue) { /* found one */
BUGMSG2(D_INIT, "%lXh)\n", *p); BUGMSG2(D_INIT, "%lXh)\n", *p);
openparen = 0; openparen = 0;
/* register the card */ /* register the card */
if (com90xx_found(*port, airq, *p) == 0) if (com90xx_found(*port, airq, ptr, base) == 0)
found = 1; found = 1;
numprint = -1; numprint = -1;
/* remove shmem from the list */ /* remove shmem from the list */
*p = shmems[--numshmems]; shmems[index] = shmems[--numshmems];
iomem[index] = iomem[numshmems];
break; /* go to the next I/O port */ break; /* go to the next I/O port */
} else { } else {
BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr)); BUGMSG2(D_INIT_REASONS, "%Xh-", readb(base));
} }
} }
@ -391,17 +420,40 @@ static void __init com90xx_probe(void)
BUGLVL(D_INIT_REASONS) printk("\n"); BUGLVL(D_INIT_REASONS) printk("\n");
/* Now put back TESTvalue on all leftover shmems. */ /* Now put back TESTvalue on all leftover shmems. */
for (p = &shmems[0]; p < shmems + numshmems; p++) { for (index = 0; index < numshmems; index++) {
isa_writeb(TESTvalue, *p); writeb(TESTvalue, iomem[index]);
release_mem_region(*p, BUFFER_SIZE); iounmap(iomem[index]);
release_mem_region(shmems[index], MIRROR_SIZE);
} }
kfree(shmems);
kfree(iomem);
} }
static int check_mirror(unsigned long addr, size_t size)
{
void __iomem *p;
int res = -1;
if (!request_mem_region(addr, size, "arcnet (90xx)"))
return -1;
p = ioremap(addr, size);
if (p) {
if (readb(p) == TESTvalue)
res = 1;
else
res = 0;
iounmap(p);
}
release_mem_region(addr, size);
return res;
}
/* Set up the struct net_device associated with this card. Called after /* Set up the struct net_device associated with this card. Called after
* probing succeeds. * probing succeeds.
*/ */
static int __init com90xx_found(int ioaddr, int airq, u_long shmem) static int __init com90xx_found(int ioaddr, int airq, u_long shmem, void __iomem *p)
{ {
struct net_device *dev = NULL; struct net_device *dev = NULL;
struct arcnet_local *lp; struct arcnet_local *lp;
@ -412,7 +464,8 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
dev = alloc_arcdev(device); dev = alloc_arcdev(device);
if (!dev) { if (!dev) {
BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n"); BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n");
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
return -ENOMEM; return -ENOMEM;
} }
lp = dev->priv; lp = dev->priv;
@ -423,24 +476,27 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
* 2k (or there are no mirrors at all) but on some, it's 4k. * 2k (or there are no mirrors at all) but on some, it's 4k.
*/ */
mirror_size = MIRROR_SIZE; mirror_size = MIRROR_SIZE;
if (isa_readb(shmem) == TESTvalue if (readb(p) == TESTvalue &&
&& isa_readb(shmem - mirror_size) != TESTvalue check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 &&
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue) check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
mirror_size *= 2; mirror_size = 2 * MIRROR_SIZE;
first_mirror = last_mirror = shmem; first_mirror = shmem - mirror_size;
while (isa_readb(first_mirror) == TESTvalue) while (check_mirror(first_mirror, mirror_size) == 1)
first_mirror -= mirror_size; first_mirror -= mirror_size;
first_mirror += mirror_size; first_mirror += mirror_size;
while (isa_readb(last_mirror) == TESTvalue) last_mirror = shmem + mirror_size;
while (check_mirror(last_mirror, mirror_size) == 1)
last_mirror += mirror_size; last_mirror += mirror_size;
last_mirror -= mirror_size; last_mirror -= mirror_size;
dev->mem_start = first_mirror; dev->mem_start = first_mirror;
dev->mem_end = last_mirror + MIRROR_SIZE - 1; dev->mem_end = last_mirror + MIRROR_SIZE - 1;
release_mem_region(shmem, BUFFER_SIZE); iounmap(p);
release_mem_region(shmem, MIRROR_SIZE);
if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)")) if (!request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)"))
goto err_free_dev; goto err_free_dev;

View file

@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
struct ArcProto rfc1051_proto = static struct ArcProto rfc1051_proto =
{ {
.suffix = 's', .suffix = 's',
.mtu = XMTU - RFC1051_HDR_SIZE, .mtu = XMTU - RFC1051_HDR_SIZE,

View file

@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
int bufnum); int bufnum);
static int continue_tx(struct net_device *dev, int bufnum); static int continue_tx(struct net_device *dev, int bufnum);
struct ArcProto rfc1201_proto = static struct ArcProto rfc1201_proto =
{ {
.suffix = 'a', .suffix = 'a',
.mtu = 1500, /* could be more, but some receivers can't handle it... */ .mtu = 1500, /* could be more, but some receivers can't handle it... */

View file

@ -46,6 +46,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/ecard.h> #include <asm/ecard.h>
@ -355,7 +356,7 @@ etherh_block_output (struct net_device *dev, int count, const unsigned char *buf
dma_start = jiffies; dma_start = jiffies;
while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0) while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_ERR "%s: timeout waiting for TX RDC\n", printk(KERN_ERR "%s: timeout waiting for TX RDC\n",
dev->name); dev->name);
etherh_reset (dev); etherh_reset (dev);

View file

@ -46,7 +46,7 @@ typedef enum {
} board_t; } board_t;
/* indexed by board_t, above */ /* indexed by board_t, above */
static struct { static const struct {
char *name; char *name;
} board_info[] __devinitdata = { } board_info[] __devinitdata = {
{ "Broadcom NetXtreme II BCM5706 1000Base-T" }, { "Broadcom NetXtreme II BCM5706 1000Base-T" },
@ -3476,7 +3476,7 @@ bnx2_test_registers(struct bnx2 *bp)
{ {
int ret; int ret;
int i; int i;
static struct { static const struct {
u16 offset; u16 offset;
u16 flags; u16 flags;
u32 rw_mask; u32 rw_mask;
@ -3891,7 +3891,7 @@ reg_test_err:
static int static int
bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size) bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size)
{ {
static u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555, static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555,
0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa }; 0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa };
int i; int i;
@ -3916,7 +3916,7 @@ bnx2_test_memory(struct bnx2 *bp)
{ {
int ret = 0; int ret = 0;
int i; int i;
static struct { static const struct {
u32 offset; u32 offset;
u32 len; u32 len;
} mem_tbl[] = { } mem_tbl[] = {
@ -5122,7 +5122,7 @@ static struct {
#define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4) #define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4)
static unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = {
STATS_OFFSET32(stat_IfHCInOctets_hi), STATS_OFFSET32(stat_IfHCInOctets_hi),
STATS_OFFSET32(stat_IfHCInBadOctets_hi), STATS_OFFSET32(stat_IfHCInBadOctets_hi),
STATS_OFFSET32(stat_IfHCOutOctets_hi), STATS_OFFSET32(stat_IfHCOutOctets_hi),

View file

@ -14,20 +14,20 @@
* accompanying it. * accompanying it.
*/ */
static int bnx2_COM_b06FwReleaseMajor = 0x1; static const int bnx2_COM_b06FwReleaseMajor = 0x1;
static int bnx2_COM_b06FwReleaseMinor = 0x0; static const int bnx2_COM_b06FwReleaseMinor = 0x0;
static int bnx2_COM_b06FwReleaseFix = 0x0; static const int bnx2_COM_b06FwReleaseFix = 0x0;
static u32 bnx2_COM_b06FwStartAddr = 0x080008b4; static const u32 bnx2_COM_b06FwStartAddr = 0x080008b4;
static u32 bnx2_COM_b06FwTextAddr = 0x08000000; static const u32 bnx2_COM_b06FwTextAddr = 0x08000000;
static int bnx2_COM_b06FwTextLen = 0x57bc; static const int bnx2_COM_b06FwTextLen = 0x57bc;
static u32 bnx2_COM_b06FwDataAddr = 0x08005840; static const u32 bnx2_COM_b06FwDataAddr = 0x08005840;
static int bnx2_COM_b06FwDataLen = 0x0; static const int bnx2_COM_b06FwDataLen = 0x0;
static u32 bnx2_COM_b06FwRodataAddr = 0x080057c0; static const u32 bnx2_COM_b06FwRodataAddr = 0x080057c0;
static int bnx2_COM_b06FwRodataLen = 0x58; static const int bnx2_COM_b06FwRodataLen = 0x58;
static u32 bnx2_COM_b06FwBssAddr = 0x08005860; static const u32 bnx2_COM_b06FwBssAddr = 0x08005860;
static int bnx2_COM_b06FwBssLen = 0x88; static const int bnx2_COM_b06FwBssLen = 0x88;
static u32 bnx2_COM_b06FwSbssAddr = 0x08005840; static const u32 bnx2_COM_b06FwSbssAddr = 0x08005840;
static int bnx2_COM_b06FwSbssLen = 0x1c; static const int bnx2_COM_b06FwSbssLen = 0x1c;
static u32 bnx2_COM_b06FwText[(0x57bc/4) + 1] = { static u32 bnx2_COM_b06FwText[(0x57bc/4) + 1] = {
0x0a00022d, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x322e352e, 0x0a00022d, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x322e352e,
0x38000000, 0x02050802, 0x00000000, 0x00000003, 0x00000014, 0x00000032, 0x38000000, 0x02050802, 0x00000000, 0x00000003, 0x00000014, 0x00000032,
@ -2325,20 +2325,20 @@ static u32 bnx2_rv2p_proc2[] = {
0x0000000c, 0x29520000, 0x00000018, 0x80000002, 0x0000000c, 0x29800000, 0x0000000c, 0x29520000, 0x00000018, 0x80000002, 0x0000000c, 0x29800000,
0x00000018, 0x00570000 }; 0x00000018, 0x00570000 };
static int bnx2_TPAT_b06FwReleaseMajor = 0x1; static const int bnx2_TPAT_b06FwReleaseMajor = 0x1;
static int bnx2_TPAT_b06FwReleaseMinor = 0x0; static const int bnx2_TPAT_b06FwReleaseMinor = 0x0;
static int bnx2_TPAT_b06FwReleaseFix = 0x0; static const int bnx2_TPAT_b06FwReleaseFix = 0x0;
static u32 bnx2_TPAT_b06FwStartAddr = 0x08000860; static const u32 bnx2_TPAT_b06FwStartAddr = 0x08000860;
static u32 bnx2_TPAT_b06FwTextAddr = 0x08000800; static const u32 bnx2_TPAT_b06FwTextAddr = 0x08000800;
static int bnx2_TPAT_b06FwTextLen = 0x122c; static const int bnx2_TPAT_b06FwTextLen = 0x122c;
static u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60; static const u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60;
static int bnx2_TPAT_b06FwDataLen = 0x0; static const int bnx2_TPAT_b06FwDataLen = 0x0;
static u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000; static const u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000;
static int bnx2_TPAT_b06FwRodataLen = 0x0; static const int bnx2_TPAT_b06FwRodataLen = 0x0;
static u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0; static const u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0;
static int bnx2_TPAT_b06FwBssLen = 0x250; static const int bnx2_TPAT_b06FwBssLen = 0x250;
static u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60; static const u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60;
static int bnx2_TPAT_b06FwSbssLen = 0x34; static const int bnx2_TPAT_b06FwSbssLen = 0x34;
static u32 bnx2_TPAT_b06FwText[(0x122c/4) + 1] = { static u32 bnx2_TPAT_b06FwText[(0x122c/4) + 1] = {
0x0a000218, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20322e35, 0x0a000218, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20322e35,
0x2e313100, 0x02050b01, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x2e313100, 0x02050b01, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
@ -2540,20 +2540,20 @@ static u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 };
static u32 bnx2_TPAT_b06FwBss[(0x250/4) + 1] = { 0x0 }; static u32 bnx2_TPAT_b06FwBss[(0x250/4) + 1] = { 0x0 };
static u32 bnx2_TPAT_b06FwSbss[(0x34/4) + 1] = { 0x0 }; static u32 bnx2_TPAT_b06FwSbss[(0x34/4) + 1] = { 0x0 };
static int bnx2_TXP_b06FwReleaseMajor = 0x1; static const int bnx2_TXP_b06FwReleaseMajor = 0x1;
static int bnx2_TXP_b06FwReleaseMinor = 0x0; static const int bnx2_TXP_b06FwReleaseMinor = 0x0;
static int bnx2_TXP_b06FwReleaseFix = 0x0; static const int bnx2_TXP_b06FwReleaseFix = 0x0;
static u32 bnx2_TXP_b06FwStartAddr = 0x080034b0; static const u32 bnx2_TXP_b06FwStartAddr = 0x080034b0;
static u32 bnx2_TXP_b06FwTextAddr = 0x08000000; static const u32 bnx2_TXP_b06FwTextAddr = 0x08000000;
static int bnx2_TXP_b06FwTextLen = 0x5748; static const int bnx2_TXP_b06FwTextLen = 0x5748;
static u32 bnx2_TXP_b06FwDataAddr = 0x08005760; static const u32 bnx2_TXP_b06FwDataAddr = 0x08005760;
static int bnx2_TXP_b06FwDataLen = 0x0; static const int bnx2_TXP_b06FwDataLen = 0x0;
static u32 bnx2_TXP_b06FwRodataAddr = 0x00000000; static const u32 bnx2_TXP_b06FwRodataAddr = 0x00000000;
static int bnx2_TXP_b06FwRodataLen = 0x0; static const int bnx2_TXP_b06FwRodataLen = 0x0;
static u32 bnx2_TXP_b06FwBssAddr = 0x080057a0; static const u32 bnx2_TXP_b06FwBssAddr = 0x080057a0;
static int bnx2_TXP_b06FwBssLen = 0x1c4; static const int bnx2_TXP_b06FwBssLen = 0x1c4;
static u32 bnx2_TXP_b06FwSbssAddr = 0x08005760; static const u32 bnx2_TXP_b06FwSbssAddr = 0x08005760;
static int bnx2_TXP_b06FwSbssLen = 0x38; static const int bnx2_TXP_b06FwSbssLen = 0x38;
static u32 bnx2_TXP_b06FwText[(0x5748/4) + 1] = { static u32 bnx2_TXP_b06FwText[(0x5748/4) + 1] = {
0x0a000d2c, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x322e352e, 0x0a000d2c, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x322e352e,
0x38000000, 0x02050800, 0x0000000a, 0x000003e8, 0x0000ea60, 0x00000000, 0x38000000, 0x02050800, 0x0000000a, 0x000003e8, 0x0000ea60, 0x00000000,

View file

@ -1261,7 +1261,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
struct ethhdr *eth_data; struct ethhdr *eth_data;
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond)); struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
struct slave *tx_slave = NULL; struct slave *tx_slave = NULL;
static u32 ip_bcast = 0xffffffff; static const u32 ip_bcast = 0xffffffff;
int hash_size = 0; int hash_size = 0;
int do_tx_balance = 1; int do_tx_balance = 1;
u32 hash_index = 0; u32 hash_index = 0;

View file

@ -131,7 +131,7 @@ MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form");
/*----------------------------- Global variables ----------------------------*/ /*----------------------------- Global variables ----------------------------*/
static const char *version = static const char * const version =
DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n"; DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n";
LIST_HEAD(bond_dev_list); LIST_HEAD(bond_dev_list);
@ -1040,6 +1040,10 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
if ((bond->params.mode == BOND_MODE_TLB) || if ((bond->params.mode == BOND_MODE_TLB) ||
(bond->params.mode == BOND_MODE_ALB)) { (bond->params.mode == BOND_MODE_ALB)) {
bond_alb_handle_active_change(bond, new_active); bond_alb_handle_active_change(bond, new_active);
if (old_active)
bond_set_slave_inactive_flags(old_active);
if (new_active)
bond_set_slave_active_flags(new_active);
} else { } else {
bond->curr_active_slave = new_active; bond->curr_active_slave = new_active;
} }
@ -1443,15 +1447,16 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
switch (bond->params.mode) { switch (bond->params.mode) {
case BOND_MODE_ACTIVEBACKUP: case BOND_MODE_ACTIVEBACKUP:
/* if we're in active-backup mode, we need one and only one active /* if we're in active-backup mode, we need one and
* interface. The backup interfaces will have their NOARP flag set * only one active interface. The backup interfaces
* because we need them to be completely deaf and not to respond to * will have their SLAVE_INACTIVE flag set because we
* any ARP request on the network to avoid fooling a switch. Thus, * need them to be drop all packets. Thus, since we
* since we guarantee that curr_active_slave always point to the last * guarantee that curr_active_slave always point to
* usable interface, we just have to verify this interface's flag. * the last usable interface, we just have to verify
* this interface's flag.
*/ */
if (((!bond->curr_active_slave) || if (((!bond->curr_active_slave) ||
(bond->curr_active_slave->dev->flags & IFF_NOARP)) && (bond->curr_active_slave->dev->priv_flags & IFF_SLAVE_INACTIVE)) &&
(new_slave->link != BOND_LINK_DOWN)) { (new_slave->link != BOND_LINK_DOWN)) {
dprintk("This is the first active slave\n"); dprintk("This is the first active slave\n");
/* first slave or no active slave yet, and this link /* first slave or no active slave yet, and this link
@ -1492,6 +1497,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
* is OK, so make this interface the active one * is OK, so make this interface the active one
*/ */
bond_change_active_slave(bond, new_slave); bond_change_active_slave(bond, new_slave);
} else {
bond_set_slave_inactive_flags(new_slave);
} }
break; break;
default: default:
@ -1724,13 +1731,8 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
addr.sa_family = slave_dev->type; addr.sa_family = slave_dev->type;
dev_set_mac_address(slave_dev, &addr); dev_set_mac_address(slave_dev, &addr);
/* restore the original state of the slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB |
* IFF_NOARP flag that might have been IFF_SLAVE_INACTIVE);
* set by bond_set_slave_inactive_flags()
*/
if ((slave->original_flags & IFF_NOARP) == 0) {
slave_dev->flags &= ~IFF_NOARP;
}
kfree(slave); kfree(slave);
@ -1816,12 +1818,8 @@ static int bond_release_all(struct net_device *bond_dev)
addr.sa_family = slave_dev->type; addr.sa_family = slave_dev->type;
dev_set_mac_address(slave_dev, &addr); dev_set_mac_address(slave_dev, &addr);
/* restore the original state of the IFF_NOARP flag that might have slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB |
* been set by bond_set_slave_inactive_flags() IFF_SLAVE_INACTIVE);
*/
if ((slave->original_flags & IFF_NOARP) == 0) {
slave_dev->flags &= ~IFF_NOARP;
}
kfree(slave); kfree(slave);
@ -4061,14 +4059,17 @@ void bond_set_mode_ops(struct bonding *bond, int mode)
bond_dev->hard_start_xmit = bond_xmit_broadcast; bond_dev->hard_start_xmit = bond_xmit_broadcast;
break; break;
case BOND_MODE_8023AD: case BOND_MODE_8023AD:
bond_set_master_3ad_flags(bond);
bond_dev->hard_start_xmit = bond_3ad_xmit_xor; bond_dev->hard_start_xmit = bond_3ad_xmit_xor;
if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34) if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34)
bond->xmit_hash_policy = bond_xmit_hash_policy_l34; bond->xmit_hash_policy = bond_xmit_hash_policy_l34;
else else
bond->xmit_hash_policy = bond_xmit_hash_policy_l2; bond->xmit_hash_policy = bond_xmit_hash_policy_l2;
break; break;
case BOND_MODE_TLB:
case BOND_MODE_ALB: case BOND_MODE_ALB:
bond_set_master_alb_flags(bond);
/* FALLTHRU */
case BOND_MODE_TLB:
bond_dev->hard_start_xmit = bond_alb_xmit; bond_dev->hard_start_xmit = bond_alb_xmit;
bond_dev->set_mac_address = bond_alb_set_mac_address; bond_dev->set_mac_address = bond_alb_set_mac_address;
break; break;

View file

@ -424,6 +424,12 @@ static ssize_t bonding_store_mode(struct class_device *cd, const char *buf, size
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} else { } else {
if (bond->params.mode == BOND_MODE_8023AD)
bond_unset_master_3ad_flags(bond);
if (bond->params.mode == BOND_MODE_ALB)
bond_unset_master_alb_flags(bond);
bond->params.mode = new_value; bond->params.mode = new_value;
bond_set_mode_ops(bond, bond->params.mode); bond_set_mode_ops(bond, bond->params.mode);
printk(KERN_INFO DRV_NAME ": %s: setting mode to %s (%d).\n", printk(KERN_INFO DRV_NAME ": %s: setting mode to %s (%d).\n",

View file

@ -22,8 +22,8 @@
#include "bond_3ad.h" #include "bond_3ad.h"
#include "bond_alb.h" #include "bond_alb.h"
#define DRV_VERSION "3.0.1" #define DRV_VERSION "3.0.2"
#define DRV_RELDATE "January 9, 2006" #define DRV_RELDATE "February 21, 2006"
#define DRV_NAME "bonding" #define DRV_NAME "bonding"
#define DRV_DESCRIPTION "Ethernet Channel Bonding Driver" #define DRV_DESCRIPTION "Ethernet Channel Bonding Driver"
@ -230,14 +230,37 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
static inline void bond_set_slave_inactive_flags(struct slave *slave) static inline void bond_set_slave_inactive_flags(struct slave *slave)
{ {
struct bonding *bond = slave->dev->master->priv;
if (bond->params.mode != BOND_MODE_TLB &&
bond->params.mode != BOND_MODE_ALB)
slave->state = BOND_STATE_BACKUP; slave->state = BOND_STATE_BACKUP;
slave->dev->flags |= IFF_NOARP; slave->dev->priv_flags |= IFF_SLAVE_INACTIVE;
} }
static inline void bond_set_slave_active_flags(struct slave *slave) static inline void bond_set_slave_active_flags(struct slave *slave)
{ {
slave->state = BOND_STATE_ACTIVE; slave->state = BOND_STATE_ACTIVE;
slave->dev->flags &= ~IFF_NOARP; slave->dev->priv_flags &= ~IFF_SLAVE_INACTIVE;
}
static inline void bond_set_master_3ad_flags(struct bonding *bond)
{
bond->dev->priv_flags |= IFF_MASTER_8023AD;
}
static inline void bond_unset_master_3ad_flags(struct bonding *bond)
{
bond->dev->priv_flags &= ~IFF_MASTER_8023AD;
}
static inline void bond_set_master_alb_flags(struct bonding *bond)
{
bond->dev->priv_flags |= IFF_MASTER_ALB;
}
static inline void bond_unset_master_alb_flags(struct bonding *bond)
{
bond->dev->priv_flags &= ~IFF_MASTER_ALB;
} }
struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr); struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr);

View file

@ -87,15 +87,9 @@ static int tricn_write(adapter_t *adapter, int bundle_addr, int module_addr,
static int tricn_init(adapter_t *adapter) static int tricn_init(adapter_t *adapter)
{ {
int i = 0; int i = 0;
int sme = 1;
int stat = 0; int stat = 0;
int timeout = 0; int timeout = 0;
int is_ready = 0; int is_ready = 0;
int dynamic_deskew = 0;
if (dynamic_deskew)
sme = 0;
/* 1 */ /* 1 */
timeout=1000; timeout=1000;
@ -113,11 +107,9 @@ static int tricn_init(adapter_t *adapter)
} }
/* 2 */ /* 2 */
if (sme) {
tricn_write(adapter, 0, 0, 0, TRICN_CNFG, 0x81); tricn_write(adapter, 0, 0, 0, TRICN_CNFG, 0x81);
tricn_write(adapter, 0, 1, 0, TRICN_CNFG, 0x81); tricn_write(adapter, 0, 1, 0, TRICN_CNFG, 0x81);
tricn_write(adapter, 0, 2, 0, TRICN_CNFG, 0x81); tricn_write(adapter, 0, 2, 0, TRICN_CNFG, 0x81);
}
for (i=1; i<= 8; i++) tricn_write(adapter, 0, 0, i, TRICN_CNFG, 0xf1); for (i=1; i<= 8; i++) tricn_write(adapter, 0, 0, i, TRICN_CNFG, 0xf1);
for (i=1; i<= 2; i++) tricn_write(adapter, 0, 1, i, TRICN_CNFG, 0xf1); for (i=1; i<= 2; i++) tricn_write(adapter, 0, 1, i, TRICN_CNFG, 0xf1);
for (i=1; i<= 3; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xe1); for (i=1; i<= 3; i++) tricn_write(adapter, 0, 2, i, TRICN_CNFG, 0xe1);

View file

@ -686,7 +686,7 @@ int t1_init_hw_modules(adapter_t *adapter)
*/ */
static void __devinit get_pci_mode(adapter_t *adapter, struct chelsio_pci_params *p) static void __devinit get_pci_mode(adapter_t *adapter, struct chelsio_pci_params *p)
{ {
static unsigned short speed_map[] = { 33, 66, 100, 133 }; static const unsigned short speed_map[] = { 33, 66, 100, 133 };
u32 pci_mode; u32 pci_mode;
pci_read_config_dword(adapter->pdev, A_PCICFG_MODE, &pci_mode); pci_read_config_dword(adapter->pdev, A_PCICFG_MODE, &pci_mode);

View file

@ -993,7 +993,7 @@ dgrs_download(struct net_device *dev0)
int is; int is;
unsigned long i; unsigned long i;
static int iv2is[16] = { static const int iv2is[16] = {
0, 0, 0, ES4H_IS_INT3, 0, 0, 0, ES4H_IS_INT3,
0, ES4H_IS_INT5, 0, ES4H_IS_INT7, 0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
0, 0, ES4H_IS_INT10, ES4H_IS_INT11, 0, 0, ES4H_IS_INT10, ES4H_IS_INT11,

View file

@ -1,4 +1,4 @@
static int dgrs_firmnum = 550; static const int dgrs_firmnum = 550;
static char dgrs_firmver[] = "$Version$"; static char dgrs_firmver[] = "$Version$";
static char dgrs_firmdate[] = "11/16/96 03:45:15"; static char dgrs_firmdate[] = "11/16/96 03:45:15";
static unsigned char dgrs_code[] __initdata = { static unsigned char dgrs_code[] __initdata = {
@ -9963,4 +9963,4 @@ static unsigned char dgrs_code[] __initdata = {
109,46,99,0,114,99,0,0,48,120,0,0, 109,46,99,0,114,99,0,0,48,120,0,0,
0,0,0,0,0,0,0,0,0,0,0,0 0,0,0,0,0,0,0,0,0,0,0,0
} ; } ;
static int dgrs_ncode = 119520 ; static const int dgrs_ncode = 119520 ;

View file

@ -90,8 +90,8 @@ module_param(tx_coalesce, int, 0); /* HW xmit count each TxDMAComplete */
#define EnableInt() \ #define EnableInt() \
writew(DEFAULT_INTR, ioaddr + IntEnable) writew(DEFAULT_INTR, ioaddr + IntEnable)
static int max_intrloop = 50; static const int max_intrloop = 50;
static int multicast_filter_limit = 0x40; static const int multicast_filter_limit = 0x40;
static int rio_open (struct net_device *dev); static int rio_open (struct net_device *dev);
static void rio_timer (unsigned long data); static void rio_timer (unsigned long data);

View file

@ -598,8 +598,8 @@ static void e100_enable_irq(struct nic *nic)
spin_lock_irqsave(&nic->cmd_lock, flags); spin_lock_irqsave(&nic->cmd_lock, flags);
writeb(irq_mask_none, &nic->csr->scb.cmd_hi); writeb(irq_mask_none, &nic->csr->scb.cmd_hi);
spin_unlock_irqrestore(&nic->cmd_lock, flags);
e100_write_flush(nic); e100_write_flush(nic);
spin_unlock_irqrestore(&nic->cmd_lock, flags);
} }
static void e100_disable_irq(struct nic *nic) static void e100_disable_irq(struct nic *nic)
@ -608,8 +608,8 @@ static void e100_disable_irq(struct nic *nic)
spin_lock_irqsave(&nic->cmd_lock, flags); spin_lock_irqsave(&nic->cmd_lock, flags);
writeb(irq_mask_all, &nic->csr->scb.cmd_hi); writeb(irq_mask_all, &nic->csr->scb.cmd_hi);
spin_unlock_irqrestore(&nic->cmd_lock, flags);
e100_write_flush(nic); e100_write_flush(nic);
spin_unlock_irqrestore(&nic->cmd_lock, flags);
} }
static void e100_hw_reset(struct nic *nic) static void e100_hw_reset(struct nic *nic)
@ -1582,8 +1582,8 @@ static void e100_watchdog(unsigned long data)
* interrupt mask bit and the SW Interrupt generation bit */ * interrupt mask bit and the SW Interrupt generation bit */
spin_lock_irq(&nic->cmd_lock); spin_lock_irq(&nic->cmd_lock);
writeb(readb(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi); writeb(readb(&nic->csr->scb.cmd_hi) | irq_sw_gen,&nic->csr->scb.cmd_hi);
spin_unlock_irq(&nic->cmd_lock);
e100_write_flush(nic); e100_write_flush(nic);
spin_unlock_irq(&nic->cmd_lock);
e100_update_stats(nic); e100_update_stats(nic);
e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex); e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);

View file

@ -83,10 +83,6 @@
struct e1000_adapter; struct e1000_adapter;
#include "e1000_hw.h" #include "e1000_hw.h"
#ifdef CONFIG_E1000_MQ
#include <linux/cpu.h>
#include <linux/smp.h>
#endif
#ifdef DBG #ifdef DBG
#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args) #define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
@ -169,12 +165,6 @@ struct e1000_buffer {
uint16_t next_to_watch; uint16_t next_to_watch;
}; };
#ifdef CONFIG_E1000_MQ
struct e1000_queue_stats {
uint64_t packets;
uint64_t bytes;
};
#endif
struct e1000_ps_page { struct page *ps_page[PS_PAGE_BUFFERS]; }; struct e1000_ps_page { struct page *ps_page[PS_PAGE_BUFFERS]; };
struct e1000_ps_page_dma { uint64_t ps_page_dma[PS_PAGE_BUFFERS]; }; struct e1000_ps_page_dma { uint64_t ps_page_dma[PS_PAGE_BUFFERS]; };
@ -198,12 +188,7 @@ struct e1000_tx_ring {
spinlock_t tx_lock; spinlock_t tx_lock;
uint16_t tdh; uint16_t tdh;
uint16_t tdt; uint16_t tdt;
boolean_t last_tx_tso; boolean_t last_tx_tso;
#ifdef CONFIG_E1000_MQ
struct e1000_queue_stats tx_stats;
#endif
}; };
struct e1000_rx_ring { struct e1000_rx_ring {
@ -230,9 +215,6 @@ struct e1000_rx_ring {
uint16_t rdh; uint16_t rdh;
uint16_t rdt; uint16_t rdt;
#ifdef CONFIG_E1000_MQ
struct e1000_queue_stats rx_stats;
#endif
}; };
#define E1000_DESC_UNUSED(R) \ #define E1000_DESC_UNUSED(R) \
@ -260,6 +242,7 @@ struct e1000_adapter {
uint32_t rx_buffer_len; uint32_t rx_buffer_len;
uint32_t part_num; uint32_t part_num;
uint32_t wol; uint32_t wol;
uint32_t ksp3_port_a;
uint32_t smartspeed; uint32_t smartspeed;
uint32_t en_mng_pt; uint32_t en_mng_pt;
uint16_t link_speed; uint16_t link_speed;
@ -269,8 +252,8 @@ struct e1000_adapter {
spinlock_t tx_queue_lock; spinlock_t tx_queue_lock;
#endif #endif
atomic_t irq_sem; atomic_t irq_sem;
struct work_struct tx_timeout_task;
struct work_struct watchdog_task; struct work_struct watchdog_task;
struct work_struct reset_task;
uint8_t fc_autoneg; uint8_t fc_autoneg;
struct timer_list blink_timer; struct timer_list blink_timer;
@ -278,9 +261,6 @@ struct e1000_adapter {
/* TX */ /* TX */
struct e1000_tx_ring *tx_ring; /* One per active queue */ struct e1000_tx_ring *tx_ring; /* One per active queue */
#ifdef CONFIG_E1000_MQ
struct e1000_tx_ring **cpu_tx_ring; /* per-cpu */
#endif
unsigned long tx_queue_len; unsigned long tx_queue_len;
uint32_t txd_cmd; uint32_t txd_cmd;
uint32_t tx_int_delay; uint32_t tx_int_delay;
@ -313,11 +293,6 @@ struct e1000_adapter {
struct e1000_rx_ring *rx_ring; /* One per active queue */ struct e1000_rx_ring *rx_ring; /* One per active queue */
#ifdef CONFIG_E1000_NAPI #ifdef CONFIG_E1000_NAPI
struct net_device *polling_netdev; /* One per active queue */ struct net_device *polling_netdev; /* One per active queue */
#endif
#ifdef CONFIG_E1000_MQ
struct net_device **cpu_netdev; /* per-cpu */
struct call_async_data_struct rx_sched_call_data;
cpumask_t cpumask;
#endif #endif
int num_tx_queues; int num_tx_queues;
int num_rx_queues; int num_rx_queues;
@ -353,10 +328,37 @@ struct e1000_adapter {
struct e1000_rx_ring test_rx_ring; struct e1000_rx_ring test_rx_ring;
u32 *config_space; uint32_t *config_space;
int msg_enable; int msg_enable;
#ifdef CONFIG_PCI_MSI #ifdef CONFIG_PCI_MSI
boolean_t have_msi; boolean_t have_msi;
#endif
/* to not mess up cache alignment, always add to the bottom */
boolean_t txb2b;
#ifdef NETIF_F_TSO
boolean_t tso_force;
#endif #endif
}; };
/* e1000_main.c */
extern char e1000_driver_name[];
extern char e1000_driver_version[];
int e1000_up(struct e1000_adapter *adapter);
void e1000_down(struct e1000_adapter *adapter);
void e1000_reset(struct e1000_adapter *adapter);
int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
void e1000_update_stats(struct e1000_adapter *adapter);
int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
/* e1000_ethtool.c */
void e1000_set_ethtool_ops(struct net_device *netdev);
/* e1000_param.c */
void e1000_check_options(struct e1000_adapter *adapter);
#endif /* _E1000_H_ */ #endif /* _E1000_H_ */

View file

@ -32,19 +32,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
extern char e1000_driver_name[];
extern char e1000_driver_version[];
extern int e1000_up(struct e1000_adapter *adapter);
extern void e1000_down(struct e1000_adapter *adapter);
extern void e1000_reset(struct e1000_adapter *adapter);
extern int e1000_set_spd_dplx(struct e1000_adapter *adapter, uint16_t spddplx);
extern int e1000_setup_all_rx_resources(struct e1000_adapter *adapter);
extern int e1000_setup_all_tx_resources(struct e1000_adapter *adapter);
extern void e1000_free_all_rx_resources(struct e1000_adapter *adapter);
extern void e1000_free_all_tx_resources(struct e1000_adapter *adapter);
extern void e1000_update_stats(struct e1000_adapter *adapter);
struct e1000_stats { struct e1000_stats {
char stat_string[ETH_GSTRING_LEN]; char stat_string[ETH_GSTRING_LEN];
int sizeof_stat; int sizeof_stat;
@ -60,7 +47,6 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{ "tx_bytes", E1000_STAT(net_stats.tx_bytes) }, { "tx_bytes", E1000_STAT(net_stats.tx_bytes) },
{ "rx_errors", E1000_STAT(net_stats.rx_errors) }, { "rx_errors", E1000_STAT(net_stats.rx_errors) },
{ "tx_errors", E1000_STAT(net_stats.tx_errors) }, { "tx_errors", E1000_STAT(net_stats.tx_errors) },
{ "rx_dropped", E1000_STAT(net_stats.rx_dropped) },
{ "tx_dropped", E1000_STAT(net_stats.tx_dropped) }, { "tx_dropped", E1000_STAT(net_stats.tx_dropped) },
{ "multicast", E1000_STAT(net_stats.multicast) }, { "multicast", E1000_STAT(net_stats.multicast) },
{ "collisions", E1000_STAT(net_stats.collisions) }, { "collisions", E1000_STAT(net_stats.collisions) },
@ -68,7 +54,6 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{ "rx_over_errors", E1000_STAT(net_stats.rx_over_errors) }, { "rx_over_errors", E1000_STAT(net_stats.rx_over_errors) },
{ "rx_crc_errors", E1000_STAT(net_stats.rx_crc_errors) }, { "rx_crc_errors", E1000_STAT(net_stats.rx_crc_errors) },
{ "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) }, { "rx_frame_errors", E1000_STAT(net_stats.rx_frame_errors) },
{ "rx_fifo_errors", E1000_STAT(net_stats.rx_fifo_errors) },
{ "rx_no_buffer_count", E1000_STAT(stats.rnbc) }, { "rx_no_buffer_count", E1000_STAT(stats.rnbc) },
{ "rx_missed_errors", E1000_STAT(net_stats.rx_missed_errors) }, { "rx_missed_errors", E1000_STAT(net_stats.rx_missed_errors) },
{ "tx_aborted_errors", E1000_STAT(net_stats.tx_aborted_errors) }, { "tx_aborted_errors", E1000_STAT(net_stats.tx_aborted_errors) },
@ -97,14 +82,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
{ "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) }, { "alloc_rx_buff_failed", E1000_STAT(alloc_rx_buff_failed) },
}; };
#ifdef CONFIG_E1000_MQ
#define E1000_QUEUE_STATS_LEN \
(((struct e1000_adapter *)netdev->priv)->num_tx_queues + \
((struct e1000_adapter *)netdev->priv)->num_rx_queues) \
* (sizeof(struct e1000_queue_stats) / sizeof(uint64_t))
#else
#define E1000_QUEUE_STATS_LEN 0 #define E1000_QUEUE_STATS_LEN 0
#endif
#define E1000_GLOBAL_STATS_LEN \ #define E1000_GLOBAL_STATS_LEN \
sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats) sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
#define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN) #define E1000_STATS_LEN (E1000_GLOBAL_STATS_LEN + E1000_QUEUE_STATS_LEN)
@ -346,6 +324,9 @@ e1000_set_tso(struct net_device *netdev, uint32_t data)
netdev->features |= NETIF_F_TSO; netdev->features |= NETIF_F_TSO;
else else
netdev->features &= ~NETIF_F_TSO; netdev->features &= ~NETIF_F_TSO;
DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled");
adapter->tso_force = TRUE;
return 0; return 0;
} }
#endif /* NETIF_F_TSO */ #endif /* NETIF_F_TSO */
@ -594,6 +575,7 @@ e1000_get_drvinfo(struct net_device *netdev,
case e1000_82571: case e1000_82571:
case e1000_82572: case e1000_82572:
case e1000_82573: case e1000_82573:
case e1000_80003es2lan:
sprintf(firmware_version, "%d.%d-%d", sprintf(firmware_version, "%d.%d-%d",
(eeprom_data & 0xF000) >> 12, (eeprom_data & 0xF000) >> 12,
(eeprom_data & 0x0FF0) >> 4, (eeprom_data & 0x0FF0) >> 4,
@ -642,6 +624,9 @@ e1000_set_ringparam(struct net_device *netdev,
struct e1000_rx_ring *rxdr, *rx_old, *rx_new; struct e1000_rx_ring *rxdr, *rx_old, *rx_new;
int i, err, tx_ring_size, rx_ring_size; int i, err, tx_ring_size, rx_ring_size;
if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
return -EINVAL;
tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_tx_queues; tx_ring_size = sizeof(struct e1000_tx_ring) * adapter->num_tx_queues;
rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_rx_queues; rx_ring_size = sizeof(struct e1000_rx_ring) * adapter->num_rx_queues;
@ -669,9 +654,6 @@ e1000_set_ringparam(struct net_device *netdev,
txdr = adapter->tx_ring; txdr = adapter->tx_ring;
rxdr = adapter->rx_ring; rxdr = adapter->rx_ring;
if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
return -EINVAL;
rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD); rxdr->count = max(ring->rx_pending,(uint32_t)E1000_MIN_RXD);
rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ? rxdr->count = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
E1000_MAX_RXD : E1000_MAX_82544_RXD)); E1000_MAX_RXD : E1000_MAX_82544_RXD));
@ -767,6 +749,7 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
/* there are several bits on newer hardware that are r/w */ /* there are several bits on newer hardware that are r/w */
case e1000_82571: case e1000_82571:
case e1000_82572: case e1000_82572:
case e1000_80003es2lan:
toggle = 0x7FFFF3FF; toggle = 0x7FFFF3FF;
break; break;
case e1000_82573: case e1000_82573:
@ -1256,6 +1239,10 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140); e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
/* autoneg off */ /* autoneg off */
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140); e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x8140);
} else if (adapter->hw.phy_type == e1000_phy_gg82563) {
e1000_write_phy_reg(&adapter->hw,
GG82563_PHY_KMRN_MODE_CTRL,
0x1CE);
} }
/* force 1000, set loopback */ /* force 1000, set loopback */
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140); e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x4140);
@ -1325,6 +1312,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
case e1000_82571: case e1000_82571:
case e1000_82572: case e1000_82572:
case e1000_82573: case e1000_82573:
case e1000_80003es2lan:
return e1000_integrated_phy_loopback(adapter); return e1000_integrated_phy_loopback(adapter);
break; break;
@ -1405,6 +1393,11 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
case e1000_82546_rev_3: case e1000_82546_rev_3:
default: default:
hw->autoneg = TRUE; hw->autoneg = TRUE;
if (hw->phy_type == e1000_phy_gg82563) {
e1000_write_phy_reg(hw,
GG82563_PHY_KMRN_MODE_CTRL,
0x180);
}
e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg); e1000_read_phy_reg(hw, PHY_CTRL, &phy_reg);
if (phy_reg & MII_CR_LOOPBACK) { if (phy_reg & MII_CR_LOOPBACK) {
phy_reg &= ~MII_CR_LOOPBACK; phy_reg &= ~MII_CR_LOOPBACK;
@ -1640,10 +1633,26 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case E1000_DEV_ID_82546EB_QUAD_COPPER: case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82545EM_FIBER: case E1000_DEV_ID_82545EM_FIBER:
case E1000_DEV_ID_82545EM_COPPER: case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82546GB_QUAD_COPPER:
wol->supported = 0; wol->supported = 0;
wol->wolopts = 0; wol->wolopts = 0;
return; return;
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
/* device id 10B5 port-A supports wol */
if (!adapter->ksp3_port_a) {
wol->supported = 0;
return;
}
/* KSP3 does not suppport UCAST wake-ups for any interface */
wol->supported = WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC;
if (adapter->wol & E1000_WUFC_EX)
DPRINTK(DRV, ERR, "Interface does not support "
"directed (unicast) frame wake-up packets\n");
wol->wolopts = 0;
goto do_defaults;
case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_FIBER:
case E1000_DEV_ID_82546GB_FIBER: case E1000_DEV_ID_82546GB_FIBER:
case E1000_DEV_ID_82571EB_FIBER: case E1000_DEV_ID_82571EB_FIBER:
@ -1658,8 +1667,9 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
default: default:
wol->supported = WAKE_UCAST | WAKE_MCAST | wol->supported = WAKE_UCAST | WAKE_MCAST |
WAKE_BCAST | WAKE_MAGIC; WAKE_BCAST | WAKE_MAGIC;
wol->wolopts = 0; wol->wolopts = 0;
do_defaults:
if (adapter->wol & E1000_WUFC_EX) if (adapter->wol & E1000_WUFC_EX)
wol->wolopts |= WAKE_UCAST; wol->wolopts |= WAKE_UCAST;
if (adapter->wol & E1000_WUFC_MC) if (adapter->wol & E1000_WUFC_MC)
@ -1684,10 +1694,22 @@ e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
case E1000_DEV_ID_82543GC_COPPER: case E1000_DEV_ID_82543GC_COPPER:
case E1000_DEV_ID_82544EI_FIBER: case E1000_DEV_ID_82544EI_FIBER:
case E1000_DEV_ID_82546EB_QUAD_COPPER: case E1000_DEV_ID_82546EB_QUAD_COPPER:
case E1000_DEV_ID_82546GB_QUAD_COPPER:
case E1000_DEV_ID_82545EM_FIBER: case E1000_DEV_ID_82545EM_FIBER:
case E1000_DEV_ID_82545EM_COPPER: case E1000_DEV_ID_82545EM_COPPER:
return wol->wolopts ? -EOPNOTSUPP : 0; return wol->wolopts ? -EOPNOTSUPP : 0;
case E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3:
/* device id 10B5 port-A supports wol */
if (!adapter->ksp3_port_a)
return wol->wolopts ? -EOPNOTSUPP : 0;
if (wol->wolopts & WAKE_UCAST) {
DPRINTK(DRV, ERR, "Interface does not support "
"directed (unicast) frame wake-up packets\n");
return -EOPNOTSUPP;
}
case E1000_DEV_ID_82546EB_FIBER: case E1000_DEV_ID_82546EB_FIBER:
case E1000_DEV_ID_82546GB_FIBER: case E1000_DEV_ID_82546GB_FIBER:
case E1000_DEV_ID_82571EB_FIBER: case E1000_DEV_ID_82571EB_FIBER:
@ -1799,11 +1821,6 @@ e1000_get_ethtool_stats(struct net_device *netdev,
struct ethtool_stats *stats, uint64_t *data) struct ethtool_stats *stats, uint64_t *data)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
#ifdef CONFIG_E1000_MQ
uint64_t *queue_stat;
int stat_count = sizeof(struct e1000_queue_stats) / sizeof(uint64_t);
int j, k;
#endif
int i; int i;
e1000_update_stats(adapter); e1000_update_stats(adapter);
@ -1812,29 +1829,12 @@ e1000_get_ethtool_stats(struct net_device *netdev,
data[i] = (e1000_gstrings_stats[i].sizeof_stat == data[i] = (e1000_gstrings_stats[i].sizeof_stat ==
sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p; sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
} }
#ifdef CONFIG_E1000_MQ
for (j = 0; j < adapter->num_tx_queues; j++) {
queue_stat = (uint64_t *)&adapter->tx_ring[j].tx_stats;
for (k = 0; k < stat_count; k++)
data[i + k] = queue_stat[k];
i += k;
}
for (j = 0; j < adapter->num_rx_queues; j++) {
queue_stat = (uint64_t *)&adapter->rx_ring[j].rx_stats;
for (k = 0; k < stat_count; k++)
data[i + k] = queue_stat[k];
i += k;
}
#endif
/* BUG_ON(i != E1000_STATS_LEN); */ /* BUG_ON(i != E1000_STATS_LEN); */
} }
static void static void
e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
{ {
#ifdef CONFIG_E1000_MQ
struct e1000_adapter *adapter = netdev_priv(netdev);
#endif
uint8_t *p = data; uint8_t *p = data;
int i; int i;
@ -1849,20 +1849,6 @@ e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
ETH_GSTRING_LEN); ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
#ifdef CONFIG_E1000_MQ
for (i = 0; i < adapter->num_tx_queues; i++) {
sprintf(p, "tx_queue_%u_packets", i);
p += ETH_GSTRING_LEN;
sprintf(p, "tx_queue_%u_bytes", i);
p += ETH_GSTRING_LEN;
}
for (i = 0; i < adapter->num_rx_queues; i++) {
sprintf(p, "rx_queue_%u_packets", i);
p += ETH_GSTRING_LEN;
sprintf(p, "rx_queue_%u_bytes", i);
p += ETH_GSTRING_LEN;
}
#endif
/* BUG_ON(p - data != E1000_STATS_LEN * ETH_GSTRING_LEN); */ /* BUG_ON(p - data != E1000_STATS_LEN * ETH_GSTRING_LEN); */
break; break;
} }

File diff suppressed because it is too large Load diff

View file

@ -60,6 +60,7 @@ typedef enum {
e1000_82571, e1000_82571,
e1000_82572, e1000_82572,
e1000_82573, e1000_82573,
e1000_80003es2lan,
e1000_num_macs e1000_num_macs
} e1000_mac_type; } e1000_mac_type;
@ -138,6 +139,13 @@ typedef enum {
e1000_cable_length_undefined = 0xFF e1000_cable_length_undefined = 0xFF
} e1000_cable_length; } e1000_cable_length;
typedef enum {
e1000_gg_cable_length_60 = 0,
e1000_gg_cable_length_60_115 = 1,
e1000_gg_cable_length_115_150 = 2,
e1000_gg_cable_length_150 = 4
} e1000_gg_cable_length;
typedef enum { typedef enum {
e1000_igp_cable_length_10 = 10, e1000_igp_cable_length_10 = 10,
e1000_igp_cable_length_20 = 20, e1000_igp_cable_length_20 = 20,
@ -208,6 +216,7 @@ typedef enum {
e1000_phy_m88 = 0, e1000_phy_m88 = 0,
e1000_phy_igp, e1000_phy_igp,
e1000_phy_igp_2, e1000_phy_igp_2,
e1000_phy_gg82563,
e1000_phy_undefined = 0xFF e1000_phy_undefined = 0xFF
} e1000_phy_type; } e1000_phy_type;
@ -281,6 +290,7 @@ typedef enum {
#define E1000_ERR_MASTER_REQUESTS_PENDING 10 #define E1000_ERR_MASTER_REQUESTS_PENDING 10
#define E1000_ERR_HOST_INTERFACE_COMMAND 11 #define E1000_ERR_HOST_INTERFACE_COMMAND 11
#define E1000_BLK_PHY_RESET 12 #define E1000_BLK_PHY_RESET 12
#define E1000_ERR_SWFW_SYNC 13
/* Function prototypes */ /* Function prototypes */
/* Initialization */ /* Initialization */
@ -304,6 +314,8 @@ int32_t e1000_phy_hw_reset(struct e1000_hw *hw);
int32_t e1000_phy_reset(struct e1000_hw *hw); int32_t e1000_phy_reset(struct e1000_hw *hw);
int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info); int32_t e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info);
int32_t e1000_validate_mdi_setting(struct e1000_hw *hw); int32_t e1000_validate_mdi_setting(struct e1000_hw *hw);
int32_t e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data);
int32_t e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data);
/* EEPROM Functions */ /* EEPROM Functions */
int32_t e1000_init_eeprom_params(struct e1000_hw *hw); int32_t e1000_init_eeprom_params(struct e1000_hw *hw);
@ -454,6 +466,8 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
#define E1000_DEV_ID_82573E_IAMT 0x108C #define E1000_DEV_ID_82573E_IAMT 0x108C
#define E1000_DEV_ID_82573L 0x109A #define E1000_DEV_ID_82573L 0x109A
#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096
#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098
#define NODE_ADDRESS_SIZE 6 #define NODE_ADDRESS_SIZE 6
@ -850,6 +864,7 @@ struct e1000_ffvt_entry {
#define E1000_TXCW 0x00178 /* TX Configuration Word - RW */ #define E1000_TXCW 0x00178 /* TX Configuration Word - RW */
#define E1000_RXCW 0x00180 /* RX Configuration Word - RO */ #define E1000_RXCW 0x00180 /* RX Configuration Word - RO */
#define E1000_TCTL 0x00400 /* TX Control - RW */ #define E1000_TCTL 0x00400 /* TX Control - RW */
#define E1000_TCTL_EXT 0x00404 /* Extended TX Control - RW */
#define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */ #define E1000_TIPG 0x00410 /* TX Inter-packet gap -RW */
#define E1000_TBT 0x00448 /* TX Burst Timer - RW */ #define E1000_TBT 0x00448 /* TX Burst Timer - RW */
#define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */ #define E1000_AIT 0x00458 /* Adaptive Interframe Spacing Throttle - RW */
@ -996,6 +1011,11 @@ struct e1000_ffvt_entry {
#define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */ #define E1000_FFMT 0x09000 /* Flexible Filter Mask Table - RW Array */
#define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */ #define E1000_FFVT 0x09800 /* Flexible Filter Value Table - RW Array */
#define E1000_KUMCTRLSTA 0x00034 /* MAC-PHY interface - RW */
#define E1000_MDPHYA 0x0003C /* PHY address - RW */
#define E1000_MANC2H 0x05860 /* Managment Control To Host - RW */
#define E1000_SW_FW_SYNC 0x05B5C /* Software-Firmware Synchronization - RW */
#define E1000_GCR 0x05B00 /* PCI-Ex Control */ #define E1000_GCR 0x05B00 /* PCI-Ex Control */
#define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */ #define E1000_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */
#define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */ #define E1000_GSCL_2 0x05B14 /* PCI-Ex Statistic Control #2 */
@ -1065,6 +1085,7 @@ struct e1000_ffvt_entry {
#define E1000_82542_RXCW E1000_RXCW #define E1000_82542_RXCW E1000_RXCW
#define E1000_82542_MTA 0x00200 #define E1000_82542_MTA 0x00200
#define E1000_82542_TCTL E1000_TCTL #define E1000_82542_TCTL E1000_TCTL
#define E1000_82542_TCTL_EXT E1000_TCTL_EXT
#define E1000_82542_TIPG E1000_TIPG #define E1000_82542_TIPG E1000_TIPG
#define E1000_82542_TDBAL 0x00420 #define E1000_82542_TDBAL 0x00420
#define E1000_82542_TDBAH 0x00424 #define E1000_82542_TDBAH 0x00424
@ -1212,6 +1233,8 @@ struct e1000_ffvt_entry {
#define E1000_82542_RSSRK E1000_RSSRK #define E1000_82542_RSSRK E1000_RSSRK
#define E1000_82542_RSSIM E1000_RSSIM #define E1000_82542_RSSIM E1000_RSSIM
#define E1000_82542_RSSIR E1000_RSSIR #define E1000_82542_RSSIR E1000_RSSIR
#define E1000_82542_KUMCTRLSTA E1000_KUMCTRLSTA
#define E1000_82542_SW_FW_SYNC E1000_SW_FW_SYNC
/* Statistics counters collected by the MAC */ /* Statistics counters collected by the MAC */
struct e1000_hw_stats { struct e1000_hw_stats {
@ -1303,6 +1326,7 @@ struct e1000_hw {
e1000_ffe_config ffe_config_state; e1000_ffe_config ffe_config_state;
uint32_t asf_firmware_present; uint32_t asf_firmware_present;
uint32_t eeprom_semaphore_present; uint32_t eeprom_semaphore_present;
uint32_t swfw_sync_present;
unsigned long io_base; unsigned long io_base;
uint32_t phy_id; uint32_t phy_id;
uint32_t phy_revision; uint32_t phy_revision;
@ -1361,6 +1385,7 @@ struct e1000_hw {
boolean_t ifs_params_forced; boolean_t ifs_params_forced;
boolean_t in_ifs_mode; boolean_t in_ifs_mode;
boolean_t mng_reg_access_disabled; boolean_t mng_reg_access_disabled;
boolean_t leave_av_bit_off;
}; };
@ -1393,6 +1418,8 @@ struct e1000_hw {
#define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */ #define E1000_CTRL_FRCDPX 0x00001000 /* Force Duplex */
#define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */ #define E1000_CTRL_D_UD_EN 0x00002000 /* Dock/Undock enable */
#define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */ #define E1000_CTRL_D_UD_POLARITY 0x00004000 /* Defined polarity of Dock/Undock indication in SDP[0] */
#define E1000_CTRL_FORCE_PHY_RESET 0x00008000 /* Reset both PHY ports, through PHYRST_N pin */
#define E1000_CTRL_EXT_LINK_EN 0x00010000 /* enable link status from external LINK_0 and LINK_1 pins */
#define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */
#define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */
#define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */ #define E1000_CTRL_SWDPIN2 0x00100000 /* SWDPIN 2 value */
@ -1429,6 +1456,16 @@ struct e1000_hw {
#define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */ #define E1000_STATUS_BUS64 0x00001000 /* In 64 bit slot */
#define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */ #define E1000_STATUS_PCIX_MODE 0x00002000 /* PCI-X mode */
#define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */ #define E1000_STATUS_PCIX_SPEED 0x0000C000 /* PCI-X bus speed */
#define E1000_STATUS_BMC_SKU_0 0x00100000 /* BMC USB redirect disabled */
#define E1000_STATUS_BMC_SKU_1 0x00200000 /* BMC SRAM disabled */
#define E1000_STATUS_BMC_SKU_2 0x00400000 /* BMC SDRAM disabled */
#define E1000_STATUS_BMC_CRYPTO 0x00800000 /* BMC crypto disabled */
#define E1000_STATUS_BMC_LITE 0x01000000 /* BMC external code execution disabled */
#define E1000_STATUS_RGMII_ENABLE 0x02000000 /* RGMII disabled */
#define E1000_STATUS_FUSE_8 0x04000000
#define E1000_STATUS_FUSE_9 0x08000000
#define E1000_STATUS_SERDES0_DIS 0x10000000 /* SERDES disabled on port 0 */
#define E1000_STATUS_SERDES1_DIS 0x20000000 /* SERDES disabled on port 1 */
/* Constants used to intrepret the masked PCI-X bus speed. */ /* Constants used to intrepret the masked PCI-X bus speed. */
#define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */ #define E1000_STATUS_PCIX_SPEED_66 0x00000000 /* PCI-X bus speed 50-66 MHz */
@ -1506,6 +1543,8 @@ struct e1000_hw {
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000 #define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000
#define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_TBI 0x00C00000
#define E1000_CTRL_EXT_LINK_MODE_KMRN 0x00000000
#define E1000_CTRL_EXT_LINK_MODE_SERDES 0x00C00000
#define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000 #define E1000_CTRL_EXT_WR_WMARK_MASK 0x03000000
#define E1000_CTRL_EXT_WR_WMARK_256 0x00000000 #define E1000_CTRL_EXT_WR_WMARK_256 0x00000000
#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000 #define E1000_CTRL_EXT_WR_WMARK_320 0x01000000
@ -1515,6 +1554,9 @@ struct e1000_hw {
#define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */ #define E1000_CTRL_EXT_DRV_LOAD 0x10000000 /* Driver loaded bit for FW */
#define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */ #define E1000_CTRL_EXT_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */
#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */ #define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000 /* Clear Interrupt timers after IMS clear */
#define E1000_CRTL_EXT_PB_PAREN 0x01000000 /* packet buffer parity error detection enabled */
#define E1000_CTRL_EXT_DF_PAREN 0x02000000 /* descriptor FIFO parity error detection enable */
#define E1000_CTRL_EXT_GHOST_PAREN 0x40000000
/* MDI Control */ /* MDI Control */
#define E1000_MDIC_DATA_MASK 0x0000FFFF #define E1000_MDIC_DATA_MASK 0x0000FFFF
@ -1528,6 +1570,32 @@ struct e1000_hw {
#define E1000_MDIC_INT_EN 0x20000000 #define E1000_MDIC_INT_EN 0x20000000
#define E1000_MDIC_ERROR 0x40000000 #define E1000_MDIC_ERROR 0x40000000
#define E1000_KUMCTRLSTA_MASK 0x0000FFFF
#define E1000_KUMCTRLSTA_OFFSET 0x001F0000
#define E1000_KUMCTRLSTA_OFFSET_SHIFT 16
#define E1000_KUMCTRLSTA_REN 0x00200000
#define E1000_KUMCTRLSTA_OFFSET_FIFO_CTRL 0x00000000
#define E1000_KUMCTRLSTA_OFFSET_CTRL 0x00000001
#define E1000_KUMCTRLSTA_OFFSET_INB_CTRL 0x00000002
#define E1000_KUMCTRLSTA_OFFSET_DIAG 0x00000003
#define E1000_KUMCTRLSTA_OFFSET_TIMEOUTS 0x00000004
#define E1000_KUMCTRLSTA_OFFSET_INB_PARAM 0x00000009
#define E1000_KUMCTRLSTA_OFFSET_HD_CTRL 0x00000010
#define E1000_KUMCTRLSTA_OFFSET_M2P_SERDES 0x0000001E
#define E1000_KUMCTRLSTA_OFFSET_M2P_MODES 0x0000001F
/* FIFO Control */
#define E1000_KUMCTRLSTA_FIFO_CTRL_RX_BYPASS 0x00000008
#define E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS 0x00000800
/* In-Band Control */
#define E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010
/* Half-Duplex Control */
#define E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x00000004
#define E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT 0x00000000
/* LED Control */ /* LED Control */
#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F #define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F
#define E1000_LEDCTL_LED0_MODE_SHIFT 0 #define E1000_LEDCTL_LED0_MODE_SHIFT 0
@ -1590,6 +1658,13 @@ struct e1000_hw {
#define E1000_ICR_MNG 0x00040000 /* Manageability event */ #define E1000_ICR_MNG 0x00040000 /* Manageability event */
#define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */ #define E1000_ICR_DOCK 0x00080000 /* Dock/Undock */
#define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver should claim the interrupt */ #define E1000_ICR_INT_ASSERTED 0x80000000 /* If this bit asserted, the driver should claim the interrupt */
#define E1000_ICR_RXD_FIFO_PAR0 0x00100000 /* queue 0 Rx descriptor FIFO parity error */
#define E1000_ICR_TXD_FIFO_PAR0 0x00200000 /* queue 0 Tx descriptor FIFO parity error */
#define E1000_ICR_HOST_ARB_PAR 0x00400000 /* host arb read buffer parity error */
#define E1000_ICR_PB_PAR 0x00800000 /* packet buffer parity error */
#define E1000_ICR_RXD_FIFO_PAR1 0x01000000 /* queue 1 Rx descriptor FIFO parity error */
#define E1000_ICR_TXD_FIFO_PAR1 0x02000000 /* queue 1 Tx descriptor FIFO parity error */
#define E1000_ICR_ALL_PARITY 0x03F00000 /* all parity error bits */
/* Interrupt Cause Set */ /* Interrupt Cause Set */
#define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ #define E1000_ICS_TXDW E1000_ICR_TXDW /* Transmit desc written back */
@ -1610,6 +1685,12 @@ struct e1000_hw {
#define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_ICS_ACK E1000_ICR_ACK /* Receive Ack frame */
#define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_ICS_MNG E1000_ICR_MNG /* Manageability event */
#define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */ #define E1000_ICS_DOCK E1000_ICR_DOCK /* Dock/Undock */
#define E1000_ICS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */
#define E1000_ICS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */
#define E1000_ICS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */
#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
/* Interrupt Mask Set */ /* Interrupt Mask Set */
#define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */ #define E1000_IMS_TXDW E1000_ICR_TXDW /* Transmit desc written back */
@ -1630,6 +1711,12 @@ struct e1000_hw {
#define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_IMS_ACK E1000_ICR_ACK /* Receive Ack frame */
#define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_IMS_MNG E1000_ICR_MNG /* Manageability event */
#define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */ #define E1000_IMS_DOCK E1000_ICR_DOCK /* Dock/Undock */
#define E1000_IMS_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */
#define E1000_IMS_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */
#define E1000_IMS_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */
#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
/* Interrupt Mask Clear */ /* Interrupt Mask Clear */
#define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */ #define E1000_IMC_TXDW E1000_ICR_TXDW /* Transmit desc written back */
@ -1650,6 +1737,12 @@ struct e1000_hw {
#define E1000_IMC_ACK E1000_ICR_ACK /* Receive Ack frame */ #define E1000_IMC_ACK E1000_ICR_ACK /* Receive Ack frame */
#define E1000_IMC_MNG E1000_ICR_MNG /* Manageability event */ #define E1000_IMC_MNG E1000_ICR_MNG /* Manageability event */
#define E1000_IMC_DOCK E1000_ICR_DOCK /* Dock/Undock */ #define E1000_IMC_DOCK E1000_ICR_DOCK /* Dock/Undock */
#define E1000_IMC_RXD_FIFO_PAR0 E1000_ICR_RXD_FIFO_PAR0 /* queue 0 Rx descriptor FIFO parity error */
#define E1000_IMC_TXD_FIFO_PAR0 E1000_ICR_TXD_FIFO_PAR0 /* queue 0 Tx descriptor FIFO parity error */
#define E1000_IMC_HOST_ARB_PAR E1000_ICR_HOST_ARB_PAR /* host arb read buffer parity error */
#define E1000_IMC_PB_PAR E1000_ICR_PB_PAR /* packet buffer parity error */
#define E1000_IMC_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1 /* queue 1 Rx descriptor FIFO parity error */
#define E1000_IMC_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1 /* queue 1 Tx descriptor FIFO parity error */
/* Receive Control */ /* Receive Control */
#define E1000_RCTL_RST 0x00000001 /* Software reset */ #define E1000_RCTL_RST 0x00000001 /* Software reset */
@ -1719,6 +1812,12 @@ struct e1000_hw {
#define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */ #define E1000_PSRCTL_BSIZE2_SHIFT 6 /* Shift _left_ 6 */
#define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */ #define E1000_PSRCTL_BSIZE3_SHIFT 14 /* Shift _left_ 14 */
/* SW_W_SYNC definitions */
#define E1000_SWFW_EEP_SM 0x0001
#define E1000_SWFW_PHY0_SM 0x0002
#define E1000_SWFW_PHY1_SM 0x0004
#define E1000_SWFW_MAC_CSR_SM 0x0008
/* Receive Descriptor */ /* Receive Descriptor */
#define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */ #define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */
#define E1000_RDT_FPDB 0x80000000 /* Flush descriptor block */ #define E1000_RDT_FPDB 0x80000000 /* Flush descriptor block */
@ -1797,6 +1896,11 @@ struct e1000_hw {
#define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */ #define E1000_TCTL_RTLC 0x01000000 /* Re-transmit on late collision */
#define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */ #define E1000_TCTL_NRTU 0x02000000 /* No Re-transmit on underrun */
#define E1000_TCTL_MULR 0x10000000 /* Multiple request support */ #define E1000_TCTL_MULR 0x10000000 /* Multiple request support */
/* Extended Transmit Control */
#define E1000_TCTL_EXT_BST_MASK 0x000003FF /* Backoff Slot Time */
#define E1000_TCTL_EXT_GCEX_MASK 0x000FFC00 /* Gigabit Carry Extend Padding */
#define DEFAULT_80003ES2LAN_TCTL_EXT_GCEX 0x00010000
/* Receive Checksum Control */ /* Receive Checksum Control */
#define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */ #define E1000_RXCSUM_PCSS_MASK 0x000000FF /* Packet Checksum Start */
@ -1874,6 +1978,7 @@ struct e1000_hw {
#define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */ #define E1000_MANC_TCO_RESET 0x00010000 /* TCO Reset Occurred */
#define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */ #define E1000_MANC_RCV_TCO_EN 0x00020000 /* Receive TCO Packets Enabled */
#define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */ #define E1000_MANC_REPORT_STATUS 0x00040000 /* Status Reporting Enabled */
#define E1000_MANC_RCV_ALL 0x00080000 /* Receive All Enabled */
#define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */ #define E1000_MANC_BLK_PHY_RST_ON_IDE 0x00040000 /* Block phy resets */
#define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address #define E1000_MANC_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address
* filtering */ * filtering */
@ -1972,7 +2077,7 @@ struct e1000_host_command_info {
#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \ #define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \
E1000_GCR_RXDSCW_NO_SNOOP | \ E1000_GCR_RXDSCW_NO_SNOOP | \
E1000_GCR_RXDSCR_NO_SNOOP | \ E1000_GCR_RXDSCR_NO_SNOOP | \
E1000_GCR TXD_NO_SNOOP | \ E1000_GCR_TXD_NO_SNOOP | \
E1000_GCR_TXDSCW_NO_SNOOP | \ E1000_GCR_TXDSCW_NO_SNOOP | \
E1000_GCR_TXDSCR_NO_SNOOP) E1000_GCR_TXDSCR_NO_SNOOP)
@ -2035,12 +2140,14 @@ struct e1000_host_command_info {
#define EEPROM_INIT_CONTROL1_REG 0x000A #define EEPROM_INIT_CONTROL1_REG 0x000A
#define EEPROM_INIT_CONTROL2_REG 0x000F #define EEPROM_INIT_CONTROL2_REG 0x000F
#define EEPROM_INIT_CONTROL3_PORT_B 0x0014 #define EEPROM_INIT_CONTROL3_PORT_B 0x0014
#define EEPROM_INIT_3GIO_3 0x001A
#define EEPROM_INIT_CONTROL3_PORT_A 0x0024 #define EEPROM_INIT_CONTROL3_PORT_A 0x0024
#define EEPROM_CFG 0x0012 #define EEPROM_CFG 0x0012
#define EEPROM_FLASH_VERSION 0x0032 #define EEPROM_FLASH_VERSION 0x0032
#define EEPROM_CHECKSUM_REG 0x003F #define EEPROM_CHECKSUM_REG 0x003F
#define E1000_EEPROM_CFG_DONE 0x00040000 /* MNG config cycle done */ #define E1000_EEPROM_CFG_DONE 0x00040000 /* MNG config cycle done */
#define E1000_EEPROM_CFG_DONE_PORT_1 0x00080000 /* ...for second port */
/* Word definitions for ID LED Settings */ /* Word definitions for ID LED Settings */
#define ID_LED_RESERVED_0000 0x0000 #define ID_LED_RESERVED_0000 0x0000
@ -2084,6 +2191,9 @@ struct e1000_host_command_info {
#define EEPROM_WORD0F_ANE 0x0800 #define EEPROM_WORD0F_ANE 0x0800
#define EEPROM_WORD0F_SWPDIO_EXT 0x00F0 #define EEPROM_WORD0F_SWPDIO_EXT 0x00F0
/* Mask bits for fields in Word 0x1a of the EEPROM */
#define EEPROM_WORD1A_ASPM_MASK 0x000C
/* For checksumming, the sum of all words in the EEPROM should equal 0xBABA. */ /* For checksumming, the sum of all words in the EEPROM should equal 0xBABA. */
#define EEPROM_SUM 0xBABA #define EEPROM_SUM 0xBABA
@ -2126,8 +2236,11 @@ struct e1000_host_command_info {
#define DEFAULT_82542_TIPG_IPGR2 10 #define DEFAULT_82542_TIPG_IPGR2 10
#define DEFAULT_82543_TIPG_IPGR2 6 #define DEFAULT_82543_TIPG_IPGR2 6
#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7
#define E1000_TIPG_IPGR2_SHIFT 20 #define E1000_TIPG_IPGR2_SHIFT 20
#define DEFAULT_80003ES2LAN_TIPG_IPGT_10_100 0x00000009
#define DEFAULT_80003ES2LAN_TIPG_IPGT_1000 0x00000008
#define E1000_TXDMAC_DPP 0x00000001 #define E1000_TXDMAC_DPP 0x00000001
/* Adaptive IFS defines */ /* Adaptive IFS defines */
@ -2368,6 +2481,78 @@ struct e1000_host_command_info {
#define IGP01E1000_ANALOG_REGS_PAGE 0x20C0 #define IGP01E1000_ANALOG_REGS_PAGE 0x20C0
/* Bits...
* 15-5: page
* 4-0: register offset
*/
#define GG82563_PAGE_SHIFT 5
#define GG82563_REG(page, reg) \
(((page) << GG82563_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS))
#define GG82563_MIN_ALT_REG 30
/* GG82563 Specific Registers */
#define GG82563_PHY_SPEC_CTRL \
GG82563_REG(0, 16) /* PHY Specific Control */
#define GG82563_PHY_SPEC_STATUS \
GG82563_REG(0, 17) /* PHY Specific Status */
#define GG82563_PHY_INT_ENABLE \
GG82563_REG(0, 18) /* Interrupt Enable */
#define GG82563_PHY_SPEC_STATUS_2 \
GG82563_REG(0, 19) /* PHY Specific Status 2 */
#define GG82563_PHY_RX_ERR_CNTR \
GG82563_REG(0, 21) /* Receive Error Counter */
#define GG82563_PHY_PAGE_SELECT \
GG82563_REG(0, 22) /* Page Select */
#define GG82563_PHY_SPEC_CTRL_2 \
GG82563_REG(0, 26) /* PHY Specific Control 2 */
#define GG82563_PHY_PAGE_SELECT_ALT \
GG82563_REG(0, 29) /* Alternate Page Select */
#define GG82563_PHY_TEST_CLK_CTRL \
GG82563_REG(0, 30) /* Test Clock Control (use reg. 29 to select) */
#define GG82563_PHY_MAC_SPEC_CTRL \
GG82563_REG(2, 21) /* MAC Specific Control Register */
#define GG82563_PHY_MAC_SPEC_CTRL_2 \
GG82563_REG(2, 26) /* MAC Specific Control 2 */
#define GG82563_PHY_DSP_DISTANCE \
GG82563_REG(5, 26) /* DSP Distance */
/* Page 193 - Port Control Registers */
#define GG82563_PHY_KMRN_MODE_CTRL \
GG82563_REG(193, 16) /* Kumeran Mode Control */
#define GG82563_PHY_PORT_RESET \
GG82563_REG(193, 17) /* Port Reset */
#define GG82563_PHY_REVISION_ID \
GG82563_REG(193, 18) /* Revision ID */
#define GG82563_PHY_DEVICE_ID \
GG82563_REG(193, 19) /* Device ID */
#define GG82563_PHY_PWR_MGMT_CTRL \
GG82563_REG(193, 20) /* Power Management Control */
#define GG82563_PHY_RATE_ADAPT_CTRL \
GG82563_REG(193, 25) /* Rate Adaptation Control */
/* Page 194 - KMRN Registers */
#define GG82563_PHY_KMRN_FIFO_CTRL_STAT \
GG82563_REG(194, 16) /* FIFO's Control/Status */
#define GG82563_PHY_KMRN_CTRL \
GG82563_REG(194, 17) /* Control */
#define GG82563_PHY_INBAND_CTRL \
GG82563_REG(194, 18) /* Inband Control */
#define GG82563_PHY_KMRN_DIAGNOSTIC \
GG82563_REG(194, 19) /* Diagnostic */
#define GG82563_PHY_ACK_TIMEOUTS \
GG82563_REG(194, 20) /* Acknowledge Timeouts */
#define GG82563_PHY_ADV_ABILITY \
GG82563_REG(194, 21) /* Advertised Ability */
#define GG82563_PHY_LINK_PARTNER_ADV_ABILITY \
GG82563_REG(194, 23) /* Link Partner Advertised Ability */
#define GG82563_PHY_ADV_NEXT_PAGE \
GG82563_REG(194, 24) /* Advertised Next Page */
#define GG82563_PHY_LINK_PARTNER_ADV_NEXT_PAGE \
GG82563_REG(194, 25) /* Link Partner Advertised Next page */
#define GG82563_PHY_KMRN_MISC \
GG82563_REG(194, 26) /* Misc. */
/* PHY Control Register */ /* PHY Control Register */
#define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */ #define MII_CR_SPEED_SELECT_MSB 0x0040 /* bits 6,13: 10=1000, 01=100, 00=10 */
@ -2681,6 +2866,113 @@ struct e1000_host_command_info {
#define IGP01E1000_ANALOG_FUSE_FINE_1 0x0080 #define IGP01E1000_ANALOG_FUSE_FINE_1 0x0080
#define IGP01E1000_ANALOG_FUSE_FINE_10 0x0500 #define IGP01E1000_ANALOG_FUSE_FINE_10 0x0500
/* GG82563 PHY Specific Status Register (Page 0, Register 16 */
#define GG82563_PSCR_DISABLE_JABBER 0x0001 /* 1=Disable Jabber */
#define GG82563_PSCR_POLARITY_REVERSAL_DISABLE 0x0002 /* 1=Polarity Reversal Disabled */
#define GG82563_PSCR_POWER_DOWN 0x0004 /* 1=Power Down */
#define GG82563_PSCR_COPPER_TRANSMITER_DISABLE 0x0008 /* 1=Transmitter Disabled */
#define GG82563_PSCR_CROSSOVER_MODE_MASK 0x0060
#define GG82563_PSCR_CROSSOVER_MODE_MDI 0x0000 /* 00=Manual MDI configuration */
#define GG82563_PSCR_CROSSOVER_MODE_MDIX 0x0020 /* 01=Manual MDIX configuration */
#define GG82563_PSCR_CROSSOVER_MODE_AUTO 0x0060 /* 11=Automatic crossover */
#define GG82563_PSCR_ENALBE_EXTENDED_DISTANCE 0x0080 /* 1=Enable Extended Distance */
#define GG82563_PSCR_ENERGY_DETECT_MASK 0x0300
#define GG82563_PSCR_ENERGY_DETECT_OFF 0x0000 /* 00,01=Off */
#define GG82563_PSCR_ENERGY_DETECT_RX 0x0200 /* 10=Sense on Rx only (Energy Detect) */
#define GG82563_PSCR_ENERGY_DETECT_RX_TM 0x0300 /* 11=Sense and Tx NLP */
#define GG82563_PSCR_FORCE_LINK_GOOD 0x0400 /* 1=Force Link Good */
#define GG82563_PSCR_DOWNSHIFT_ENABLE 0x0800 /* 1=Enable Downshift */
#define GG82563_PSCR_DOWNSHIFT_COUNTER_MASK 0x7000
#define GG82563_PSCR_DOWNSHIFT_COUNTER_SHIFT 12
/* PHY Specific Status Register (Page 0, Register 17) */
#define GG82563_PSSR_JABBER 0x0001 /* 1=Jabber */
#define GG82563_PSSR_POLARITY 0x0002 /* 1=Polarity Reversed */
#define GG82563_PSSR_LINK 0x0008 /* 1=Link is Up */
#define GG82563_PSSR_ENERGY_DETECT 0x0010 /* 1=Sleep, 0=Active */
#define GG82563_PSSR_DOWNSHIFT 0x0020 /* 1=Downshift */
#define GG82563_PSSR_CROSSOVER_STATUS 0x0040 /* 1=MDIX, 0=MDI */
#define GG82563_PSSR_RX_PAUSE_ENABLED 0x0100 /* 1=Receive Pause Enabled */
#define GG82563_PSSR_TX_PAUSE_ENABLED 0x0200 /* 1=Transmit Pause Enabled */
#define GG82563_PSSR_LINK_UP 0x0400 /* 1=Link Up */
#define GG82563_PSSR_SPEED_DUPLEX_RESOLVED 0x0800 /* 1=Resolved */
#define GG82563_PSSR_PAGE_RECEIVED 0x1000 /* 1=Page Received */
#define GG82563_PSSR_DUPLEX 0x2000 /* 1-Full-Duplex */
#define GG82563_PSSR_SPEED_MASK 0xC000
#define GG82563_PSSR_SPEED_10MBPS 0x0000 /* 00=10Mbps */
#define GG82563_PSSR_SPEED_100MBPS 0x4000 /* 01=100Mbps */
#define GG82563_PSSR_SPEED_1000MBPS 0x8000 /* 10=1000Mbps */
/* PHY Specific Status Register 2 (Page 0, Register 19) */
#define GG82563_PSSR2_JABBER 0x0001 /* 1=Jabber */
#define GG82563_PSSR2_POLARITY_CHANGED 0x0002 /* 1=Polarity Changed */
#define GG82563_PSSR2_ENERGY_DETECT_CHANGED 0x0010 /* 1=Energy Detect Changed */
#define GG82563_PSSR2_DOWNSHIFT_INTERRUPT 0x0020 /* 1=Downshift Detected */
#define GG82563_PSSR2_MDI_CROSSOVER_CHANGE 0x0040 /* 1=Crossover Changed */
#define GG82563_PSSR2_FALSE_CARRIER 0x0100 /* 1=False Carrier */
#define GG82563_PSSR2_SYMBOL_ERROR 0x0200 /* 1=Symbol Error */
#define GG82563_PSSR2_LINK_STATUS_CHANGED 0x0400 /* 1=Link Status Changed */
#define GG82563_PSSR2_AUTO_NEG_COMPLETED 0x0800 /* 1=Auto-Neg Completed */
#define GG82563_PSSR2_PAGE_RECEIVED 0x1000 /* 1=Page Received */
#define GG82563_PSSR2_DUPLEX_CHANGED 0x2000 /* 1=Duplex Changed */
#define GG82563_PSSR2_SPEED_CHANGED 0x4000 /* 1=Speed Changed */
#define GG82563_PSSR2_AUTO_NEG_ERROR 0x8000 /* 1=Auto-Neg Error */
/* PHY Specific Control Register 2 (Page 0, Register 26) */
#define GG82563_PSCR2_10BT_POLARITY_FORCE 0x0002 /* 1=Force Negative Polarity */
#define GG82563_PSCR2_1000MB_TEST_SELECT_MASK 0x000C
#define GG82563_PSCR2_1000MB_TEST_SELECT_NORMAL 0x0000 /* 00,01=Normal Operation */
#define GG82563_PSCR2_1000MB_TEST_SELECT_112NS 0x0008 /* 10=Select 112ns Sequence */
#define GG82563_PSCR2_1000MB_TEST_SELECT_16NS 0x000C /* 11=Select 16ns Sequence */
#define GG82563_PSCR2_REVERSE_AUTO_NEG 0x2000 /* 1=Reverse Auto-Negotiation */
#define GG82563_PSCR2_1000BT_DISABLE 0x4000 /* 1=Disable 1000BASE-T */
#define GG82563_PSCR2_TRANSMITER_TYPE_MASK 0x8000
#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_B 0x0000 /* 0=Class B */
#define GG82563_PSCR2_TRANSMITTER_TYPE_CLASS_A 0x8000 /* 1=Class A */
/* MAC Specific Control Register (Page 2, Register 21) */
/* Tx clock speed for Link Down and 1000BASE-T for the following speeds */
#define GG82563_MSCR_TX_CLK_MASK 0x0007
#define GG82563_MSCR_TX_CLK_10MBPS_2_5MHZ 0x0004
#define GG82563_MSCR_TX_CLK_100MBPS_25MHZ 0x0005
#define GG82563_MSCR_TX_CLK_1000MBPS_2_5MHZ 0x0006
#define GG82563_MSCR_TX_CLK_1000MBPS_25MHZ 0x0007
#define GG82563_MSCR_ASSERT_CRS_ON_TX 0x0010 /* 1=Assert */
/* DSP Distance Register (Page 5, Register 26) */
#define GG82563_DSPD_CABLE_LENGTH 0x0007 /* 0 = <50M;
1 = 50-80M;
2 = 80-110M;
3 = 110-140M;
4 = >140M */
/* Kumeran Mode Control Register (Page 193, Register 16) */
#define GG82563_KMCR_PHY_LEDS_EN 0x0020 /* 1=PHY LEDs, 0=Kumeran Inband LEDs */
#define GG82563_KMCR_FORCE_LINK_UP 0x0040 /* 1=Force Link Up */
#define GG82563_KMCR_SUPPRESS_SGMII_EPD_EXT 0x0080
#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT_MASK 0x0400
#define GG82563_KMCR_MDIO_BUS_SPEED_SELECT 0x0400 /* 1=6.25MHz, 0=0.8MHz */
#define GG82563_KMCR_PASS_FALSE_CARRIER 0x0800
/* Power Management Control Register (Page 193, Register 20) */
#define GG82563_PMCR_ENABLE_ELECTRICAL_IDLE 0x0001 /* 1=Enalbe SERDES Electrical Idle */
#define GG82563_PMCR_DISABLE_PORT 0x0002 /* 1=Disable Port */
#define GG82563_PMCR_DISABLE_SERDES 0x0004 /* 1=Disable SERDES */
#define GG82563_PMCR_REVERSE_AUTO_NEG 0x0008 /* 1=Enable Reverse Auto-Negotiation */
#define GG82563_PMCR_DISABLE_1000_NON_D0 0x0010 /* 1=Disable 1000Mbps Auto-Neg in non D0 */
#define GG82563_PMCR_DISABLE_1000 0x0020 /* 1=Disable 1000Mbps Auto-Neg Always */
#define GG82563_PMCR_REVERSE_AUTO_NEG_D0A 0x0040 /* 1=Enable D0a Reverse Auto-Negotiation */
#define GG82563_PMCR_FORCE_POWER_STATE 0x0080 /* 1=Force Power State */
#define GG82563_PMCR_PROGRAMMED_POWER_STATE_MASK 0x0300
#define GG82563_PMCR_PROGRAMMED_POWER_STATE_DR 0x0000 /* 00=Dr */
#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0U 0x0100 /* 01=D0u */
#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D0A 0x0200 /* 10=D0a */
#define GG82563_PMCR_PROGRAMMED_POWER_STATE_D3 0x0300 /* 11=D3 */
/* In-Band Control Register (Page 194, Register 18) */
#define GG82563_ICR_DIS_PADDING 0x0010 /* Disable Padding Use */
/* Bit definitions for valid PHY IDs. */ /* Bit definitions for valid PHY IDs. */
/* I = Integrated /* I = Integrated
@ -2695,6 +2987,7 @@ struct e1000_host_command_info {
#define M88E1011_I_REV_4 0x04 #define M88E1011_I_REV_4 0x04
#define M88E1111_I_PHY_ID 0x01410CC0 #define M88E1111_I_PHY_ID 0x01410CC0
#define L1LXT971A_PHY_ID 0x001378E0 #define L1LXT971A_PHY_ID 0x001378E0
#define GG82563_E_PHY_ID 0x01410CA0
/* Miscellaneous PHY bit definitions. */ /* Miscellaneous PHY bit definitions. */
#define PHY_PREAMBLE 0xFFFFFFFF #define PHY_PREAMBLE 0xFFFFFFFF

File diff suppressed because it is too large Load diff

View file

@ -268,7 +268,7 @@ e1000_validate_option(int *value, struct e1000_option *opt,
BUG(); BUG();
} }
DPRINTK(PROBE, INFO, "Invalid %s specified (%i) %s\n", DPRINTK(PROBE, INFO, "Invalid %s value specified (%i) %s\n",
opt->name, *value, opt->err); opt->name, *value, opt->err);
*value = opt->def; *value = opt->def;
return -1; return -1;

View file

@ -27,7 +27,7 @@
rx_align support: enables rx DMA without causing unaligned accesses. rx_align support: enables rx DMA without causing unaligned accesses.
*/ */
static const char *version = static const char * const version =
"eepro100.c:v1.09j-t 9/29/99 Donald Becker http://www.scyld.com/network/eepro100.html\n" "eepro100.c:v1.09j-t 9/29/99 Donald Becker http://www.scyld.com/network/eepro100.html\n"
"eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin <saw@saw.sw.com.sg> and others\n"; "eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin <saw@saw.sw.com.sg> and others\n";
@ -469,7 +469,7 @@ static const char i82558_config_cmd[CONFIG_DATA_SIZE] = {
0x31, 0x05, }; 0x31, 0x05, };
/* PHY media interface chips. */ /* PHY media interface chips. */
static const char *phys[] = { static const char * const phys[] = {
"None", "i82553-A/B", "i82553-C", "i82503", "None", "i82553-A/B", "i82553-C", "i82503",
"DP83840", "80c240", "80c24", "i82555", "DP83840", "80c240", "80c24", "i82555",
"unknown-8", "unknown-9", "DP83840A", "unknown-11", "unknown-8", "unknown-9", "DP83840A", "unknown-11",

View file

@ -225,7 +225,7 @@ struct epic_chip_info {
/* indexed by chip_t */ /* indexed by chip_t */
static struct epic_chip_info pci_id_tbl[] = { static const struct epic_chip_info pci_id_tbl[] = {
{ "SMSC EPIC/100 83c170", { "SMSC EPIC/100 83c170",
EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR | NO_MII | MII_PWRDWN }, EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR | NO_MII | MII_PWRDWN },
{ "SMSC EPIC/100 83c170", { "SMSC EPIC/100 83c170",
@ -291,7 +291,7 @@ enum CommandBits {
RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull) RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull)
#define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent) #define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent)
static u16 media2miictl[16] = { static const u16 media2miictl[16] = {
0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0, 0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0 }; 0, 0, 0, 0, 0, 0, 0, 0 };

View file

@ -161,6 +161,7 @@ static char *version =
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -754,7 +755,7 @@ static void eth16i_set_port(int ioaddr, int porttype)
static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l) static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
{ {
int starttime; unsigned long starttime;
outb(0xff, ioaddr + TX_STATUS_REG); outb(0xff, ioaddr + TX_STATUS_REG);
@ -765,7 +766,7 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
outb(TX_START | 1, ioaddr + TRANSMIT_START_REG); outb(TX_START | 1, ioaddr + TRANSMIT_START_REG);
while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) { while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
return -1; return -1;
} }
} }
@ -775,18 +776,18 @@ static int eth16i_send_probe_packet(int ioaddr, unsigned char *b, int l)
static int eth16i_receive_probe_packet(int ioaddr) static int eth16i_receive_probe_packet(int ioaddr)
{ {
int starttime; unsigned long starttime;
starttime = jiffies; starttime = jiffies;
while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) { while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
if(eth16i_debug > 1) if(eth16i_debug > 1)
printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n"); printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
starttime = jiffies; starttime = jiffies;
while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) { while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) { if( time_after(jiffies, starttime + TX_TIMEOUT)) {
if(eth16i_debug > 1) if(eth16i_debug > 1)
printk(KERN_DEBUG "Timeout occurred waiting receive packet\n"); printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
return -1; return -1;

View file

@ -160,7 +160,7 @@ struct chip_info {
int flags; int flags;
}; };
static struct chip_info skel_netdrv_tbl[] = { static const struct chip_info skel_netdrv_tbl[] = {
{"100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, {"100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR},
{"100/10M Ethernet PCI Adapter", 136, HAS_CHIP_XCVR}, {"100/10M Ethernet PCI Adapter", 136, HAS_CHIP_XCVR},
{"1000/100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, {"1000/100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR},

View file

@ -102,6 +102,9 @@
* 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
* 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single * 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single
* 0.49: 10 Dec 2005: Fix tso for large buffers. * 0.49: 10 Dec 2005: Fix tso for large buffers.
* 0.50: 20 Jan 2006: Add 8021pq tagging support.
* 0.51: 20 Jan 2006: Add 64bit consistent memory allocation for rings.
* 0.52: 20 Jan 2006: Add MSI/MSIX support.
* *
* Known bugs: * Known bugs:
* We suspect that on some hardware no TX done interrupts are generated. * We suspect that on some hardware no TX done interrupts are generated.
@ -113,7 +116,7 @@
* DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
* superfluous timer interrupts from the nic. * superfluous timer interrupts from the nic.
*/ */
#define FORCEDETH_VERSION "0.49" #define FORCEDETH_VERSION "0.52"
#define DRV_NAME "forcedeth" #define DRV_NAME "forcedeth"
#include <linux/module.h> #include <linux/module.h>
@ -153,6 +156,9 @@
#define DEV_HAS_LARGEDESC 0x0004 /* device supports jumbo frames and needs packet format 2 */ #define DEV_HAS_LARGEDESC 0x0004 /* device supports jumbo frames and needs packet format 2 */
#define DEV_HAS_HIGH_DMA 0x0008 /* device supports 64bit dma */ #define DEV_HAS_HIGH_DMA 0x0008 /* device supports 64bit dma */
#define DEV_HAS_CHECKSUM 0x0010 /* device supports tx and rx checksum offloads */ #define DEV_HAS_CHECKSUM 0x0010 /* device supports tx and rx checksum offloads */
#define DEV_HAS_VLAN 0x0020 /* device supports vlan tagging and striping */
#define DEV_HAS_MSI 0x0040 /* device supports MSI */
#define DEV_HAS_MSI_X 0x0080 /* device supports MSI-X */
enum { enum {
NvRegIrqStatus = 0x000, NvRegIrqStatus = 0x000,
@ -166,14 +172,17 @@ enum {
#define NVREG_IRQ_TX_OK 0x0010 #define NVREG_IRQ_TX_OK 0x0010
#define NVREG_IRQ_TIMER 0x0020 #define NVREG_IRQ_TIMER 0x0020
#define NVREG_IRQ_LINK 0x0040 #define NVREG_IRQ_LINK 0x0040
#define NVREG_IRQ_TX_ERROR 0x0080 #define NVREG_IRQ_RX_FORCED 0x0080
#define NVREG_IRQ_TX1 0x0100 #define NVREG_IRQ_TX_FORCED 0x0100
#define NVREG_IRQMASK_THROUGHPUT 0x00df #define NVREG_IRQMASK_THROUGHPUT 0x00df
#define NVREG_IRQMASK_CPU 0x0040 #define NVREG_IRQMASK_CPU 0x0040
#define NVREG_IRQ_TX_ALL (NVREG_IRQ_TX_ERR|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_FORCED)
#define NVREG_IRQ_RX_ALL (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_RX_FORCED)
#define NVREG_IRQ_OTHER (NVREG_IRQ_TIMER|NVREG_IRQ_LINK)
#define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \ #define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \
NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \ NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_RX_FORCED| \
NVREG_IRQ_TX1)) NVREG_IRQ_TX_FORCED))
NvRegUnknownSetupReg6 = 0x008, NvRegUnknownSetupReg6 = 0x008,
#define NVREG_UNKSETUP6_VAL 3 #define NVREG_UNKSETUP6_VAL 3
@ -185,6 +194,10 @@ enum {
NvRegPollingInterval = 0x00c, NvRegPollingInterval = 0x00c,
#define NVREG_POLL_DEFAULT_THROUGHPUT 970 #define NVREG_POLL_DEFAULT_THROUGHPUT 970
#define NVREG_POLL_DEFAULT_CPU 13 #define NVREG_POLL_DEFAULT_CPU 13
NvRegMSIMap0 = 0x020,
NvRegMSIMap1 = 0x024,
NvRegMSIIrqMask = 0x030,
#define NVREG_MSI_VECTOR_0_ENABLED 0x01
NvRegMisc1 = 0x080, NvRegMisc1 = 0x080,
#define NVREG_MISC1_HD 0x02 #define NVREG_MISC1_HD 0x02
#define NVREG_MISC1_FORCE 0x3b0f3c #define NVREG_MISC1_FORCE 0x3b0f3c
@ -254,6 +267,10 @@ enum {
#define NVREG_TXRXCTL_DESC_1 0 #define NVREG_TXRXCTL_DESC_1 0
#define NVREG_TXRXCTL_DESC_2 0x02100 #define NVREG_TXRXCTL_DESC_2 0x02100
#define NVREG_TXRXCTL_DESC_3 0x02200 #define NVREG_TXRXCTL_DESC_3 0x02200
#define NVREG_TXRXCTL_VLANSTRIP 0x00040
#define NVREG_TXRXCTL_VLANINS 0x00080
NvRegTxRingPhysAddrHigh = 0x148,
NvRegRxRingPhysAddrHigh = 0x14C,
NvRegMIIStatus = 0x180, NvRegMIIStatus = 0x180,
#define NVREG_MIISTAT_ERROR 0x0001 #define NVREG_MIISTAT_ERROR 0x0001
#define NVREG_MIISTAT_LINKCHANGE 0x0008 #define NVREG_MIISTAT_LINKCHANGE 0x0008
@ -303,6 +320,11 @@ enum {
#define NVREG_POWERSTATE_D1 0x0001 #define NVREG_POWERSTATE_D1 0x0001
#define NVREG_POWERSTATE_D2 0x0002 #define NVREG_POWERSTATE_D2 0x0002
#define NVREG_POWERSTATE_D3 0x0003 #define NVREG_POWERSTATE_D3 0x0003
NvRegVlanControl = 0x300,
#define NVREG_VLANCONTROL_ENABLE 0x2000
NvRegMSIXMap0 = 0x3e0,
NvRegMSIXMap1 = 0x3e4,
NvRegMSIXIrqStatus = 0x3f0,
}; };
/* Big endian: should work, but is untested */ /* Big endian: should work, but is untested */
@ -314,7 +336,7 @@ struct ring_desc {
struct ring_desc_ex { struct ring_desc_ex {
u32 PacketBufferHigh; u32 PacketBufferHigh;
u32 PacketBufferLow; u32 PacketBufferLow;
u32 Reserved; u32 TxVlan;
u32 FlagLen; u32 FlagLen;
}; };
@ -355,6 +377,8 @@ typedef union _ring_type {
#define NV_TX2_CHECKSUM_L3 (1<<27) #define NV_TX2_CHECKSUM_L3 (1<<27)
#define NV_TX2_CHECKSUM_L4 (1<<26) #define NV_TX2_CHECKSUM_L4 (1<<26)
#define NV_TX3_VLAN_TAG_PRESENT (1<<18)
#define NV_RX_DESCRIPTORVALID (1<<16) #define NV_RX_DESCRIPTORVALID (1<<16)
#define NV_RX_MISSEDFRAME (1<<17) #define NV_RX_MISSEDFRAME (1<<17)
#define NV_RX_SUBSTRACT1 (1<<18) #define NV_RX_SUBSTRACT1 (1<<18)
@ -385,6 +409,9 @@ typedef union _ring_type {
#define NV_RX2_ERROR (1<<30) #define NV_RX2_ERROR (1<<30)
#define NV_RX2_AVAIL (1<<31) #define NV_RX2_AVAIL (1<<31)
#define NV_RX3_VLAN_TAG_PRESENT (1<<16)
#define NV_RX3_VLAN_TAG_MASK (0x0000FFFF)
/* Miscelaneous hardware related defines: */ /* Miscelaneous hardware related defines: */
#define NV_PCI_REGSZ 0x270 #define NV_PCI_REGSZ 0x270
@ -475,6 +502,18 @@ typedef union _ring_type {
#define LPA_1000FULL 0x0800 #define LPA_1000FULL 0x0800
#define LPA_1000HALF 0x0400 #define LPA_1000HALF 0x0400
/* MSI/MSI-X defines */
#define NV_MSI_X_MAX_VECTORS 8
#define NV_MSI_X_VECTORS_MASK 0x000f
#define NV_MSI_CAPABLE 0x0010
#define NV_MSI_X_CAPABLE 0x0020
#define NV_MSI_ENABLED 0x0040
#define NV_MSI_X_ENABLED 0x0080
#define NV_MSI_X_VECTOR_ALL 0x0
#define NV_MSI_X_VECTOR_RX 0x0
#define NV_MSI_X_VECTOR_TX 0x1
#define NV_MSI_X_VECTOR_OTHER 0x2
/* /*
* SMP locking: * SMP locking:
@ -511,6 +550,7 @@ struct fe_priv {
u32 irqmask; u32 irqmask;
u32 desc_ver; u32 desc_ver;
u32 txrxctl_bits; u32 txrxctl_bits;
u32 vlanctl_bits;
void __iomem *base; void __iomem *base;
@ -525,6 +565,7 @@ struct fe_priv {
unsigned int pkt_limit; unsigned int pkt_limit;
struct timer_list oom_kick; struct timer_list oom_kick;
struct timer_list nic_poll; struct timer_list nic_poll;
u32 nic_poll_irq;
/* media detection workaround. /* media detection workaround.
* Locking: Within irq hander or disable_irq+spin_lock(&np->lock); * Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
@ -540,6 +581,13 @@ struct fe_priv {
dma_addr_t tx_dma[TX_RING]; dma_addr_t tx_dma[TX_RING];
unsigned int tx_dma_len[TX_RING]; unsigned int tx_dma_len[TX_RING];
u32 tx_flags; u32 tx_flags;
/* vlan fields */
struct vlan_group *vlangrp;
/* msi/msi-x fields */
u32 msi_flags;
struct msix_entry msi_x_entry[NV_MSI_X_MAX_VECTORS];
}; };
/* /*
@ -567,6 +615,16 @@ static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT;
*/ */
static int poll_interval = -1; static int poll_interval = -1;
/*
* Disable MSI interrupts
*/
static int disable_msi = 0;
/*
* Disable MSIX interrupts
*/
static int disable_msix = 0;
static inline struct fe_priv *get_nvpriv(struct net_device *dev) static inline struct fe_priv *get_nvpriv(struct net_device *dev)
{ {
return netdev_priv(dev); return netdev_priv(dev);
@ -612,6 +670,33 @@ static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
return 0; return 0;
} }
#define NV_SETUP_RX_RING 0x01
#define NV_SETUP_TX_RING 0x02
static void setup_hw_rings(struct net_device *dev, int rxtx_flags)
{
struct fe_priv *np = get_nvpriv(dev);
u8 __iomem *base = get_hwbase(dev);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
if (rxtx_flags & NV_SETUP_RX_RING) {
writel((u32) cpu_to_le64(np->ring_addr), base + NvRegRxRingPhysAddr);
}
if (rxtx_flags & NV_SETUP_TX_RING) {
writel((u32) cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
}
} else {
if (rxtx_flags & NV_SETUP_RX_RING) {
writel((u32) cpu_to_le64(np->ring_addr), base + NvRegRxRingPhysAddr);
writel((u32) (cpu_to_le64(np->ring_addr) >> 32), base + NvRegRxRingPhysAddrHigh);
}
if (rxtx_flags & NV_SETUP_TX_RING) {
writel((u32) cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr);
writel((u32) (cpu_to_le64(np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)) >> 32), base + NvRegTxRingPhysAddrHigh);
}
}
}
#define MII_READ (-1) #define MII_READ (-1)
/* mii_rw: read/write a register on the PHY. /* mii_rw: read/write a register on the PHY.
* *
@ -903,14 +988,27 @@ static void nv_do_rx_refill(unsigned long data)
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
disable_irq(dev->irq); disable_irq(dev->irq);
} else {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
}
if (nv_alloc_rx(dev)) { if (nv_alloc_rx(dev)) {
spin_lock(&np->lock); spin_lock(&np->lock);
if (!np->in_shutdown) if (!np->in_shutdown)
mod_timer(&np->oom_kick, jiffies + OOM_REFILL); mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
spin_unlock(&np->lock); spin_unlock(&np->lock);
} }
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
enable_irq(dev->irq); enable_irq(dev->irq);
} else {
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
}
} }
static void nv_init_rx(struct net_device *dev) static void nv_init_rx(struct net_device *dev)
@ -965,7 +1063,7 @@ static int nv_release_txskb(struct net_device *dev, unsigned int skbnr)
} }
if (np->tx_skbuff[skbnr]) { if (np->tx_skbuff[skbnr]) {
dev_kfree_skb_irq(np->tx_skbuff[skbnr]); dev_kfree_skb_any(np->tx_skbuff[skbnr]);
np->tx_skbuff[skbnr] = NULL; np->tx_skbuff[skbnr] = NULL;
return 1; return 1;
} else { } else {
@ -1031,6 +1129,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
u32 bcnt; u32 bcnt;
u32 size = skb->len-skb->data_len; u32 size = skb->len-skb->data_len;
u32 entries = (size >> NV_TX2_TSO_MAX_SHIFT) + ((size & (NV_TX2_TSO_MAX_SIZE-1)) ? 1 : 0); u32 entries = (size >> NV_TX2_TSO_MAX_SHIFT) + ((size & (NV_TX2_TSO_MAX_SIZE-1)) ? 1 : 0);
u32 tx_flags_vlan = 0;
/* add fragments to entries count */ /* add fragments to entries count */
for (i = 0; i < fragments; i++) { for (i = 0; i < fragments; i++) {
@ -1111,10 +1210,16 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
#endif #endif
tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0);
/* vlan tag */
if (np->vlangrp && vlan_tx_tag_present(skb)) {
tx_flags_vlan = NV_TX3_VLAN_TAG_PRESENT | vlan_tx_tag_get(skb);
}
/* set tx flags */ /* set tx flags */
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) {
np->tx_ring.orig[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); np->tx_ring.orig[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra);
} else { } else {
np->tx_ring.ex[start_nr].TxVlan = cpu_to_le32(tx_flags_vlan);
np->tx_ring.ex[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); np->tx_ring.ex[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra);
} }
@ -1209,9 +1314,14 @@ static void nv_tx_timeout(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
u32 status;
printk(KERN_INFO "%s: Got tx_timeout. irq: %08x\n", dev->name, if (np->msi_flags & NV_MSI_X_ENABLED)
readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK); status = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK;
else
status = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
printk(KERN_INFO "%s: Got tx_timeout. irq: %08x\n", dev->name, status);
{ {
int i; int i;
@ -1273,10 +1383,7 @@ static void nv_tx_timeout(struct net_device *dev)
printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name); printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name);
nv_drain_tx(dev); nv_drain_tx(dev);
np->next_tx = np->nic_tx = 0; np->next_tx = np->nic_tx = 0;
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) setup_hw_rings(dev, NV_SETUP_TX_RING);
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
else
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr);
netif_wake_queue(dev); netif_wake_queue(dev);
} }
@ -1342,6 +1449,8 @@ static void nv_rx_process(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
u32 Flags; u32 Flags;
u32 vlanflags = 0;
for (;;) { for (;;) {
struct sk_buff *skb; struct sk_buff *skb;
@ -1357,6 +1466,7 @@ static void nv_rx_process(struct net_device *dev)
} else { } else {
Flags = le32_to_cpu(np->rx_ring.ex[i].FlagLen); Flags = le32_to_cpu(np->rx_ring.ex[i].FlagLen);
len = nv_descr_getlength_ex(&np->rx_ring.ex[i], np->desc_ver); len = nv_descr_getlength_ex(&np->rx_ring.ex[i], np->desc_ver);
vlanflags = le32_to_cpu(np->rx_ring.ex[i].PacketBufferLow);
} }
dprintk(KERN_DEBUG "%s: nv_rx_process: looking at packet %d, Flags 0x%x.\n", dprintk(KERN_DEBUG "%s: nv_rx_process: looking at packet %d, Flags 0x%x.\n",
@ -1474,7 +1584,11 @@ static void nv_rx_process(struct net_device *dev)
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
dprintk(KERN_DEBUG "%s: nv_rx_process: packet %d with %d bytes, proto %d accepted.\n", dprintk(KERN_DEBUG "%s: nv_rx_process: packet %d with %d bytes, proto %d accepted.\n",
dev->name, np->cur_rx, len, skb->protocol); dev->name, np->cur_rx, len, skb->protocol);
if (np->vlangrp && (vlanflags & NV_RX3_VLAN_TAG_PRESENT)) {
vlan_hwaccel_rx(skb, np->vlangrp, vlanflags & NV_RX3_VLAN_TAG_MASK);
} else {
netif_rx(skb); netif_rx(skb);
}
dev->last_rx = jiffies; dev->last_rx = jiffies;
np->stats.rx_packets++; np->stats.rx_packets++;
np->stats.rx_bytes += len; np->stats.rx_bytes += len;
@ -1523,7 +1637,15 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
* guessed, there is probably a simpler approach. * guessed, there is probably a simpler approach.
* Changing the MTU is a rare event, it shouldn't matter. * Changing the MTU is a rare event, it shouldn't matter.
*/ */
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
disable_irq(dev->irq); disable_irq(dev->irq);
} else {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector);
}
spin_lock_bh(&dev->xmit_lock); spin_lock_bh(&dev->xmit_lock);
spin_lock(&np->lock); spin_lock(&np->lock);
/* stop engines */ /* stop engines */
@ -1544,11 +1666,7 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
} }
/* reinit nic view of the rx queue */ /* reinit nic view of the rx queue */
writel(np->rx_buf_sz, base + NvRegOffloadConfig); writel(np->rx_buf_sz, base + NvRegOffloadConfig);
writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr); setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
else
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr);
writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
base + NvRegRingSizes); base + NvRegRingSizes);
pci_push(base); pci_push(base);
@ -1560,7 +1678,15 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
nv_start_tx(dev); nv_start_tx(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
spin_unlock_bh(&dev->xmit_lock); spin_unlock_bh(&dev->xmit_lock);
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
enable_irq(dev->irq); enable_irq(dev->irq);
} else {
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector);
}
} }
return 0; return 0;
} }
@ -1866,8 +1992,13 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
dprintk(KERN_DEBUG "%s: nv_nic_irq\n", dev->name); dprintk(KERN_DEBUG "%s: nv_nic_irq\n", dev->name);
for (i=0; ; i++) { for (i=0; ; i++) {
if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK; events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
} else {
events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK;
writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
}
pci_push(base); pci_push(base);
dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events); dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events);
if (!(events & np->irqmask)) if (!(events & np->irqmask))
@ -1907,11 +2038,16 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
if (i > max_interrupt_work) { if (i > max_interrupt_work) {
spin_lock(&np->lock); spin_lock(&np->lock);
/* disable interrupts on the nic */ /* disable interrupts on the nic */
if (!(np->msi_flags & NV_MSI_X_ENABLED))
writel(0, base + NvRegIrqMask); writel(0, base + NvRegIrqMask);
else
writel(np->irqmask, base + NvRegIrqMask);
pci_push(base); pci_push(base);
if (!np->in_shutdown) if (!np->in_shutdown) {
np->nic_poll_irq = np->irqmask;
mod_timer(&np->nic_poll, jiffies + POLL_WAIT); mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
}
printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i); printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
spin_unlock(&np->lock); spin_unlock(&np->lock);
break; break;
@ -1923,22 +2059,212 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
return IRQ_RETVAL(i); return IRQ_RETVAL(i);
} }
static irqreturn_t nv_nic_irq_tx(int foo, void *data, struct pt_regs *regs)
{
struct net_device *dev = (struct net_device *) data;
struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
u32 events;
int i;
dprintk(KERN_DEBUG "%s: nv_nic_irq_tx\n", dev->name);
for (i=0; ; i++) {
events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_TX_ALL;
writel(NVREG_IRQ_TX_ALL, base + NvRegMSIXIrqStatus);
pci_push(base);
dprintk(KERN_DEBUG "%s: tx irq: %08x\n", dev->name, events);
if (!(events & np->irqmask))
break;
spin_lock(&np->lock);
nv_tx_done(dev);
spin_unlock(&np->lock);
if (events & (NVREG_IRQ_TX_ERR)) {
dprintk(KERN_DEBUG "%s: received irq with events 0x%x. Probably TX fail.\n",
dev->name, events);
}
if (i > max_interrupt_work) {
spin_lock(&np->lock);
/* disable interrupts on the nic */
writel(NVREG_IRQ_TX_ALL, base + NvRegIrqMask);
pci_push(base);
if (!np->in_shutdown) {
np->nic_poll_irq |= NVREG_IRQ_TX_ALL;
mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
}
printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_tx.\n", dev->name, i);
spin_unlock(&np->lock);
break;
}
}
dprintk(KERN_DEBUG "%s: nv_nic_irq_tx completed\n", dev->name);
return IRQ_RETVAL(i);
}
static irqreturn_t nv_nic_irq_rx(int foo, void *data, struct pt_regs *regs)
{
struct net_device *dev = (struct net_device *) data;
struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
u32 events;
int i;
dprintk(KERN_DEBUG "%s: nv_nic_irq_rx\n", dev->name);
for (i=0; ; i++) {
events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_RX_ALL;
writel(NVREG_IRQ_RX_ALL, base + NvRegMSIXIrqStatus);
pci_push(base);
dprintk(KERN_DEBUG "%s: rx irq: %08x\n", dev->name, events);
if (!(events & np->irqmask))
break;
nv_rx_process(dev);
if (nv_alloc_rx(dev)) {
spin_lock(&np->lock);
if (!np->in_shutdown)
mod_timer(&np->oom_kick, jiffies + OOM_REFILL);
spin_unlock(&np->lock);
}
if (i > max_interrupt_work) {
spin_lock(&np->lock);
/* disable interrupts on the nic */
writel(NVREG_IRQ_RX_ALL, base + NvRegIrqMask);
pci_push(base);
if (!np->in_shutdown) {
np->nic_poll_irq |= NVREG_IRQ_RX_ALL;
mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
}
printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_rx.\n", dev->name, i);
spin_unlock(&np->lock);
break;
}
}
dprintk(KERN_DEBUG "%s: nv_nic_irq_rx completed\n", dev->name);
return IRQ_RETVAL(i);
}
static irqreturn_t nv_nic_irq_other(int foo, void *data, struct pt_regs *regs)
{
struct net_device *dev = (struct net_device *) data;
struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev);
u32 events;
int i;
dprintk(KERN_DEBUG "%s: nv_nic_irq_other\n", dev->name);
for (i=0; ; i++) {
events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQ_OTHER;
writel(NVREG_IRQ_OTHER, base + NvRegMSIXIrqStatus);
pci_push(base);
dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events);
if (!(events & np->irqmask))
break;
if (events & NVREG_IRQ_LINK) {
spin_lock(&np->lock);
nv_link_irq(dev);
spin_unlock(&np->lock);
}
if (np->need_linktimer && time_after(jiffies, np->link_timeout)) {
spin_lock(&np->lock);
nv_linkchange(dev);
spin_unlock(&np->lock);
np->link_timeout = jiffies + LINK_TIMEOUT;
}
if (events & (NVREG_IRQ_UNKNOWN)) {
printk(KERN_DEBUG "%s: received irq with unknown events 0x%x. Please report\n",
dev->name, events);
}
if (i > max_interrupt_work) {
spin_lock(&np->lock);
/* disable interrupts on the nic */
writel(NVREG_IRQ_OTHER, base + NvRegIrqMask);
pci_push(base);
if (!np->in_shutdown) {
np->nic_poll_irq |= NVREG_IRQ_OTHER;
mod_timer(&np->nic_poll, jiffies + POLL_WAIT);
}
printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq_other.\n", dev->name, i);
spin_unlock(&np->lock);
break;
}
}
dprintk(KERN_DEBUG "%s: nv_nic_irq_other completed\n", dev->name);
return IRQ_RETVAL(i);
}
static void nv_do_nic_poll(unsigned long data) static void nv_do_nic_poll(unsigned long data)
{ {
struct net_device *dev = (struct net_device *) data; struct net_device *dev = (struct net_device *) data;
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
u32 mask = 0;
disable_irq(dev->irq);
/* FIXME: Do we need synchronize_irq(dev->irq) here? */
/* /*
* First disable irq(s) and then
* reenable interrupts on the nic, we have to do this before calling * reenable interrupts on the nic, we have to do this before calling
* nv_nic_irq because that may decide to do otherwise * nv_nic_irq because that may decide to do otherwise
*/ */
writel(np->irqmask, base + NvRegIrqMask);
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
disable_irq(dev->irq);
mask = np->irqmask;
} else {
if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
mask |= NVREG_IRQ_RX_ALL;
}
if (np->nic_poll_irq & NVREG_IRQ_TX_ALL) {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
mask |= NVREG_IRQ_TX_ALL;
}
if (np->nic_poll_irq & NVREG_IRQ_OTHER) {
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector);
mask |= NVREG_IRQ_OTHER;
}
}
np->nic_poll_irq = 0;
/* FIXME: Do we need synchronize_irq(dev->irq) here? */
writel(mask, base + NvRegIrqMask);
pci_push(base); pci_push(base);
if (!(np->msi_flags & NV_MSI_X_ENABLED) ||
((np->msi_flags & NV_MSI_X_ENABLED) &&
((np->msi_flags & NV_MSI_X_VECTORS_MASK) == 0x1))) {
nv_nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL); nv_nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL);
enable_irq(dev->irq); enable_irq(dev->irq);
} else {
if (np->nic_poll_irq & NVREG_IRQ_RX_ALL) {
nv_nic_irq_rx((int) 0, (void *) data, (struct pt_regs *) NULL);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
}
if (np->nic_poll_irq & NVREG_IRQ_TX_ALL) {
nv_nic_irq_tx((int) 0, (void *) data, (struct pt_regs *) NULL);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector);
}
if (np->nic_poll_irq & NVREG_IRQ_OTHER) {
nv_nic_irq_other((int) 0, (void *) data, (struct pt_regs *) NULL);
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector);
}
}
} }
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
@ -2217,11 +2543,66 @@ static struct ethtool_ops ops = {
.get_perm_addr = ethtool_op_get_perm_addr, .get_perm_addr = ethtool_op_get_perm_addr,
}; };
static void nv_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
{
struct fe_priv *np = get_nvpriv(dev);
spin_lock_irq(&np->lock);
/* save vlan group */
np->vlangrp = grp;
if (grp) {
/* enable vlan on MAC */
np->txrxctl_bits |= NVREG_TXRXCTL_VLANSTRIP | NVREG_TXRXCTL_VLANINS;
} else {
/* disable vlan on MAC */
np->txrxctl_bits &= ~NVREG_TXRXCTL_VLANSTRIP;
np->txrxctl_bits &= ~NVREG_TXRXCTL_VLANINS;
}
writel(np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl);
spin_unlock_irq(&np->lock);
};
static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{
/* nothing to do */
};
static void set_msix_vector_map(struct net_device *dev, u32 vector, u32 irqmask)
{
u8 __iomem *base = get_hwbase(dev);
int i;
u32 msixmap = 0;
/* Each interrupt bit can be mapped to a MSIX vector (4 bits).
* MSIXMap0 represents the first 8 interrupts and MSIXMap1 represents
* the remaining 8 interrupts.
*/
for (i = 0; i < 8; i++) {
if ((irqmask >> i) & 0x1) {
msixmap |= vector << (i << 2);
}
}
writel(readl(base + NvRegMSIXMap0) | msixmap, base + NvRegMSIXMap0);
msixmap = 0;
for (i = 0; i < 8; i++) {
if ((irqmask >> (i + 8)) & 0x1) {
msixmap |= vector << (i << 2);
}
}
writel(readl(base + NvRegMSIXMap1) | msixmap, base + NvRegMSIXMap1);
}
static int nv_open(struct net_device *dev) static int nv_open(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base = get_hwbase(dev); u8 __iomem *base = get_hwbase(dev);
int ret, oom, i; int ret = 1;
int oom, i;
dprintk(KERN_DEBUG "nv_open: begin\n"); dprintk(KERN_DEBUG "nv_open: begin\n");
@ -2253,11 +2634,7 @@ static int nv_open(struct net_device *dev)
nv_copy_mac_to_hw(dev); nv_copy_mac_to_hw(dev);
/* 4) give hw rings */ /* 4) give hw rings */
writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr); setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING);
if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2)
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc)), base + NvRegTxRingPhysAddr);
else
writel((u32) (np->ring_addr + RX_RING*sizeof(struct ring_desc_ex)), base + NvRegTxRingPhysAddr);
writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT), writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
base + NvRegRingSizes); base + NvRegRingSizes);
@ -2265,6 +2642,7 @@ static int nv_open(struct net_device *dev)
writel(np->linkspeed, base + NvRegLinkSpeed); writel(np->linkspeed, base + NvRegLinkSpeed);
writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3); writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3);
writel(np->txrxctl_bits, base + NvRegTxRxControl); writel(np->txrxctl_bits, base + NvRegTxRxControl);
writel(np->vlanctl_bits, base + NvRegVlanControl);
pci_push(base); pci_push(base);
writel(NVREG_TXRXCTL_BIT1|np->txrxctl_bits, base + NvRegTxRxControl); writel(NVREG_TXRXCTL_BIT1|np->txrxctl_bits, base + NvRegTxRxControl);
reg_delay(dev, NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31, NVREG_UNKSETUP5_BIT31, reg_delay(dev, NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31, NVREG_UNKSETUP5_BIT31,
@ -2315,9 +2693,77 @@ static int nv_open(struct net_device *dev)
writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus); writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
pci_push(base); pci_push(base);
ret = request_irq(dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev); if (np->msi_flags & NV_MSI_X_CAPABLE) {
if (ret) for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) {
np->msi_x_entry[i].entry = i;
}
if ((ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK))) == 0) {
np->msi_flags |= NV_MSI_X_ENABLED;
if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) {
/* Request irq for rx handling */
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, &nv_nic_irq_rx, SA_SHIRQ, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed for rx %d\n", ret);
pci_disable_msix(np->pci_dev);
np->msi_flags &= ~NV_MSI_X_ENABLED;
goto out_drain; goto out_drain;
}
/* Request irq for tx handling */
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, &nv_nic_irq_tx, SA_SHIRQ, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed for tx %d\n", ret);
pci_disable_msix(np->pci_dev);
np->msi_flags &= ~NV_MSI_X_ENABLED;
goto out_drain;
}
/* Request irq for link and timer handling */
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, &nv_nic_irq_other, SA_SHIRQ, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed for link %d\n", ret);
pci_disable_msix(np->pci_dev);
np->msi_flags &= ~NV_MSI_X_ENABLED;
goto out_drain;
}
/* map interrupts to their respective vector */
writel(0, base + NvRegMSIXMap0);
writel(0, base + NvRegMSIXMap1);
set_msix_vector_map(dev, NV_MSI_X_VECTOR_RX, NVREG_IRQ_RX_ALL);
set_msix_vector_map(dev, NV_MSI_X_VECTOR_TX, NVREG_IRQ_TX_ALL);
set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER);
} else {
/* Request irq for all interrupts */
if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
pci_disable_msix(np->pci_dev);
np->msi_flags &= ~NV_MSI_X_ENABLED;
goto out_drain;
}
/* map interrupts to vector 0 */
writel(0, base + NvRegMSIXMap0);
writel(0, base + NvRegMSIXMap1);
}
}
}
if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) {
if ((ret = pci_enable_msi(np->pci_dev)) == 0) {
np->msi_flags |= NV_MSI_ENABLED;
if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0) {
printk(KERN_INFO "forcedeth: request_irq failed %d\n", ret);
pci_disable_msi(np->pci_dev);
np->msi_flags &= ~NV_MSI_ENABLED;
goto out_drain;
}
/* map interrupts to vector 0 */
writel(0, base + NvRegMSIMap0);
writel(0, base + NvRegMSIMap1);
/* enable msi vector 0 */
writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask);
}
}
if (ret != 0) {
if (request_irq(np->pci_dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev) != 0)
goto out_drain;
}
/* ask for interrupts */ /* ask for interrupts */
writel(np->irqmask, base + NvRegIrqMask); writel(np->irqmask, base + NvRegIrqMask);
@ -2364,6 +2810,7 @@ static int nv_close(struct net_device *dev)
{ {
struct fe_priv *np = netdev_priv(dev); struct fe_priv *np = netdev_priv(dev);
u8 __iomem *base; u8 __iomem *base;
int i;
spin_lock_irq(&np->lock); spin_lock_irq(&np->lock);
np->in_shutdown = 1; np->in_shutdown = 1;
@ -2381,13 +2828,31 @@ static int nv_close(struct net_device *dev)
/* disable interrupts on the nic or we will lock up */ /* disable interrupts on the nic or we will lock up */
base = get_hwbase(dev); base = get_hwbase(dev);
if (np->msi_flags & NV_MSI_X_ENABLED) {
writel(np->irqmask, base + NvRegIrqMask);
} else {
if (np->msi_flags & NV_MSI_ENABLED)
writel(0, base + NvRegMSIIrqMask);
writel(0, base + NvRegIrqMask); writel(0, base + NvRegIrqMask);
}
pci_push(base); pci_push(base);
dprintk(KERN_INFO "%s: Irqmask is zero again\n", dev->name); dprintk(KERN_INFO "%s: Irqmask is zero again\n", dev->name);
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
free_irq(dev->irq, dev); if (np->msi_flags & NV_MSI_X_ENABLED) {
for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) {
free_irq(np->msi_x_entry[i].vector, dev);
}
pci_disable_msix(np->pci_dev);
np->msi_flags &= ~NV_MSI_X_ENABLED;
} else {
free_irq(np->pci_dev->irq, dev);
if (np->msi_flags & NV_MSI_ENABLED) {
pci_disable_msi(np->pci_dev);
np->msi_flags &= ~NV_MSI_ENABLED;
}
}
drain_ring(dev); drain_ring(dev);
@ -2470,8 +2935,15 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
if (pci_set_dma_mask(pci_dev, 0x0000007fffffffffULL)) { if (pci_set_dma_mask(pci_dev, 0x0000007fffffffffULL)) {
printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n", printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n",
pci_name(pci_dev)); pci_name(pci_dev));
} else {
if (pci_set_consistent_dma_mask(pci_dev, 0x0000007fffffffffULL)) {
printk(KERN_INFO "forcedeth: 64-bit DMA (consistent) failed for device %s.\n",
pci_name(pci_dev));
goto out_relreg;
} else { } else {
dev->features |= NETIF_F_HIGHDMA; dev->features |= NETIF_F_HIGHDMA;
printk(KERN_INFO "forcedeth: using HIGHDMA\n");
}
} }
np->txrxctl_bits = NVREG_TXRXCTL_DESC_3; np->txrxctl_bits = NVREG_TXRXCTL_DESC_3;
} else if (id->driver_data & DEV_HAS_LARGEDESC) { } else if (id->driver_data & DEV_HAS_LARGEDESC) {
@ -2496,6 +2968,22 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
#endif #endif
} }
np->vlanctl_bits = 0;
if (id->driver_data & DEV_HAS_VLAN) {
np->vlanctl_bits = NVREG_VLANCONTROL_ENABLE;
dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX;
dev->vlan_rx_register = nv_vlan_rx_register;
dev->vlan_rx_kill_vid = nv_vlan_rx_kill_vid;
}
np->msi_flags = 0;
if ((id->driver_data & DEV_HAS_MSI) && !disable_msi) {
np->msi_flags |= NV_MSI_CAPABLE;
}
if ((id->driver_data & DEV_HAS_MSI_X) && !disable_msix) {
np->msi_flags |= NV_MSI_X_CAPABLE;
}
err = -ENOMEM; err = -ENOMEM;
np->base = ioremap(addr, NV_PCI_REGSZ); np->base = ioremap(addr, NV_PCI_REGSZ);
if (!np->base) if (!np->base)
@ -2578,10 +3066,15 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
} else { } else {
np->tx_flags = NV_TX2_VALID; np->tx_flags = NV_TX2_VALID;
} }
if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) {
np->irqmask = NVREG_IRQMASK_THROUGHPUT; np->irqmask = NVREG_IRQMASK_THROUGHPUT;
else if (np->msi_flags & NV_MSI_X_CAPABLE) /* set number of vectors */
np->msi_flags |= 0x0003;
} else {
np->irqmask = NVREG_IRQMASK_CPU; np->irqmask = NVREG_IRQMASK_CPU;
if (np->msi_flags & NV_MSI_X_CAPABLE) /* set number of vectors */
np->msi_flags |= 0x0001;
}
if (id->driver_data & DEV_NEED_TIMERIRQ) if (id->driver_data & DEV_NEED_TIMERIRQ)
np->irqmask |= NVREG_IRQ_TIMER; np->irqmask |= NVREG_IRQ_TIMER;
@ -2737,11 +3230,11 @@ static struct pci_device_id pci_tbl[] = {
}, },
{ /* MCP55 Ethernet Controller */ { /* MCP55 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14), PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14),
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA, .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X,
}, },
{ /* MCP55 Ethernet Controller */ { /* MCP55 Ethernet Controller */
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15), PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15),
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA, .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X,
}, },
{0,}, {0,},
}; };
@ -2771,6 +3264,10 @@ module_param(optimization_mode, int, 0);
MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer."); MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer.");
module_param(poll_interval, int, 0); module_param(poll_interval, int, 0);
MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535."); MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535.");
module_param(disable_msi, int, 0);
MODULE_PARM_DESC(disable_msi, "Disable MSI interrupts by setting to 1.");
module_param(disable_msix, int, 0);
MODULE_PARM_DESC(disable_msix, "Disable MSIX interrupts by setting to 1.");
MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>"); MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>");
MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver"); MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");

View file

@ -427,7 +427,7 @@ that case.
static void hamachi_timer(unsigned long data); static void hamachi_timer(unsigned long data);
enum capability_flags {CanHaveMII=1, }; enum capability_flags {CanHaveMII=1, };
static struct chip_info { static const struct chip_info {
u16 vendor_id, device_id, device_id_mask, pad; u16 vendor_id, device_id, device_id_mask, pad;
const char *name; const char *name;
void (*media_timer)(unsigned long data); void (*media_timer)(unsigned long data);

View file

@ -905,7 +905,7 @@ static int epp_open(struct net_device *dev)
/* autoprobe baud rate */ /* autoprobe baud rate */
tstart = jiffies; tstart = jiffies;
i = 0; i = 0;
while ((signed)(jiffies-tstart-HZ/3) < 0) { while (time_before(jiffies, tstart + HZ/3)) {
if (pp->ops->epp_read_addr(pp, &stat, 1, 0) != 1) if (pp->ops->epp_read_addr(pp, &stat, 1, 0) != 1)
goto epptimeout; goto epptimeout;
if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) { if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) {

View file

@ -115,6 +115,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
@ -1499,7 +1500,7 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev)
printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name); printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name);
#endif #endif
/* not waited long enough since last tx? */ /* not waited long enough since last tx? */
if (jiffies - dev->trans_start < HZ) if (time_before(jiffies, dev->trans_start + HZ))
return -EAGAIN; return -EAGAIN;
if (hp100_check_lan(dev)) if (hp100_check_lan(dev))
@ -1652,7 +1653,7 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev)
printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i); printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i);
#endif #endif
/* not waited long enough since last failed tx try? */ /* not waited long enough since last failed tx try? */
if (jiffies - dev->trans_start < HZ) { if (time_before(jiffies, dev->trans_start + HZ)) {
#ifdef HP100_DEBUG #ifdef HP100_DEBUG
printk("hp100: %s: trans_start timing problem\n", printk("hp100: %s: trans_start timing problem\n",
dev->name); dev->name);
@ -1718,17 +1719,10 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev)
hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */ hp100_outw(i, FRAGMENT_LEN); /* and first/only fragment length */
if (lp->mode == 2) { /* memory mapped */ if (lp->mode == 2) { /* memory mapped */
if (lp->mem_ptr_virt) { /* high pci memory was remapped */
/* Note: The J2585B needs alignment to 32bits here! */ /* Note: The J2585B needs alignment to 32bits here! */
memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3); memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
if (!ok_flag) if (!ok_flag)
memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len); memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
} else {
/* Note: The J2585B needs alignment to 32bits here! */
isa_memcpy_toio(lp->mem_ptr_phys, skb->data, (skb->len + 3) & ~3);
if (!ok_flag)
isa_memset_io(lp->mem_ptr_phys, 0, HP100_MIN_PACKET_SIZE - skb->len);
}
} else { /* programmed i/o */ } else { /* programmed i/o */
outsl(ioaddr + HP100_REG_DATA32, skb->data, outsl(ioaddr + HP100_REG_DATA32, skb->data,
(skb->len + 3) >> 2); (skb->len + 3) >> 2);
@ -1798,10 +1792,7 @@ static void hp100_rx(struct net_device *dev)
/* First we get the header, which contains information about the */ /* First we get the header, which contains information about the */
/* actual length of the received packet. */ /* actual length of the received packet. */
if (lp->mode == 2) { /* memory mapped mode */ if (lp->mode == 2) { /* memory mapped mode */
if (lp->mem_ptr_virt) /* if memory was remapped */
header = readl(lp->mem_ptr_virt); header = readl(lp->mem_ptr_virt);
else
header = isa_readl(lp->mem_ptr_phys);
} else /* programmed i/o */ } else /* programmed i/o */
header = hp100_inl(DATA32); header = hp100_inl(DATA32);
@ -1833,13 +1824,9 @@ static void hp100_rx(struct net_device *dev)
ptr = skb->data; ptr = skb->data;
/* Now transfer the data from the card into that area */ /* Now transfer the data from the card into that area */
if (lp->mode == 2) { if (lp->mode == 2)
if (lp->mem_ptr_virt)
memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len); memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
/* Note alignment to 32bit transfers */ else /* io mapped */
else
isa_memcpy_fromio(ptr, lp->mem_ptr_phys, pkt_len);
} else /* io mapped */
insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2); insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);

View file

@ -204,7 +204,7 @@ static inline int emac_phy_gpcs(int phy_mode)
static inline void emac_tx_enable(struct ocp_enet_private *dev) static inline void emac_tx_enable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -220,7 +220,7 @@ static inline void emac_tx_enable(struct ocp_enet_private *dev)
static void emac_tx_disable(struct ocp_enet_private *dev) static void emac_tx_disable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -244,7 +244,7 @@ static void emac_tx_disable(struct ocp_enet_private *dev)
static void emac_rx_enable(struct ocp_enet_private *dev) static void emac_rx_enable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -275,7 +275,7 @@ static void emac_rx_enable(struct ocp_enet_private *dev)
static void emac_rx_disable(struct ocp_enet_private *dev) static void emac_rx_disable(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -299,7 +299,7 @@ static void emac_rx_disable(struct ocp_enet_private *dev)
static inline void emac_rx_disable_async(struct ocp_enet_private *dev) static inline void emac_rx_disable_async(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
u32 r; u32 r;
@ -315,7 +315,7 @@ static inline void emac_rx_disable_async(struct ocp_enet_private *dev)
static int emac_reset(struct ocp_enet_private *dev) static int emac_reset(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
unsigned long flags; unsigned long flags;
int n = 20; int n = 20;
@ -348,7 +348,7 @@ static int emac_reset(struct ocp_enet_private *dev)
static void emac_hash_mc(struct ocp_enet_private *dev) static void emac_hash_mc(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u16 gaht[4] = { 0 }; u16 gaht[4] = { 0 };
struct dev_mc_list *dmi; struct dev_mc_list *dmi;
@ -393,7 +393,7 @@ static inline int emac_opb_mhz(void)
/* BHs disabled */ /* BHs disabled */
static int emac_configure(struct ocp_enet_private *dev) static int emac_configure(struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct net_device *ndev = dev->ndev; struct net_device *ndev = dev->ndev;
int gige; int gige;
u32 r; u32 r;
@ -555,7 +555,7 @@ static void emac_full_tx_reset(struct net_device *ndev)
static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg) static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u32 r; u32 r;
int n; int n;
@ -604,7 +604,7 @@ static int __emac_mdio_read(struct ocp_enet_private *dev, u8 id, u8 reg)
static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg, static void __emac_mdio_write(struct ocp_enet_private *dev, u8 id, u8 reg,
u16 val) u16 val)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
int n; int n;
DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg, DBG2("%d: mdio_write(%02x,%02x,%04x)" NL, dev->def->index, id, reg,
@ -666,7 +666,7 @@ static void emac_mdio_write(struct net_device *ndev, int id, int reg, int val)
static void emac_set_multicast_list(struct net_device *ndev) static void emac_set_multicast_list(struct net_device *ndev)
{ {
struct ocp_enet_private *dev = ndev->priv; struct ocp_enet_private *dev = ndev->priv;
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
u32 rmr = emac_iff2rmr(ndev); u32 rmr = emac_iff2rmr(ndev);
DBG("%d: multicast %08x" NL, dev->def->index, rmr); DBG("%d: multicast %08x" NL, dev->def->index, rmr);
@ -825,7 +825,7 @@ static void emac_clean_rx_ring(struct ocp_enet_private *dev)
} }
static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot, static inline int emac_alloc_rx_skb(struct ocp_enet_private *dev, int slot,
int flags) gfp_t flags)
{ {
struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags); struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags);
if (unlikely(!skb)) if (unlikely(!skb))
@ -1047,7 +1047,7 @@ static inline u16 emac_tx_csum(struct ocp_enet_private *dev,
static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len) static inline int emac_xmit_finish(struct ocp_enet_private *dev, int len)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct net_device *ndev = dev->ndev; struct net_device *ndev = dev->ndev;
/* Send the packet out */ /* Send the packet out */
@ -1519,7 +1519,7 @@ static void emac_rxde(void *param)
static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs) static irqreturn_t emac_irq(int irq, void *dev_instance, struct pt_regs *regs)
{ {
struct ocp_enet_private *dev = dev_instance; struct ocp_enet_private *dev = dev_instance;
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
struct ibm_emac_error_stats *st = &dev->estats; struct ibm_emac_error_stats *st = &dev->estats;
u32 isr = in_be32(&p->isr); u32 isr = in_be32(&p->isr);
@ -1619,17 +1619,17 @@ static void emac_remove(struct ocp_device *ocpdev)
DBG("%d: remove" NL, dev->def->index); DBG("%d: remove" NL, dev->def->index);
ocp_set_drvdata(ocpdev, 0); ocp_set_drvdata(ocpdev, NULL);
unregister_netdev(dev->ndev); unregister_netdev(dev->ndev);
tah_fini(dev->tah_dev); tah_fini(dev->tah_dev);
rgmii_fini(dev->rgmii_dev, dev->rgmii_input); rgmii_fini(dev->rgmii_dev, dev->rgmii_input);
zmii_fini(dev->zmii_dev, dev->zmii_input); zmii_fini(dev->zmii_dev, dev->zmii_input);
emac_dbg_register(dev->def->index, 0); emac_dbg_register(dev->def->index, NULL);
mal_unregister_commac(dev->mal, &dev->commac); mal_unregister_commac(dev->mal, &dev->commac);
iounmap((void *)dev->emacp); iounmap(dev->emacp);
kfree(dev->ndev); kfree(dev->ndev);
} }
@ -2048,9 +2048,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
goto out4; goto out4;
/* Map EMAC regs */ /* Map EMAC regs */
dev->emacp = dev->emacp = ioremap(dev->def->paddr, sizeof(struct emac_regs));
(struct emac_regs *)ioremap(dev->def->paddr,
sizeof(struct emac_regs));
if (!dev->emacp) { if (!dev->emacp) {
printk(KERN_ERR "emac%d: could not ioremap device registers!\n", printk(KERN_ERR "emac%d: could not ioremap device registers!\n",
dev->def->index); dev->def->index);
@ -2210,7 +2208,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
return 0; return 0;
out6: out6:
iounmap((void *)dev->emacp); iounmap(dev->emacp);
out5: out5:
tah_fini(dev->tah_dev); tah_fini(dev->tah_dev);
out4: out4:

View file

@ -155,7 +155,7 @@ struct ibm_emac_error_stats {
struct ocp_enet_private { struct ocp_enet_private {
struct net_device *ndev; /* 0 */ struct net_device *ndev; /* 0 */
struct emac_regs *emacp; struct emac_regs __iomem *emacp;
struct mal_descriptor *tx_desc; struct mal_descriptor *tx_desc;
int tx_cnt; int tx_cnt;

View file

@ -58,7 +58,7 @@ static void emac_desc_dump(int idx, struct ocp_enet_private *p)
static void emac_mac_dump(int idx, struct ocp_enet_private *dev) static void emac_mac_dump(int idx, struct ocp_enet_private *dev)
{ {
struct emac_regs *p = dev->emacp; struct emac_regs __iomem *p = dev->emacp;
printk("** EMAC%d registers **\n" printk("** EMAC%d registers **\n"
"MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n"

View file

@ -31,7 +31,7 @@ struct rgmii_regs {
/* RGMII device */ /* RGMII device */
struct ibm_ocp_rgmii { struct ibm_ocp_rgmii {
struct rgmii_regs *base; struct rgmii_regs __iomem *base;
int users; /* number of EMACs using this RGMII bridge */ int users; /* number of EMACs using this RGMII bridge */
}; };

View file

@ -80,7 +80,7 @@ static inline u32 zmii_mode_mask(int mode, int input)
static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode) static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode)
{ {
struct ibm_ocp_zmii *dev = ocp_get_drvdata(ocpdev); struct ibm_ocp_zmii *dev = ocp_get_drvdata(ocpdev);
struct zmii_regs *p; struct zmii_regs __iomem *p;
ZMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, *mode); ZMII_DBG("%d: init(%d, %d)" NL, ocpdev->def->index, input, *mode);
@ -94,8 +94,7 @@ static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode)
} }
dev->mode = PHY_MODE_NA; dev->mode = PHY_MODE_NA;
p = (struct zmii_regs *)ioremap(ocpdev->def->paddr, p = ioremap(ocpdev->def->paddr, sizeof(struct zmii_regs));
sizeof(struct zmii_regs));
if (!p) { if (!p) {
printk(KERN_ERR printk(KERN_ERR
"zmii%d: could not ioremap device registers!\n", "zmii%d: could not ioremap device registers!\n",
@ -231,7 +230,7 @@ void __exit __zmii_fini(struct ocp_device *ocpdev, int input)
if (!--dev->users) { if (!--dev->users) {
/* Free everything if this is the last user */ /* Free everything if this is the last user */
ocp_set_drvdata(ocpdev, NULL); ocp_set_drvdata(ocpdev, NULL);
iounmap((void *)dev->base); iounmap(dev->base);
kfree(dev); kfree(dev);
} }
} }

View file

@ -32,7 +32,7 @@ struct zmii_regs {
/* ZMII device */ /* ZMII device */
struct ibm_ocp_zmii { struct ibm_ocp_zmii {
struct zmii_regs *base; struct zmii_regs __iomem *base;
int mode; /* subset of PHY_MODE_XXXX */ int mode; /* subset of PHY_MODE_XXXX */
int users; /* number of EMACs using this ZMII bridge */ int users; /* number of EMACs using this ZMII bridge */
u32 fer_save; /* FER value left by firmware */ u32 fer_save; /* FER value left by firmware */

View file

@ -283,7 +283,7 @@ config USB_IRDA
Say Y here if you want to build support for the USB IrDA FIR Dongle Say Y here if you want to build support for the USB IrDA FIR Dongle
device driver. To compile it as a module, choose M here: the module device driver. To compile it as a module, choose M here: the module
will be called irda-usb. IrDA-USB support the various IrDA USB will be called irda-usb. IrDA-USB support the various IrDA USB
dongles available and most of their pecularities. Those dongles dongles available and most of their peculiarities. Those dongles
plug in the USB port of your computer, are plug and play, and plug in the USB port of your computer, are plug and play, and
support SIR and FIR (4Mbps) speeds. On the other hand, those support SIR and FIR (4Mbps) speeds. On the other hand, those
dongles tend to be less efficient than a FIR chipset. dongles tend to be less efficient than a FIR chipset.
@ -360,7 +360,7 @@ config ALI_FIR
help help
Say Y here if you want to build support for the ALi M5123 FIR Say Y here if you want to build support for the ALi M5123 FIR
Controller. The ALi M5123 FIR Controller is embedded in ALi M1543C, Controller. The ALi M5123 FIR Controller is embedded in ALi M1543C,
M1535, M1535D, M1535+, M1535D Sourth Bridge. This driver supports M1535, M1535D, M1535+, M1535D South Bridge. This driver supports
SIR, MIR and FIR (4Mbps) speeds. SIR, MIR and FIR (4Mbps) speeds.
To compile it as a module, choose M here: the module will be called To compile it as a module, choose M here: the module will be called

View file

@ -622,7 +622,7 @@ static int __init mac_sonic_init_module(void)
return 0; return 0;
out_unregister: out_unregister:
driver_unregister(&mac_sonic_driver); platform_driver_unregister(&mac_sonic_driver);
return -ENOMEM; return -ENOMEM;
} }

File diff suppressed because it is too large Load diff

View file

@ -5,53 +5,16 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mii.h>
#include <linux/mv643xx.h> #include <linux/mv643xx.h>
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
/*
* The first part is the high level driver of the gigE ethernet ports.
*/
/* Checksum offload for Tx works for most packets, but /* Checksum offload for Tx works for most packets, but
* fails if previous packet sent did not use hw csum * fails if previous packet sent did not use hw csum
*/ */
#define MV643XX_CHECKSUM_OFFLOAD_TX #define MV643XX_CHECKSUM_OFFLOAD_TX
#define MV643XX_NAPI #define MV643XX_NAPI
#define MV643XX_TX_FAST_REFILL #define MV643XX_TX_FAST_REFILL
#undef MV643XX_RX_QUEUE_FILL_ON_TASK /* Does not work, yet */
#undef MV643XX_COAL #undef MV643XX_COAL
/* /*
@ -73,25 +36,40 @@
#define MV643XX_RX_COAL 100 #define MV643XX_RX_COAL 100
#endif #endif
/* #ifdef MV643XX_CHECKSUM_OFFLOAD_TX
* The second part is the low level driver of the gigE ethernet ports. #define MAX_DESCS_PER_SKB (MAX_SKB_FRAGS + 1)
*/ #else
#define MAX_DESCS_PER_SKB 1
#endif
/* #define ETH_VLAN_HLEN 4
* Header File for : MV-643xx network interface header #define ETH_FCS_LEN 4
* #define ETH_DMA_ALIGN 8 /* hw requires 8-byte alignment */
* DESCRIPTION: #define ETH_HW_IP_ALIGN 2 /* hw aligns IP header */
* This header file contains macros typedefs and function declaration for #define ETH_WRAPPER_LEN (ETH_HW_IP_ALIGN + ETH_HLEN + \
* the Marvell Gig Bit Ethernet Controller. ETH_VLAN_HLEN + ETH_FCS_LEN)
* #define ETH_RX_SKB_SIZE ((dev->mtu + ETH_WRAPPER_LEN + 7) & ~0x7)
* DEPENDENCIES:
* None.
*
*/
/* MAC accepet/reject macros */ #define ETH_RX_QUEUES_ENABLED (1 << 0) /* use only Q0 for receive */
#define ACCEPT_MAC_ADDR 0 #define ETH_TX_QUEUES_ENABLED (1 << 0) /* use only Q0 for transmit */
#define REJECT_MAC_ADDR 1
#define ETH_INT_CAUSE_RX_DONE (ETH_RX_QUEUES_ENABLED << 2)
#define ETH_INT_CAUSE_RX_ERROR (ETH_RX_QUEUES_ENABLED << 9)
#define ETH_INT_CAUSE_RX (ETH_INT_CAUSE_RX_DONE | ETH_INT_CAUSE_RX_ERROR)
#define ETH_INT_CAUSE_EXT 0x00000002
#define ETH_INT_UNMASK_ALL (ETH_INT_CAUSE_RX | ETH_INT_CAUSE_EXT)
#define ETH_INT_CAUSE_TX_DONE (ETH_TX_QUEUES_ENABLED << 0)
#define ETH_INT_CAUSE_TX_ERROR (ETH_TX_QUEUES_ENABLED << 8)
#define ETH_INT_CAUSE_TX (ETH_INT_CAUSE_TX_DONE | ETH_INT_CAUSE_TX_ERROR)
#define ETH_INT_CAUSE_PHY 0x00010000
#define ETH_INT_UNMASK_ALL_EXT (ETH_INT_CAUSE_TX | ETH_INT_CAUSE_PHY)
#define ETH_INT_MASK_ALL 0x00000000
#define ETH_INT_MASK_ALL_EXT 0x00000000
#define PHY_WAIT_ITERATIONS 1000 /* 1000 iterations * 10uS = 10mS max */
#define PHY_WAIT_MICRO_SECONDS 10
/* Buffer offset from buffer pointer */ /* Buffer offset from buffer pointer */
#define RX_BUF_OFFSET 0x2 #define RX_BUF_OFFSET 0x2
@ -133,88 +111,71 @@
#define ETH_MIB_LATE_COLLISION 0x7c #define ETH_MIB_LATE_COLLISION 0x7c
/* Port serial status reg (PSR) */ /* Port serial status reg (PSR) */
#define ETH_INTERFACE_GMII_MII 0 #define ETH_INTERFACE_PCM 0x00000001
#define ETH_INTERFACE_PCM BIT0 #define ETH_LINK_IS_UP 0x00000002
#define ETH_LINK_IS_DOWN 0 #define ETH_PORT_AT_FULL_DUPLEX 0x00000004
#define ETH_LINK_IS_UP BIT1 #define ETH_RX_FLOW_CTRL_ENABLED 0x00000008
#define ETH_PORT_AT_HALF_DUPLEX 0 #define ETH_GMII_SPEED_1000 0x00000010
#define ETH_PORT_AT_FULL_DUPLEX BIT2 #define ETH_MII_SPEED_100 0x00000020
#define ETH_RX_FLOW_CTRL_DISABLED 0 #define ETH_TX_IN_PROGRESS 0x00000080
#define ETH_RX_FLOW_CTRL_ENBALED BIT3 #define ETH_BYPASS_ACTIVE 0x00000100
#define ETH_GMII_SPEED_100_10 0 #define ETH_PORT_AT_PARTITION_STATE 0x00000200
#define ETH_GMII_SPEED_1000 BIT4 #define ETH_PORT_TX_FIFO_EMPTY 0x00000400
#define ETH_MII_SPEED_10 0
#define ETH_MII_SPEED_100 BIT5
#define ETH_NO_TX 0
#define ETH_TX_IN_PROGRESS BIT7
#define ETH_BYPASS_NO_ACTIVE 0
#define ETH_BYPASS_ACTIVE BIT8
#define ETH_PORT_NOT_AT_PARTITION_STATE 0
#define ETH_PORT_AT_PARTITION_STATE BIT9
#define ETH_PORT_TX_FIFO_NOT_EMPTY 0
#define ETH_PORT_TX_FIFO_EMPTY BIT10
#define ETH_DEFAULT_RX_BPDU_QUEUE_3 (BIT23 | BIT22)
#define ETH_DEFAULT_RX_BPDU_QUEUE_4 BIT24
#define ETH_DEFAULT_RX_BPDU_QUEUE_5 (BIT24 | BIT22)
#define ETH_DEFAULT_RX_BPDU_QUEUE_6 (BIT24 | BIT23)
#define ETH_DEFAULT_RX_BPDU_QUEUE_7 (BIT24 | BIT23 | BIT22)
/* SMI reg */ /* SMI reg */
#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */ #define ETH_SMI_BUSY 0x10000000 /* 0 - Write, 1 - Read */
#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */ #define ETH_SMI_READ_VALID 0x08000000 /* 0 - Write, 1 - Read */
#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */ #define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read */
#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */ #define ETH_SMI_OPCODE_READ 0x04000000 /* Operation is in progress */
/* Interrupt Cause Register Bit Definitions */
/* SDMA command status fields macros */ /* SDMA command status fields macros */
/* Tx & Rx descriptors status */ /* Tx & Rx descriptors status */
#define ETH_ERROR_SUMMARY (BIT0) #define ETH_ERROR_SUMMARY 0x00000001
/* Tx & Rx descriptors command */ /* Tx & Rx descriptors command */
#define ETH_BUFFER_OWNED_BY_DMA (BIT31) #define ETH_BUFFER_OWNED_BY_DMA 0x80000000
/* Tx descriptors status */ /* Tx descriptors status */
#define ETH_LC_ERROR (0 ) #define ETH_LC_ERROR 0
#define ETH_UR_ERROR (BIT1 ) #define ETH_UR_ERROR 0x00000002
#define ETH_RL_ERROR (BIT2 ) #define ETH_RL_ERROR 0x00000004
#define ETH_LLC_SNAP_FORMAT (BIT9 ) #define ETH_LLC_SNAP_FORMAT 0x00000200
/* Rx descriptors status */ /* Rx descriptors status */
#define ETH_CRC_ERROR (0 ) #define ETH_OVERRUN_ERROR 0x00000002
#define ETH_OVERRUN_ERROR (BIT1 ) #define ETH_MAX_FRAME_LENGTH_ERROR 0x00000004
#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 ) #define ETH_RESOURCE_ERROR 0x00000006
#define ETH_RESOURCE_ERROR ((BIT2 | BIT1)) #define ETH_VLAN_TAGGED 0x00080000
#define ETH_VLAN_TAGGED (BIT19) #define ETH_BPDU_FRAME 0x00100000
#define ETH_BPDU_FRAME (BIT20) #define ETH_UDP_FRAME_OVER_IP_V_4 0x00200000
#define ETH_TCP_FRAME_OVER_IP_V_4 (0 ) #define ETH_OTHER_FRAME_TYPE 0x00400000
#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21) #define ETH_LAYER_2_IS_ETH_V_2 0x00800000
#define ETH_OTHER_FRAME_TYPE (BIT22) #define ETH_FRAME_TYPE_IP_V_4 0x01000000
#define ETH_LAYER_2_IS_ETH_V_2 (BIT23) #define ETH_FRAME_HEADER_OK 0x02000000
#define ETH_FRAME_TYPE_IP_V_4 (BIT24) #define ETH_RX_LAST_DESC 0x04000000
#define ETH_FRAME_HEADER_OK (BIT25) #define ETH_RX_FIRST_DESC 0x08000000
#define ETH_RX_LAST_DESC (BIT26) #define ETH_UNKNOWN_DESTINATION_ADDR 0x10000000
#define ETH_RX_FIRST_DESC (BIT27) #define ETH_RX_ENABLE_INTERRUPT 0x20000000
#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28) #define ETH_LAYER_4_CHECKSUM_OK 0x40000000
#define ETH_RX_ENABLE_INTERRUPT (BIT29)
#define ETH_LAYER_4_CHECKSUM_OK (BIT30)
/* Rx descriptors byte count */ /* Rx descriptors byte count */
#define ETH_FRAME_FRAGMENTED (BIT2) #define ETH_FRAME_FRAGMENTED 0x00000004
/* Tx descriptors command */ /* Tx descriptors command */
#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10) #define ETH_LAYER_4_CHECKSUM_FIRST_DESC 0x00000400
#define ETH_FRAME_SET_TO_VLAN (BIT15) #define ETH_FRAME_SET_TO_VLAN 0x00008000
#define ETH_TCP_FRAME (0 ) #define ETH_UDP_FRAME 0x00010000
#define ETH_UDP_FRAME (BIT16) #define ETH_GEN_TCP_UDP_CHECKSUM 0x00020000
#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17) #define ETH_GEN_IP_V_4_CHECKSUM 0x00040000
#define ETH_GEN_IP_V_4_CHECKSUM (BIT18) #define ETH_ZERO_PADDING 0x00080000
#define ETH_ZERO_PADDING (BIT19) #define ETH_TX_LAST_DESC 0x00100000
#define ETH_TX_LAST_DESC (BIT20) #define ETH_TX_FIRST_DESC 0x00200000
#define ETH_TX_FIRST_DESC (BIT21) #define ETH_GEN_CRC 0x00400000
#define ETH_GEN_CRC (BIT22) #define ETH_TX_ENABLE_INTERRUPT 0x00800000
#define ETH_TX_ENABLE_INTERRUPT (BIT23) #define ETH_AUTO_MODE 0x40000000
#define ETH_AUTO_MODE (BIT30)
#define ETH_TX_IHL_SHIFT 11 #define ETH_TX_IHL_SHIFT 11
@ -324,13 +285,6 @@ struct mv643xx_mib_counters {
struct mv643xx_private { struct mv643xx_private {
int port_num; /* User Ethernet port number */ int port_num; /* User Ethernet port number */
u8 port_mac_addr[6]; /* User defined port MAC address.*/
u32 port_config; /* User port configuration value*/
u32 port_config_extend; /* User port config extend value*/
u32 port_sdma_config; /* User port SDMA config value */
u32 port_serial_control; /* User port serial control value */
u32 port_tx_queue_command; /* Port active Tx queues summary*/
u32 port_rx_queue_command; /* Port active Rx queues summary*/
u32 rx_sram_addr; /* Base address of rx sram area */ u32 rx_sram_addr; /* Base address of rx sram area */
u32 rx_sram_size; /* Size of rx sram area */ u32 rx_sram_size; /* Size of rx sram area */
@ -338,7 +292,6 @@ struct mv643xx_private {
u32 tx_sram_size; /* Size of tx sram area */ u32 tx_sram_size; /* Size of tx sram area */
int rx_resource_err; /* Rx ring resource error flag */ int rx_resource_err; /* Rx ring resource error flag */
int tx_resource_err; /* Tx ring resource error flag */
/* Tx/Rx rings managment indexes fields. For driver use */ /* Tx/Rx rings managment indexes fields. For driver use */
@ -347,10 +300,6 @@ struct mv643xx_private {
/* Next available and first returning Tx resource */ /* Next available and first returning Tx resource */
int tx_curr_desc_q, tx_used_desc_q; int tx_curr_desc_q, tx_used_desc_q;
#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
int tx_first_desc_q;
u32 tx_first_command;
#endif
#ifdef MV643XX_TX_FAST_REFILL #ifdef MV643XX_TX_FAST_REFILL
u32 tx_clean_threshold; u32 tx_clean_threshold;
@ -358,54 +307,43 @@ struct mv643xx_private {
struct eth_rx_desc *p_rx_desc_area; struct eth_rx_desc *p_rx_desc_area;
dma_addr_t rx_desc_dma; dma_addr_t rx_desc_dma;
unsigned int rx_desc_area_size; int rx_desc_area_size;
struct sk_buff **rx_skb; struct sk_buff **rx_skb;
struct eth_tx_desc *p_tx_desc_area; struct eth_tx_desc *p_tx_desc_area;
dma_addr_t tx_desc_dma; dma_addr_t tx_desc_dma;
unsigned int tx_desc_area_size; int tx_desc_area_size;
struct sk_buff **tx_skb; struct sk_buff **tx_skb;
struct work_struct tx_timeout_task; struct work_struct tx_timeout_task;
/*
* Former struct mv643xx_eth_priv members start here
*/
struct net_device_stats stats; struct net_device_stats stats;
struct mv643xx_mib_counters mib_counters; struct mv643xx_mib_counters mib_counters;
spinlock_t lock; spinlock_t lock;
/* Size of Tx Ring per queue */ /* Size of Tx Ring per queue */
unsigned int tx_ring_size; int tx_ring_size;
/* Ammont of SKBs outstanding on Tx queue */ /* Number of tx descriptors in use */
unsigned int tx_ring_skbs; int tx_desc_count;
/* Size of Rx Ring per queue */ /* Size of Rx Ring per queue */
unsigned int rx_ring_size; int rx_ring_size;
/* Ammount of SKBs allocated to Rx Ring per queue */ /* Number of rx descriptors in use */
unsigned int rx_ring_skbs; int rx_desc_count;
/*
* rx_task used to fill RX ring out of bottom half context
*/
struct work_struct rx_task;
/* /*
* Used in case RX Ring is empty, which can be caused when * Used in case RX Ring is empty, which can be caused when
* system does not have resources (skb's) * system does not have resources (skb's)
*/ */
struct timer_list timeout; struct timer_list timeout;
long rx_task_busy __attribute__ ((aligned(SMP_CACHE_BYTES)));
unsigned rx_timer_flag;
u32 rx_int_coal; u32 rx_int_coal;
u32 tx_int_coal; u32 tx_int_coal;
struct mii_if_info mii;
}; };
/* ethernet.h API list */
/* Port operation control routines */ /* Port operation control routines */
static void eth_port_init(struct mv643xx_private *mp); static void eth_port_init(struct mv643xx_private *mp);
static void eth_port_reset(unsigned int eth_port_num); static void eth_port_reset(unsigned int eth_port_num);
static void eth_port_start(struct mv643xx_private *mp); static void eth_port_start(struct net_device *dev);
/* Port MAC address routines */ /* Port MAC address routines */
static void eth_port_uc_addr_set(unsigned int eth_port_num, static void eth_port_uc_addr_set(unsigned int eth_port_num,
@ -423,10 +361,6 @@ static void eth_port_read_smi_reg(unsigned int eth_port_num,
static void eth_clear_mib_counters(unsigned int eth_port_num); static void eth_clear_mib_counters(unsigned int eth_port_num);
/* Port data flow control routines */ /* Port data flow control routines */
static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
struct pkt_info *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_tx_return_desc(struct mv643xx_private *mp,
struct pkt_info *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp, static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp,
struct pkt_info *p_pkt_info); struct pkt_info *p_pkt_info);
static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp, static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp,

View file

@ -3,6 +3,7 @@
Written/copyright 1999-2001 by Donald Becker. Written/copyright 1999-2001 by Donald Becker.
Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com) Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com)
Portions copyright 2001,2002 Manfred Spraul (manfred@colorfullife.com) Portions copyright 2001,2002 Manfred Spraul (manfred@colorfullife.com)
Portions copyright 2004 Harald Welte <laforge@gnumonks.org>
This software may be used and distributed according to the terms of This software may be used and distributed according to the terms of
the GNU General Public License (GPL), incorporated herein by reference. the GNU General Public License (GPL), incorporated herein by reference.
@ -135,8 +136,6 @@
TODO: TODO:
* big endian support with CFG:BEM instead of cpu_to_le32 * big endian support with CFG:BEM instead of cpu_to_le32
* support for an external PHY
* NAPI
*/ */
#include <linux/config.h> #include <linux/config.h>
@ -160,6 +159,7 @@
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/crc32.h> #include <linux/crc32.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/prefetch.h>
#include <asm/processor.h> /* Processor type for cache alignment. */ #include <asm/processor.h> /* Processor type for cache alignment. */
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
@ -183,13 +183,11 @@
NETIF_MSG_TX_ERR) NETIF_MSG_TX_ERR)
static int debug = -1; static int debug = -1;
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
static int max_interrupt_work = 20;
static int mtu; static int mtu;
/* Maximum number of multicast addresses to filter (vs. rx-all-multicast). /* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
This chip uses a 512 element hash table based on the Ethernet CRC. */ This chip uses a 512 element hash table based on the Ethernet CRC. */
static int multicast_filter_limit = 100; static const int multicast_filter_limit = 100;
/* Set the copy breakpoint for the copy-only-tiny-frames scheme. /* Set the copy breakpoint for the copy-only-tiny-frames scheme.
Setting to > 1518 effectively disables this feature. */ Setting to > 1518 effectively disables this feature. */
@ -251,14 +249,11 @@ MODULE_AUTHOR("Donald Becker <becker@scyld.com>");
MODULE_DESCRIPTION("National Semiconductor DP8381x series PCI Ethernet driver"); MODULE_DESCRIPTION("National Semiconductor DP8381x series PCI Ethernet driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
module_param(max_interrupt_work, int, 0);
module_param(mtu, int, 0); module_param(mtu, int, 0);
module_param(debug, int, 0); module_param(debug, int, 0);
module_param(rx_copybreak, int, 0); module_param(rx_copybreak, int, 0);
module_param_array(options, int, NULL, 0); module_param_array(options, int, NULL, 0);
module_param_array(full_duplex, int, NULL, 0); module_param_array(full_duplex, int, NULL, 0);
MODULE_PARM_DESC(max_interrupt_work,
"DP8381x maximum events handled per interrupt");
MODULE_PARM_DESC(mtu, "DP8381x MTU (all boards)"); MODULE_PARM_DESC(mtu, "DP8381x MTU (all boards)");
MODULE_PARM_DESC(debug, "DP8381x default debug level"); MODULE_PARM_DESC(debug, "DP8381x default debug level");
MODULE_PARM_DESC(rx_copybreak, MODULE_PARM_DESC(rx_copybreak,
@ -374,7 +369,7 @@ enum pcistuff {
/* array of board data directly indexed by pci_tbl[x].driver_data */ /* array of board data directly indexed by pci_tbl[x].driver_data */
static struct { static const struct {
const char *name; const char *name;
unsigned long flags; unsigned long flags;
} natsemi_pci_info[] __devinitdata = { } natsemi_pci_info[] __devinitdata = {
@ -691,6 +686,8 @@ struct netdev_private {
/* Based on MTU+slack. */ /* Based on MTU+slack. */
unsigned int rx_buf_sz; unsigned int rx_buf_sz;
int oom; int oom;
/* Interrupt status */
u32 intr_status;
/* Do not touch the nic registers */ /* Do not touch the nic registers */
int hands_off; int hands_off;
/* external phy that is used: only valid if dev->if_port != PORT_TP */ /* external phy that is used: only valid if dev->if_port != PORT_TP */
@ -748,7 +745,8 @@ static void init_registers(struct net_device *dev);
static int start_tx(struct sk_buff *skb, struct net_device *dev); static int start_tx(struct sk_buff *skb, struct net_device *dev);
static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs); static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *regs);
static void netdev_error(struct net_device *dev, int intr_status); static void netdev_error(struct net_device *dev, int intr_status);
static void netdev_rx(struct net_device *dev); static int natsemi_poll(struct net_device *dev, int *budget);
static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do);
static void netdev_tx_done(struct net_device *dev); static void netdev_tx_done(struct net_device *dev);
static int natsemi_change_mtu(struct net_device *dev, int new_mtu); static int natsemi_change_mtu(struct net_device *dev, int new_mtu);
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
@ -776,6 +774,18 @@ static inline void __iomem *ns_ioaddr(struct net_device *dev)
return (void __iomem *) dev->base_addr; return (void __iomem *) dev->base_addr;
} }
static inline void natsemi_irq_enable(struct net_device *dev)
{
writel(1, ns_ioaddr(dev) + IntrEnable);
readl(ns_ioaddr(dev) + IntrEnable);
}
static inline void natsemi_irq_disable(struct net_device *dev)
{
writel(0, ns_ioaddr(dev) + IntrEnable);
readl(ns_ioaddr(dev) + IntrEnable);
}
static void move_int_phy(struct net_device *dev, int addr) static void move_int_phy(struct net_device *dev, int addr)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
@ -879,6 +889,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
spin_lock_init(&np->lock); spin_lock_init(&np->lock);
np->msg_enable = (debug >= 0) ? (1<<debug)-1 : NATSEMI_DEF_MSG; np->msg_enable = (debug >= 0) ? (1<<debug)-1 : NATSEMI_DEF_MSG;
np->hands_off = 0; np->hands_off = 0;
np->intr_status = 0;
/* Initial port: /* Initial port:
* - If the nic was configured to use an external phy and if find_mii * - If the nic was configured to use an external phy and if find_mii
@ -932,6 +943,9 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
dev->do_ioctl = &netdev_ioctl; dev->do_ioctl = &netdev_ioctl;
dev->tx_timeout = &tx_timeout; dev->tx_timeout = &tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
dev->poll = natsemi_poll;
dev->weight = 64;
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = &natsemi_poll_controller; dev->poll_controller = &natsemi_poll_controller;
#endif #endif
@ -1484,6 +1498,31 @@ static void natsemi_reset(struct net_device *dev)
writel(rfcr, ioaddr + RxFilterAddr); writel(rfcr, ioaddr + RxFilterAddr);
} }
static void reset_rx(struct net_device *dev)
{
int i;
struct netdev_private *np = netdev_priv(dev);
void __iomem *ioaddr = ns_ioaddr(dev);
np->intr_status &= ~RxResetDone;
writel(RxReset, ioaddr + ChipCmd);
for (i=0;i<NATSEMI_HW_TIMEOUT;i++) {
np->intr_status |= readl(ioaddr + IntrStatus);
if (np->intr_status & RxResetDone)
break;
udelay(15);
}
if (i==NATSEMI_HW_TIMEOUT) {
printk(KERN_WARNING "%s: RX reset did not complete in %d usec.\n",
dev->name, i*15);
} else if (netif_msg_hw(np)) {
printk(KERN_WARNING "%s: RX reset took %d usec.\n",
dev->name, i*15);
}
}
static void natsemi_reload_eeprom(struct net_device *dev) static void natsemi_reload_eeprom(struct net_device *dev)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
@ -2158,39 +2197,52 @@ static void netdev_tx_done(struct net_device *dev)
} }
} }
/* The interrupt handler does all of the Rx thread work and cleans up /* The interrupt handler doesn't actually handle interrupts itself, it
after the Tx thread. */ * schedules a NAPI poll if there is anything to do. */
static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs) static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
{ {
struct net_device *dev = dev_instance; struct net_device *dev = dev_instance;
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
void __iomem * ioaddr = ns_ioaddr(dev); void __iomem * ioaddr = ns_ioaddr(dev);
int boguscnt = max_interrupt_work;
unsigned int handled = 0;
if (np->hands_off) if (np->hands_off)
return IRQ_NONE; return IRQ_NONE;
do {
/* Reading automatically acknowledges all int sources. */ /* Reading automatically acknowledges. */
u32 intr_status = readl(ioaddr + IntrStatus); np->intr_status = readl(ioaddr + IntrStatus);
if (netif_msg_intr(np)) if (netif_msg_intr(np))
printk(KERN_DEBUG printk(KERN_DEBUG
"%s: Interrupt, status %#08x, mask %#08x.\n", "%s: Interrupt, status %#08x, mask %#08x.\n",
dev->name, intr_status, dev->name, np->intr_status,
readl(ioaddr + IntrMask)); readl(ioaddr + IntrMask));
if (intr_status == 0) if (!np->intr_status)
break; return IRQ_NONE;
handled = 1;
if (intr_status & prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]);
(IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
IntrRxErr | IntrRxOverrun)) { if (netif_rx_schedule_prep(dev)) {
netdev_rx(dev); /* Disable interrupts and register for poll */
natsemi_irq_disable(dev);
__netif_rx_schedule(dev);
}
return IRQ_HANDLED;
} }
if (intr_status & /* This is the NAPI poll routine. As well as the standard RX handling
* it also handles all other interrupts that the chip might raise.
*/
static int natsemi_poll(struct net_device *dev, int *budget)
{
struct netdev_private *np = netdev_priv(dev);
void __iomem * ioaddr = ns_ioaddr(dev);
int work_to_do = min(*budget, dev->quota);
int work_done = 0;
do {
if (np->intr_status &
(IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
spin_lock(&np->lock); spin_lock(&np->lock);
netdev_tx_done(dev); netdev_tx_done(dev);
@ -2198,28 +2250,39 @@ static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs
} }
/* Abnormal error summary/uncommon events handlers. */ /* Abnormal error summary/uncommon events handlers. */
if (intr_status & IntrAbnormalSummary) if (np->intr_status & IntrAbnormalSummary)
netdev_error(dev, intr_status); netdev_error(dev, np->intr_status);
if (--boguscnt < 0) { if (np->intr_status &
if (netif_msg_intr(np)) (IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
printk(KERN_WARNING IntrRxErr | IntrRxOverrun)) {
"%s: Too much work at interrupt, " netdev_rx(dev, &work_done, work_to_do);
"status=%#08x.\n",
dev->name, intr_status);
break;
} }
} while (1);
if (netif_msg_intr(np)) *budget -= work_done;
printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name); dev->quota -= work_done;
return IRQ_RETVAL(handled); if (work_done >= work_to_do)
return 1;
np->intr_status = readl(ioaddr + IntrStatus);
} while (np->intr_status);
netif_rx_complete(dev);
/* Reenable interrupts providing nothing is trying to shut
* the chip down. */
spin_lock(&np->lock);
if (!np->hands_off && netif_running(dev))
natsemi_irq_enable(dev);
spin_unlock(&np->lock);
return 0;
} }
/* This routine is logically part of the interrupt handler, but separated /* This routine is logically part of the interrupt handler, but separated
for clarity and better register allocation. */ for clarity and better register allocation. */
static void netdev_rx(struct net_device *dev) static void netdev_rx(struct net_device *dev, int *work_done, int work_to_do)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
int entry = np->cur_rx % RX_RING_SIZE; int entry = np->cur_rx % RX_RING_SIZE;
@ -2237,6 +2300,12 @@ static void netdev_rx(struct net_device *dev)
entry, desc_status); entry, desc_status);
if (--boguscnt < 0) if (--boguscnt < 0)
break; break;
if (*work_done >= work_to_do)
break;
(*work_done)++;
pkt_len = (desc_status & DescSizeMask) - 4; pkt_len = (desc_status & DescSizeMask) - 4;
if ((desc_status&(DescMore|DescPktOK|DescRxLong)) != DescPktOK){ if ((desc_status&(DescMore|DescPktOK|DescRxLong)) != DescPktOK){
if (desc_status & DescMore) { if (desc_status & DescMore) {
@ -2248,6 +2317,23 @@ static void netdev_rx(struct net_device *dev)
"status %#08x.\n", dev->name, "status %#08x.\n", dev->name,
np->cur_rx, desc_status); np->cur_rx, desc_status);
np->stats.rx_length_errors++; np->stats.rx_length_errors++;
/* The RX state machine has probably
* locked up beneath us. Follow the
* reset procedure documented in
* AN-1287. */
spin_lock_irq(&np->lock);
reset_rx(dev);
reinit_rx(dev);
writel(np->ring_dma, ioaddr + RxRingPtr);
check_link(dev);
spin_unlock_irq(&np->lock);
/* We'll enable RX on exit from this
* function. */
break;
} else { } else {
/* There was an error. */ /* There was an error. */
np->stats.rx_errors++; np->stats.rx_errors++;
@ -2293,7 +2379,7 @@ static void netdev_rx(struct net_device *dev)
np->rx_skbuff[entry] = NULL; np->rx_skbuff[entry] = NULL;
} }
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb); netif_receive_skb(skb);
dev->last_rx = jiffies; dev->last_rx = jiffies;
np->stats.rx_packets++; np->stats.rx_packets++;
np->stats.rx_bytes += pkt_len; np->stats.rx_bytes += pkt_len;
@ -3074,9 +3160,7 @@ static int netdev_close(struct net_device *dev)
del_timer_sync(&np->timer); del_timer_sync(&np->timer);
disable_irq(dev->irq); disable_irq(dev->irq);
spin_lock_irq(&np->lock); spin_lock_irq(&np->lock);
/* Disable interrupts, and flush posted writes */ natsemi_irq_disable(dev);
writel(0, ioaddr + IntrEnable);
readl(ioaddr + IntrEnable);
np->hands_off = 1; np->hands_off = 1;
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
enable_irq(dev->irq); enable_irq(dev->irq);
@ -3158,6 +3242,9 @@ static void __devexit natsemi_remove1 (struct pci_dev *pdev)
* * netdev_timer: timer stopped by natsemi_suspend. * * netdev_timer: timer stopped by natsemi_suspend.
* * intr_handler: doesn't acquire the spinlock. suspend calls * * intr_handler: doesn't acquire the spinlock. suspend calls
* disable_irq() to enforce synchronization. * disable_irq() to enforce synchronization.
* * natsemi_poll: checks before reenabling interrupts. suspend
* sets hands_off, disables interrupts and then waits with
* netif_poll_disable().
* *
* Interrupts must be disabled, otherwise hands_off can cause irq storms. * Interrupts must be disabled, otherwise hands_off can cause irq storms.
*/ */
@ -3183,6 +3270,8 @@ static int natsemi_suspend (struct pci_dev *pdev, pm_message_t state)
spin_unlock_irq(&np->lock); spin_unlock_irq(&np->lock);
enable_irq(dev->irq); enable_irq(dev->irq);
netif_poll_disable(dev);
/* Update the error counts. */ /* Update the error counts. */
__get_stats(dev); __get_stats(dev);
@ -3235,6 +3324,7 @@ static int natsemi_resume (struct pci_dev *pdev)
mod_timer(&np->timer, jiffies + 1*HZ); mod_timer(&np->timer, jiffies + 1*HZ);
} }
netif_device_attach(dev); netif_device_attach(dev);
netif_poll_enable(dev);
out: out:
rtnl_unlock(); rtnl_unlock();
return 0; return 0;

View file

@ -27,6 +27,7 @@ static const char version1[] =
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -365,7 +366,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -580,7 +581,7 @@ retry:
#endif #endif
while ((inb_p(NE_BASE + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(NE_BASE + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View file

@ -50,6 +50,7 @@ static const char version2[] =
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -341,7 +342,7 @@ static int __init ne_probe1(struct net_device *dev, int ioaddr)
outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET); outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
if (bad_card) { if (bad_card) {
printk(" (warning: no reset ack)"); printk(" (warning: no reset ack)");
break; break;
@ -580,7 +581,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name); printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
break; break;
} }
@ -787,7 +788,7 @@ retry:
#endif #endif
while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name); printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View file

@ -75,6 +75,7 @@ static const char *version = "ne2.c:v0.91 Nov 16 1998 Wim Dumon <wimpie@kotnet.o
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -395,7 +396,7 @@ static int __init ne2_probe1(struct net_device *dev, int slot)
outb(inb(base_addr + NE_RESET), base_addr + NE_RESET); outb(inb(base_addr + NE_RESET), base_addr + NE_RESET);
while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk(" not found (no reset ack).\n"); printk(" not found (no reset ack).\n");
retval = -ENODEV; retval = -ENODEV;
goto out; goto out;
@ -548,7 +549,7 @@ static void ne_reset_8390(struct net_device *dev)
/* This check _should_not_ be necessary, omit eventually. */ /* This check _should_not_ be necessary, omit eventually. */
while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) { if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
printk("%s: ne_reset_8390() did not complete.\n", printk("%s: ne_reset_8390() did not complete.\n",
dev->name); dev->name);
break; break;
@ -749,7 +750,7 @@ retry:
#endif #endif
while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
if (jiffies - dma_start > 2*HZ/100) { /* 20ms */ if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
ne_reset_8390(dev); ne_reset_8390(dev);
NS8390_init(dev,1); NS8390_init(dev,1);

View file

@ -117,7 +117,7 @@ enum ne2k_pci_chipsets {
}; };
static struct { static const struct {
char *name; char *name;
int flags; int flags;
} pci_clone_list[] __devinitdata = { } pci_clone_list[] __devinitdata = {

View file

@ -116,6 +116,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/jiffies.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -651,7 +652,7 @@ static void FASTCALL(phy_intr(struct net_device *ndev));
static void fastcall phy_intr(struct net_device *ndev) static void fastcall phy_intr(struct net_device *ndev)
{ {
struct ns83820 *dev = PRIV(ndev); struct ns83820 *dev = PRIV(ndev);
static char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" }; static const char *speeds[] = { "10", "100", "1000", "1000(?)", "1000F" };
u32 cfg, new_cfg; u32 cfg, new_cfg;
u32 tbisr, tanar, tanlpar; u32 tbisr, tanar, tanlpar;
int speed, fullduplex, newlinkstate; int speed, fullduplex, newlinkstate;
@ -1607,7 +1608,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
{ {
struct ns83820 *dev = PRIV(ndev); struct ns83820 *dev = PRIV(ndev);
int timed_out = 0; int timed_out = 0;
long start; unsigned long start;
u32 status; u32 status;
int loops = 0; int loops = 0;
@ -1625,7 +1626,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
break; break;
if (status & fail) if (status & fail)
break; break;
if ((jiffies - start) >= HZ) { if (time_after_eq(jiffies, start + HZ)) {
timed_out = 1; timed_out = 1;
break; break;
} }

View file

@ -20,6 +20,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jiffies.h>
#include <asm/board.h> #include <asm/board.h>
#include <asm/io.h> #include <asm/io.h>
@ -606,7 +607,7 @@ retry:
#endif #endif
while ((ei_ibp(base + EN0_ISR) & ENISR_RDC) == 0) { while ((ei_ibp(base + EN0_ISR) & ENISR_RDC) == 0) {
if (jiffies - start > OAKNET_WAIT) { if (time_after(jiffies, start + OAKNET_WAIT)) {
printk("%s: timeout waiting for Tx RDC.\n", dev->name); printk("%s: timeout waiting for Tx RDC.\n", dev->name);
oaknet_reset_8390(dev); oaknet_reset_8390(dev);
NS8390_init(dev, TRUE); NS8390_init(dev, TRUE);

View file

@ -341,7 +341,7 @@ static void tc574_detach(struct pcmcia_device *p_dev)
#define CS_CHECK(fn, ret) \ #define CS_CHECK(fn, ret) \
do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
static char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; static const char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
static void tc574_config(dev_link_t *link) static void tc574_config(dev_link_t *link)
{ {

View file

@ -39,6 +39,7 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <pcmcia/cs_types.h> #include <pcmcia/cs_types.h>
#include <pcmcia/cs.h> #include <pcmcia/cs.h>
@ -115,7 +116,7 @@ struct el3_private {
spinlock_t lock; spinlock_t lock;
}; };
static char *if_names[] = { "auto", "10baseT", "10base2", "AUI" }; static const char *if_names[] = { "auto", "10baseT", "10base2", "AUI" };
/*====================================================================*/ /*====================================================================*/
@ -796,7 +797,7 @@ static void media_check(unsigned long arg)
media = inw(ioaddr+WN4_MEDIA) & 0xc810; media = inw(ioaddr+WN4_MEDIA) & 0xc810;
/* Ignore collisions unless we've had no irq's recently */ /* Ignore collisions unless we've had no irq's recently */
if (jiffies - lp->last_irq < HZ) { if (time_before(jiffies, lp->last_irq + HZ)) {
media &= ~0x0010; media &= ~0x0010;
} else { } else {
/* Try harder to detect carrier errors */ /* Try harder to detect carrier errors */

View file

@ -309,7 +309,7 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
static int mfc_try_io_port(dev_link_t *link) static int mfc_try_io_port(dev_link_t *link)
{ {
int i, ret; int i, ret;
static kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
link->io.BasePort2 = serial_base[i]; link->io.BasePort2 = serial_base[i];

View file

@ -388,7 +388,7 @@ static char *version =
DRV_NAME " " DRV_VERSION " (Roger C. Pao)"; DRV_NAME " " DRV_VERSION " (Roger C. Pao)";
#endif #endif
static char *if_names[]={ static const char *if_names[]={
"Auto", "10baseT", "BNC", "Auto", "10baseT", "BNC",
}; };

View file

@ -66,7 +66,7 @@
#define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */ #define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */
static char *if_names[] = { "auto", "10baseT", "10base2"}; static const char *if_names[] = { "auto", "10baseT", "10base2"};
#ifdef PCMCIA_DEBUG #ifdef PCMCIA_DEBUG
static int pc_debug = PCMCIA_DEBUG; static int pc_debug = PCMCIA_DEBUG;
@ -1727,6 +1727,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9), PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9),
PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a), PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a),
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737), PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737),
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee),
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922), PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0), PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578), PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578),

View file

@ -59,7 +59,7 @@
/*====================================================================*/ /*====================================================================*/
static char *if_names[] = { "auto", "10baseT", "10base2"}; static const char *if_names[] = { "auto", "10baseT", "10base2"};
/* Module parameters */ /* Module parameters */
@ -777,7 +777,7 @@ free_cfg_mem:
static int osi_config(dev_link_t *link) static int osi_config(dev_link_t *link)
{ {
struct net_device *dev = link->priv; struct net_device *dev = link->priv;
static kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 }; static const kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
int i, j; int i, j;
link->conf.Attributes |= CONF_ENABLE_SPKR; link->conf.Attributes |= CONF_ENABLE_SPKR;

View file

@ -208,7 +208,7 @@ enum xirc_cmd { /* Commands */
#define XIRCREG45_REV 15 /* Revision Register (rd) */ #define XIRCREG45_REV 15 /* Revision Register (rd) */
#define XIRCREG50_IA 8 /* Individual Address (8-13) */ #define XIRCREG50_IA 8 /* Individual Address (8-13) */
static char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" }; static const char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" };
/**************** /****************
* All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If * All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If

View file

@ -26,7 +26,7 @@
#define DRV_RELDATE "01.Nov.2005" #define DRV_RELDATE "01.Nov.2005"
#define PFX DRV_NAME ": " #define PFX DRV_NAME ": "
static const char *version = static const char * const version =
DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " tsbogend@alpha.franken.de\n"; DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " tsbogend@alpha.franken.de\n";
#include <linux/module.h> #include <linux/module.h>
@ -109,7 +109,7 @@ static int rx_copybreak = 200;
* table to translate option values from tulip * table to translate option values from tulip
* to internal options * to internal options
*/ */
static unsigned char options_mapping[] = { static const unsigned char options_mapping[] = {
PCNET32_PORT_ASEL, /* 0 Auto-select */ PCNET32_PORT_ASEL, /* 0 Auto-select */
PCNET32_PORT_AUI, /* 1 BNC/AUI */ PCNET32_PORT_AUI, /* 1 BNC/AUI */
PCNET32_PORT_AUI, /* 2 AUI/BNC */ PCNET32_PORT_AUI, /* 2 AUI/BNC */
@ -733,7 +733,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t *data1)
int rc; /* return code */ int rc; /* return code */
int size; /* size of packets */ int size; /* size of packets */
unsigned char *packet; /* source packet data */ unsigned char *packet; /* source packet data */
static int data_len = 60; /* length of source packets */ static const int data_len = 60; /* length of source packets */
unsigned long flags; unsigned long flags;
unsigned long ticks; unsigned long ticks;

View file

@ -132,7 +132,7 @@ struct phy_setting {
}; };
/* A mapping of all SUPPORTED settings to speed/duplex */ /* A mapping of all SUPPORTED settings to speed/duplex */
static struct phy_setting settings[] = { static const struct phy_setting settings[] = {
{ {
.speed = 10000, .speed = 10000,
.duplex = DUPLEX_FULL, .duplex = DUPLEX_FULL,

View file

@ -123,7 +123,7 @@ static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n"
#ifndef NET_DEBUG #ifndef NET_DEBUG
#define NET_DEBUG 1 #define NET_DEBUG 1
#endif #endif
static unsigned int net_debug = NET_DEBUG; static const unsigned int net_debug = NET_DEBUG;
#define ENABLE(irq) if (irq != -1) enable_irq(irq) #define ENABLE(irq) if (irq != -1) enable_irq(irq)
#define DISABLE(irq) if (irq != -1) disable_irq(irq) #define DISABLE(irq) if (irq != -1) disable_irq(irq)
@ -351,7 +351,7 @@ static int plip_bh_timeout_error(struct net_device *dev, struct net_local *nl,
typedef int (*plip_func)(struct net_device *dev, struct net_local *nl, typedef int (*plip_func)(struct net_device *dev, struct net_local *nl,
struct plip_local *snd, struct plip_local *rcv); struct plip_local *snd, struct plip_local *rcv);
static plip_func connection_state_table[] = static const plip_func connection_state_table[] =
{ {
plip_none, plip_none,
plip_receive_packet, plip_receive_packet,

View file

@ -30,6 +30,7 @@
#include <linux/ppp_channel.h> #include <linux/ppp_channel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/jiffies.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/string.h> #include <asm/string.h>
@ -570,7 +571,7 @@ ppp_async_encode(struct asyncppp *ap)
* character if necessary. * character if necessary.
*/ */
if (islcp || flag_time == 0 if (islcp || flag_time == 0
|| jiffies - ap->last_xmit >= flag_time) || time_after_eq(jiffies, ap->last_xmit + flag_time))
*buf++ = PPP_FLAG; *buf++ = PPP_FLAG;
ap->last_xmit = jiffies; ap->last_xmit = jiffies;
fcs = PPP_INITFCS; fcs = PPP_INITFCS;

View file

@ -108,7 +108,7 @@ static void
ppp_print_hex (register __u8 * out, const __u8 * in, int count) ppp_print_hex (register __u8 * out, const __u8 * in, int count)
{ {
register __u8 next_ch; register __u8 next_ch;
static char hex[] = "0123456789ABCDEF"; static const char hex[] = "0123456789ABCDEF";
while (count-- > 0) { while (count-- > 0) {
next_ch = *in++; next_ch = *in++;

View file

@ -113,11 +113,11 @@ static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
static int num_media = 0; static int num_media = 0;
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
static int max_interrupt_work = 20; static const int max_interrupt_work = 20;
/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). /* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
The RTL chips use a 64 element hash table based on the Ethernet CRC. */ The RTL chips use a 64 element hash table based on the Ethernet CRC. */
static int multicast_filter_limit = 32; static const int multicast_filter_limit = 32;
/* MAC address length */ /* MAC address length */
#define MAC_ADDR_LEN 6 #define MAC_ADDR_LEN 6

View file

@ -57,23 +57,27 @@
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <net/tcp.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/div64.h>
/* local include */ /* local include */
#include "s2io.h" #include "s2io.h"
#include "s2io-regs.h" #include "s2io-regs.h"
#define DRV_VERSION "Version 2.0.9.4" #define DRV_VERSION "2.0.11.2"
/* S2io Driver name & version. */ /* S2io Driver name & version. */
static char s2io_driver_name[] = "Neterion"; static char s2io_driver_name[] = "Neterion";
static char s2io_driver_version[] = DRV_VERSION; static char s2io_driver_version[] = DRV_VERSION;
int rxd_size[4] = {32,48,48,64}; static int rxd_size[4] = {32,48,48,64};
int rxd_count[4] = {127,85,85,63}; static int rxd_count[4] = {127,85,85,63};
static inline int RXD_IS_UP2DT(RxD_t *rxdp) static inline int RXD_IS_UP2DT(RxD_t *rxdp)
{ {
@ -168,6 +172,11 @@ static char ethtool_stats_keys[][ETH_GSTRING_LEN] = {
{"\n DRIVER STATISTICS"}, {"\n DRIVER STATISTICS"},
{"single_bit_ecc_errs"}, {"single_bit_ecc_errs"},
{"double_bit_ecc_errs"}, {"double_bit_ecc_errs"},
("lro_aggregated_pkts"),
("lro_flush_both_count"),
("lro_out_of_sequence_pkts"),
("lro_flush_due_to_max_pkts"),
("lro_avg_aggr_pkts"),
}; };
#define S2IO_STAT_LEN sizeof(ethtool_stats_keys)/ ETH_GSTRING_LEN #define S2IO_STAT_LEN sizeof(ethtool_stats_keys)/ ETH_GSTRING_LEN
@ -214,7 +223,7 @@ static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid)
#define SWITCH_SIGN 0xA5A5A5A5A5A5A5A5ULL #define SWITCH_SIGN 0xA5A5A5A5A5A5A5A5ULL
#define END_SIGN 0x0 #define END_SIGN 0x0
static u64 herc_act_dtx_cfg[] = { static const u64 herc_act_dtx_cfg[] = {
/* Set address */ /* Set address */
0x8000051536750000ULL, 0x80000515367500E0ULL, 0x8000051536750000ULL, 0x80000515367500E0ULL,
/* Write data */ /* Write data */
@ -235,7 +244,7 @@ static u64 herc_act_dtx_cfg[] = {
END_SIGN END_SIGN
}; };
static u64 xena_mdio_cfg[] = { static const u64 xena_mdio_cfg[] = {
/* Reset PMA PLL */ /* Reset PMA PLL */
0xC001010000000000ULL, 0xC0010100000000E0ULL, 0xC001010000000000ULL, 0xC0010100000000E0ULL,
0xC0010100008000E4ULL, 0xC0010100008000E4ULL,
@ -245,7 +254,7 @@ static u64 xena_mdio_cfg[] = {
END_SIGN END_SIGN
}; };
static u64 xena_dtx_cfg[] = { static const u64 xena_dtx_cfg[] = {
0x8000051500000000ULL, 0x80000515000000E0ULL, 0x8000051500000000ULL, 0x80000515000000E0ULL,
0x80000515D93500E4ULL, 0x8001051500000000ULL, 0x80000515D93500E4ULL, 0x8001051500000000ULL,
0x80010515000000E0ULL, 0x80010515001E00E4ULL, 0x80010515000000E0ULL, 0x80010515001E00E4ULL,
@ -273,7 +282,7 @@ static u64 xena_dtx_cfg[] = {
* Constants for Fixing the MacAddress problem seen mostly on * Constants for Fixing the MacAddress problem seen mostly on
* Alpha machines. * Alpha machines.
*/ */
static u64 fix_mac[] = { static const u64 fix_mac[] = {
0x0060000000000000ULL, 0x0060600000000000ULL, 0x0060000000000000ULL, 0x0060600000000000ULL,
0x0040600000000000ULL, 0x0000600000000000ULL, 0x0040600000000000ULL, 0x0000600000000000ULL,
0x0020600000000000ULL, 0x0060600000000000ULL, 0x0020600000000000ULL, 0x0060600000000000ULL,
@ -317,6 +326,12 @@ static unsigned int indicate_max_pkts;
static unsigned int rxsync_frequency = 3; static unsigned int rxsync_frequency = 3;
/* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */ /* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */
static unsigned int intr_type = 0; static unsigned int intr_type = 0;
/* Large receive offload feature */
static unsigned int lro = 0;
/* Max pkts to be aggregated by LRO at one time. If not specified,
* aggregation happens until we hit max IP pkt size(64K)
*/
static unsigned int lro_max_pkts = 0xFFFF;
/* /*
* S2IO device table. * S2IO device table.
@ -1476,6 +1491,19 @@ static int init_nic(struct s2io_nic *nic)
writel((u32) (val64 >> 32), (add + 4)); writel((u32) (val64 >> 32), (add + 4));
val64 = readq(&bar0->mac_cfg); val64 = readq(&bar0->mac_cfg);
/* Enable FCS stripping by adapter */
add = &bar0->mac_cfg;
val64 = readq(&bar0->mac_cfg);
val64 |= MAC_CFG_RMAC_STRIP_FCS;
if (nic->device_type == XFRAME_II_DEVICE)
writeq(val64, &bar0->mac_cfg);
else {
writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
writel((u32) (val64), add);
writeq(RMAC_CFG_KEY(0x4C0D), &bar0->rmac_cfg_key);
writel((u32) (val64 >> 32), (add + 4));
}
/* /*
* Set the time value to be inserted in the pause frame * Set the time value to be inserted in the pause frame
* generated by xena. * generated by xena.
@ -2127,7 +2155,7 @@ static void stop_nic(struct s2io_nic *nic)
} }
} }
int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb) static int fill_rxd_3buf(nic_t *nic, RxD_t *rxdp, struct sk_buff *skb)
{ {
struct net_device *dev = nic->dev; struct net_device *dev = nic->dev;
struct sk_buff *frag_list; struct sk_buff *frag_list;
@ -2569,6 +2597,8 @@ static void rx_intr_handler(ring_info_t *ring_data)
#ifndef CONFIG_S2IO_NAPI #ifndef CONFIG_S2IO_NAPI
int pkt_cnt = 0; int pkt_cnt = 0;
#endif #endif
int i;
spin_lock(&nic->rx_lock); spin_lock(&nic->rx_lock);
if (atomic_read(&nic->card_state) == CARD_DOWN) { if (atomic_read(&nic->card_state) == CARD_DOWN) {
DBG_PRINT(INTR_DBG, "%s: %s going down for reset\n", DBG_PRINT(INTR_DBG, "%s: %s going down for reset\n",
@ -2661,6 +2691,18 @@ static void rx_intr_handler(ring_info_t *ring_data)
break; break;
#endif #endif
} }
if (nic->lro) {
/* Clear all LRO sessions before exiting */
for (i=0; i<MAX_LRO_SESSIONS; i++) {
lro_t *lro = &nic->lro0_n[i];
if (lro->in_use) {
update_L3L4_header(nic, lro);
queue_rx_frame(lro->parent);
clear_lro_session(lro);
}
}
}
spin_unlock(&nic->rx_lock); spin_unlock(&nic->rx_lock);
} }
@ -2852,7 +2894,7 @@ static int wait_for_cmd_complete(nic_t * sp)
* void. * void.
*/ */
void s2io_reset(nic_t * sp) static void s2io_reset(nic_t * sp)
{ {
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
u64 val64; u64 val64;
@ -2940,7 +2982,7 @@ void s2io_reset(nic_t * sp)
* SUCCESS on success and FAILURE on failure. * SUCCESS on success and FAILURE on failure.
*/ */
int s2io_set_swapper(nic_t * sp) static int s2io_set_swapper(nic_t * sp)
{ {
struct net_device *dev = sp->dev; struct net_device *dev = sp->dev;
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
@ -3089,7 +3131,7 @@ static int wait_for_msix_trans(nic_t *nic, int i)
return ret; return ret;
} }
void restore_xmsi_data(nic_t *nic) static void restore_xmsi_data(nic_t *nic)
{ {
XENA_dev_config_t __iomem *bar0 = nic->bar0; XENA_dev_config_t __iomem *bar0 = nic->bar0;
u64 val64; u64 val64;
@ -3180,7 +3222,7 @@ int s2io_enable_msi(nic_t *nic)
return 0; return 0;
} }
int s2io_enable_msi_x(nic_t *nic) static int s2io_enable_msi_x(nic_t *nic)
{ {
XENA_dev_config_t __iomem *bar0 = nic->bar0; XENA_dev_config_t __iomem *bar0 = nic->bar0;
u64 tx_mat, rx_mat; u64 tx_mat, rx_mat;
@ -3668,11 +3710,13 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs)
* else schedule a tasklet to reallocate the buffers. * else schedule a tasklet to reallocate the buffers.
*/ */
for (i = 0; i < config->rx_ring_num; i++) { for (i = 0; i < config->rx_ring_num; i++) {
if (!sp->lro) {
int rxb_size = atomic_read(&sp->rx_bufs_left[i]); int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
int level = rx_buffer_level(sp, rxb_size, i); int level = rx_buffer_level(sp, rxb_size, i);
if ((level == PANIC) && (!TASKLET_IN_USE)) { if ((level == PANIC) && (!TASKLET_IN_USE)) {
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", dev->name); DBG_PRINT(INTR_DBG, "%s: Rx BD hit ",
dev->name);
DBG_PRINT(INTR_DBG, "PANIC levels\n"); DBG_PRINT(INTR_DBG, "PANIC levels\n");
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
DBG_PRINT(ERR_DBG, "%s:Out of memory", DBG_PRINT(ERR_DBG, "%s:Out of memory",
@ -3687,6 +3731,13 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs)
tasklet_schedule(&sp->task); tasklet_schedule(&sp->task);
} }
} }
else if (fill_rx_buffers(sp, i) == -ENOMEM) {
DBG_PRINT(ERR_DBG, "%s:Out of memory",
dev->name);
DBG_PRINT(ERR_DBG, " in Rx Intr!!\n");
break;
}
}
atomic_dec(&sp->isr_cnt); atomic_dec(&sp->isr_cnt);
return IRQ_HANDLED; return IRQ_HANDLED;
@ -3697,12 +3748,14 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs)
{ {
ring_info_t *ring = (ring_info_t *)dev_id; ring_info_t *ring = (ring_info_t *)dev_id;
nic_t *sp = ring->nic; nic_t *sp = ring->nic;
struct net_device *dev = (struct net_device *) dev_id;
int rxb_size, level, rng_n; int rxb_size, level, rng_n;
atomic_inc(&sp->isr_cnt); atomic_inc(&sp->isr_cnt);
rx_intr_handler(ring); rx_intr_handler(ring);
rng_n = ring->ring_no; rng_n = ring->ring_no;
if (!sp->lro) {
rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]); rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]);
level = rx_buffer_level(sp, rxb_size, rng_n); level = rx_buffer_level(sp, rxb_size, rng_n);
@ -3720,6 +3773,12 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs)
} else if (level == LOW) { } else if (level == LOW) {
tasklet_schedule(&sp->task); tasklet_schedule(&sp->task);
} }
}
else if (fill_rx_buffers(sp, rng_n) == -ENOMEM) {
DBG_PRINT(ERR_DBG, "%s:Out of memory", dev->name);
DBG_PRINT(ERR_DBG, " in Rx Intr!!\n");
}
atomic_dec(&sp->isr_cnt); atomic_dec(&sp->isr_cnt);
return IRQ_HANDLED; return IRQ_HANDLED;
@ -3875,12 +3934,14 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs)
*/ */
#ifndef CONFIG_S2IO_NAPI #ifndef CONFIG_S2IO_NAPI
for (i = 0; i < config->rx_ring_num; i++) { for (i = 0; i < config->rx_ring_num; i++) {
if (!sp->lro) {
int ret; int ret;
int rxb_size = atomic_read(&sp->rx_bufs_left[i]); int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
int level = rx_buffer_level(sp, rxb_size, i); int level = rx_buffer_level(sp, rxb_size, i);
if ((level == PANIC) && (!TASKLET_IN_USE)) { if ((level == PANIC) && (!TASKLET_IN_USE)) {
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", dev->name); DBG_PRINT(INTR_DBG, "%s: Rx BD hit ",
dev->name);
DBG_PRINT(INTR_DBG, "PANIC levels\n"); DBG_PRINT(INTR_DBG, "PANIC levels\n");
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) { if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
DBG_PRINT(ERR_DBG, "%s:Out of memory", DBG_PRINT(ERR_DBG, "%s:Out of memory",
@ -3895,6 +3956,13 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs)
tasklet_schedule(&sp->task); tasklet_schedule(&sp->task);
} }
} }
else if (fill_rx_buffers(sp, i) == -ENOMEM) {
DBG_PRINT(ERR_DBG, "%s:Out of memory",
dev->name);
DBG_PRINT(ERR_DBG, " in Rx intr!!\n");
break;
}
}
#endif #endif
atomic_dec(&sp->isr_cnt); atomic_dec(&sp->isr_cnt);
@ -4129,7 +4197,7 @@ static void s2io_set_multicast(struct net_device *dev)
* as defined in errno.h file on failure. * as defined in errno.h file on failure.
*/ */
int s2io_set_mac_addr(struct net_device *dev, u8 * addr) static int s2io_set_mac_addr(struct net_device *dev, u8 * addr)
{ {
nic_t *sp = dev->priv; nic_t *sp = dev->priv;
XENA_dev_config_t __iomem *bar0 = sp->bar0; XENA_dev_config_t __iomem *bar0 = sp->bar0;
@ -5044,6 +5112,7 @@ static void s2io_get_ethtool_stats(struct net_device *dev,
int i = 0; int i = 0;
nic_t *sp = dev->priv; nic_t *sp = dev->priv;
StatInfo_t *stat_info = sp->mac_control.stats_info; StatInfo_t *stat_info = sp->mac_control.stats_info;
u64 tmp;
s2io_updt_stats(sp); s2io_updt_stats(sp);
tmp_stats[i++] = tmp_stats[i++] =
@ -5135,6 +5204,16 @@ static void s2io_get_ethtool_stats(struct net_device *dev,
tmp_stats[i++] = 0; tmp_stats[i++] = 0;
tmp_stats[i++] = stat_info->sw_stat.single_ecc_errs; tmp_stats[i++] = stat_info->sw_stat.single_ecc_errs;
tmp_stats[i++] = stat_info->sw_stat.double_ecc_errs; tmp_stats[i++] = stat_info->sw_stat.double_ecc_errs;
tmp_stats[i++] = stat_info->sw_stat.clubbed_frms_cnt;
tmp_stats[i++] = stat_info->sw_stat.sending_both;
tmp_stats[i++] = stat_info->sw_stat.outof_sequence_pkts;
tmp_stats[i++] = stat_info->sw_stat.flush_max_pkts;
tmp = 0;
if (stat_info->sw_stat.num_aggregations) {
tmp = stat_info->sw_stat.sum_avg_pkts_aggregated;
do_div(tmp, stat_info->sw_stat.num_aggregations);
}
tmp_stats[i++] = tmp;
} }
static int s2io_ethtool_get_regs_len(struct net_device *dev) static int s2io_ethtool_get_regs_len(struct net_device *dev)
@ -5516,6 +5595,14 @@ static int s2io_card_up(nic_t * sp)
/* Setting its receive mode */ /* Setting its receive mode */
s2io_set_multicast(dev); s2io_set_multicast(dev);
if (sp->lro) {
/* Initialize max aggregatable pkts based on MTU */
sp->lro_max_aggr_per_sess = ((1<<16) - 1) / dev->mtu;
/* Check if we can use(if specified) user provided value */
if (lro_max_pkts < sp->lro_max_aggr_per_sess)
sp->lro_max_aggr_per_sess = lro_max_pkts;
}
/* Enable tasklet for the device */ /* Enable tasklet for the device */
tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev); tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev);
@ -5608,6 +5695,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
((unsigned long) rxdp->Host_Control); ((unsigned long) rxdp->Host_Control);
int ring_no = ring_data->ring_no; int ring_no = ring_data->ring_no;
u16 l3_csum, l4_csum; u16 l3_csum, l4_csum;
lro_t *lro;
skb->dev = dev; skb->dev = dev;
if (rxdp->Control_1 & RXD_T_CODE) { if (rxdp->Control_1 & RXD_T_CODE) {
@ -5656,7 +5744,8 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
skb_put(skb, buf2_len); skb_put(skb, buf2_len);
} }
if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && if ((rxdp->Control_1 & TCP_OR_UDP_FRAME) && ((!sp->lro) ||
(sp->lro && (!(rxdp->Control_1 & RXD_FRAME_IP_FRAG)))) &&
(sp->rx_csum)) { (sp->rx_csum)) {
l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1); l3_csum = RXD_GET_L3_CKSUM(rxdp->Control_1);
l4_csum = RXD_GET_L4_CKSUM(rxdp->Control_1); l4_csum = RXD_GET_L4_CKSUM(rxdp->Control_1);
@ -5667,6 +5756,54 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
* a flag in the RxD. * a flag in the RxD.
*/ */
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
if (sp->lro) {
u32 tcp_len;
u8 *tcp;
int ret = 0;
ret = s2io_club_tcp_session(skb->data, &tcp,
&tcp_len, &lro, rxdp, sp);
switch (ret) {
case 3: /* Begin anew */
lro->parent = skb;
goto aggregate;
case 1: /* Aggregate */
{
lro_append_pkt(sp, lro,
skb, tcp_len);
goto aggregate;
}
case 4: /* Flush session */
{
lro_append_pkt(sp, lro,
skb, tcp_len);
queue_rx_frame(lro->parent);
clear_lro_session(lro);
sp->mac_control.stats_info->
sw_stat.flush_max_pkts++;
goto aggregate;
}
case 2: /* Flush both */
lro->parent->data_len =
lro->frags_len;
sp->mac_control.stats_info->
sw_stat.sending_both++;
queue_rx_frame(lro->parent);
clear_lro_session(lro);
goto send_up;
case 0: /* sessions exceeded */
case 5: /*
* First pkt in session not
* L3/L4 aggregatable
*/
break;
default:
DBG_PRINT(ERR_DBG,
"%s: Samadhana!!\n",
__FUNCTION__);
BUG();
}
}
} else { } else {
/* /*
* Packet with erroneous checksum, let the * Packet with erroneous checksum, let the
@ -5678,6 +5815,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
} }
if (!sp->lro) {
skb->protocol = eth_type_trans(skb, dev); skb->protocol = eth_type_trans(skb, dev);
#ifdef CONFIG_S2IO_NAPI #ifdef CONFIG_S2IO_NAPI
if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) { if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) {
@ -5696,7 +5834,12 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
netif_rx(skb); netif_rx(skb);
} }
#endif #endif
} else {
send_up:
queue_rx_frame(skb);
}
dev->last_rx = jiffies; dev->last_rx = jiffies;
aggregate:
atomic_dec(&sp->rx_bufs_left[ring_no]); atomic_dec(&sp->rx_bufs_left[ring_no]);
return SUCCESS; return SUCCESS;
} }
@ -5714,7 +5857,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
* void. * void.
*/ */
void s2io_link(nic_t * sp, int link) static void s2io_link(nic_t * sp, int link)
{ {
struct net_device *dev = (struct net_device *) sp->dev; struct net_device *dev = (struct net_device *) sp->dev;
@ -5739,7 +5882,7 @@ void s2io_link(nic_t * sp, int link)
* returns the revision ID of the device. * returns the revision ID of the device.
*/ */
int get_xena_rev_id(struct pci_dev *pdev) static int get_xena_rev_id(struct pci_dev *pdev)
{ {
u8 id = 0; u8 id = 0;
int ret; int ret;
@ -5808,6 +5951,8 @@ module_param(indicate_max_pkts, int, 0);
#endif #endif
module_param(rxsync_frequency, int, 0); module_param(rxsync_frequency, int, 0);
module_param(intr_type, int, 0); module_param(intr_type, int, 0);
module_param(lro, int, 0);
module_param(lro_max_pkts, int, 0);
/** /**
* s2io_init_nic - Initialization of the adapter . * s2io_init_nic - Initialization of the adapter .
@ -5939,6 +6084,7 @@ Defaulting to INTA\n");
else else
sp->device_type = XFRAME_I_DEVICE; sp->device_type = XFRAME_I_DEVICE;
sp->lro = lro;
/* Initialize some PCI/PCI-X fields of the NIC. */ /* Initialize some PCI/PCI-X fields of the NIC. */
s2io_init_pci(sp); s2io_init_pci(sp);
@ -6242,6 +6388,10 @@ Defaulting to INTA\n");
DBG_PRINT(ERR_DBG, "%s: 3-Buffer mode support has been " DBG_PRINT(ERR_DBG, "%s: 3-Buffer mode support has been "
"enabled\n",dev->name); "enabled\n",dev->name);
if (sp->lro)
DBG_PRINT(ERR_DBG, "%s: Large receive offload enabled\n",
dev->name);
/* Initialize device name */ /* Initialize device name */
strcpy(sp->name, dev->name); strcpy(sp->name, dev->name);
if (sp->device_type & XFRAME_II_DEVICE) if (sp->device_type & XFRAME_II_DEVICE)
@ -6344,7 +6494,7 @@ int __init s2io_starter(void)
* Description: This function is the cleanup routine for the driver. It unregist * ers the driver. * Description: This function is the cleanup routine for the driver. It unregist * ers the driver.
*/ */
void s2io_closer(void) static void s2io_closer(void)
{ {
pci_unregister_driver(&s2io_driver); pci_unregister_driver(&s2io_driver);
DBG_PRINT(INIT_DBG, "cleanup done\n"); DBG_PRINT(INIT_DBG, "cleanup done\n");
@ -6352,3 +6502,318 @@ void s2io_closer(void)
module_init(s2io_starter); module_init(s2io_starter);
module_exit(s2io_closer); module_exit(s2io_closer);
static int check_L2_lro_capable(u8 *buffer, struct iphdr **ip,
struct tcphdr **tcp, RxD_t *rxdp)
{
int ip_off;
u8 l2_type = (u8)((rxdp->Control_1 >> 37) & 0x7), ip_len;
if (!(rxdp->Control_1 & RXD_FRAME_PROTO_TCP)) {
DBG_PRINT(INIT_DBG,"%s: Non-TCP frames not supported for LRO\n",
__FUNCTION__);
return -1;
}
/* TODO:
* By default the VLAN field in the MAC is stripped by the card, if this
* feature is turned off in rx_pa_cfg register, then the ip_off field
* has to be shifted by a further 2 bytes
*/
switch (l2_type) {
case 0: /* DIX type */
case 4: /* DIX type with VLAN */
ip_off = HEADER_ETHERNET_II_802_3_SIZE;
break;
/* LLC, SNAP etc are considered non-mergeable */
default:
return -1;
}
*ip = (struct iphdr *)((u8 *)buffer + ip_off);
ip_len = (u8)((*ip)->ihl);
ip_len <<= 2;
*tcp = (struct tcphdr *)((unsigned long)*ip + ip_len);
return 0;
}
static int check_for_socket_match(lro_t *lro, struct iphdr *ip,
struct tcphdr *tcp)
{
DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__);
if ((lro->iph->saddr != ip->saddr) || (lro->iph->daddr != ip->daddr) ||
(lro->tcph->source != tcp->source) || (lro->tcph->dest != tcp->dest))
return -1;
return 0;
}
static inline int get_l4_pyld_length(struct iphdr *ip, struct tcphdr *tcp)
{
return(ntohs(ip->tot_len) - (ip->ihl << 2) - (tcp->doff << 2));
}
static void initiate_new_session(lro_t *lro, u8 *l2h,
struct iphdr *ip, struct tcphdr *tcp, u32 tcp_pyld_len)
{
DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__);
lro->l2h = l2h;
lro->iph = ip;
lro->tcph = tcp;
lro->tcp_next_seq = tcp_pyld_len + ntohl(tcp->seq);
lro->tcp_ack = ntohl(tcp->ack_seq);
lro->sg_num = 1;
lro->total_len = ntohs(ip->tot_len);
lro->frags_len = 0;
/*
* check if we saw TCP timestamp. Other consistency checks have
* already been done.
*/
if (tcp->doff == 8) {
u32 *ptr;
ptr = (u32 *)(tcp+1);
lro->saw_ts = 1;
lro->cur_tsval = *(ptr+1);
lro->cur_tsecr = *(ptr+2);
}
lro->in_use = 1;
}
static void update_L3L4_header(nic_t *sp, lro_t *lro)
{
struct iphdr *ip = lro->iph;
struct tcphdr *tcp = lro->tcph;
u16 nchk;
StatInfo_t *statinfo = sp->mac_control.stats_info;
DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__);
/* Update L3 header */
ip->tot_len = htons(lro->total_len);
ip->check = 0;
nchk = ip_fast_csum((u8 *)lro->iph, ip->ihl);
ip->check = nchk;
/* Update L4 header */
tcp->ack_seq = lro->tcp_ack;
tcp->window = lro->window;
/* Update tsecr field if this session has timestamps enabled */
if (lro->saw_ts) {
u32 *ptr = (u32 *)(tcp + 1);
*(ptr+2) = lro->cur_tsecr;
}
/* Update counters required for calculation of
* average no. of packets aggregated.
*/
statinfo->sw_stat.sum_avg_pkts_aggregated += lro->sg_num;
statinfo->sw_stat.num_aggregations++;
}
static void aggregate_new_rx(lro_t *lro, struct iphdr *ip,
struct tcphdr *tcp, u32 l4_pyld)
{
DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__);
lro->total_len += l4_pyld;
lro->frags_len += l4_pyld;
lro->tcp_next_seq += l4_pyld;
lro->sg_num++;
/* Update ack seq no. and window ad(from this pkt) in LRO object */
lro->tcp_ack = tcp->ack_seq;
lro->window = tcp->window;
if (lro->saw_ts) {
u32 *ptr;
/* Update tsecr and tsval from this packet */
ptr = (u32 *) (tcp + 1);
lro->cur_tsval = *(ptr + 1);
lro->cur_tsecr = *(ptr + 2);
}
}
static int verify_l3_l4_lro_capable(lro_t *l_lro, struct iphdr *ip,
struct tcphdr *tcp, u32 tcp_pyld_len)
{
u8 *ptr;
DBG_PRINT(INFO_DBG,"%s: Been here...\n", __FUNCTION__);
if (!tcp_pyld_len) {
/* Runt frame or a pure ack */
return -1;
}
if (ip->ihl != 5) /* IP has options */
return -1;
if (tcp->urg || tcp->psh || tcp->rst || tcp->syn || tcp->fin ||
!tcp->ack) {
/*
* Currently recognize only the ack control word and
* any other control field being set would result in
* flushing the LRO session
*/
return -1;
}
/*
* Allow only one TCP timestamp option. Don't aggregate if
* any other options are detected.
*/
if (tcp->doff != 5 && tcp->doff != 8)
return -1;
if (tcp->doff == 8) {
ptr = (u8 *)(tcp + 1);
while (*ptr == TCPOPT_NOP)
ptr++;
if (*ptr != TCPOPT_TIMESTAMP || *(ptr+1) != TCPOLEN_TIMESTAMP)
return -1;
/* Ensure timestamp value increases monotonically */
if (l_lro)
if (l_lro->cur_tsval > *((u32 *)(ptr+2)))
return -1;
/* timestamp echo reply should be non-zero */
if (*((u32 *)(ptr+6)) == 0)
return -1;
}
return 0;
}
static int
s2io_club_tcp_session(u8 *buffer, u8 **tcp, u32 *tcp_len, lro_t **lro,
RxD_t *rxdp, nic_t *sp)
{
struct iphdr *ip;
struct tcphdr *tcph;
int ret = 0, i;
if (!(ret = check_L2_lro_capable(buffer, &ip, (struct tcphdr **)tcp,
rxdp))) {
DBG_PRINT(INFO_DBG,"IP Saddr: %x Daddr: %x\n",
ip->saddr, ip->daddr);
} else {
return ret;
}
tcph = (struct tcphdr *)*tcp;
*tcp_len = get_l4_pyld_length(ip, tcph);
for (i=0; i<MAX_LRO_SESSIONS; i++) {
lro_t *l_lro = &sp->lro0_n[i];
if (l_lro->in_use) {
if (check_for_socket_match(l_lro, ip, tcph))
continue;
/* Sock pair matched */
*lro = l_lro;
if ((*lro)->tcp_next_seq != ntohl(tcph->seq)) {
DBG_PRINT(INFO_DBG, "%s:Out of order. expected "
"0x%x, actual 0x%x\n", __FUNCTION__,
(*lro)->tcp_next_seq,
ntohl(tcph->seq));
sp->mac_control.stats_info->
sw_stat.outof_sequence_pkts++;
ret = 2;
break;
}
if (!verify_l3_l4_lro_capable(l_lro, ip, tcph,*tcp_len))
ret = 1; /* Aggregate */
else
ret = 2; /* Flush both */
break;
}
}
if (ret == 0) {
/* Before searching for available LRO objects,
* check if the pkt is L3/L4 aggregatable. If not
* don't create new LRO session. Just send this
* packet up.
*/
if (verify_l3_l4_lro_capable(NULL, ip, tcph, *tcp_len)) {
return 5;
}
for (i=0; i<MAX_LRO_SESSIONS; i++) {
lro_t *l_lro = &sp->lro0_n[i];
if (!(l_lro->in_use)) {
*lro = l_lro;
ret = 3; /* Begin anew */
break;
}
}
}
if (ret == 0) { /* sessions exceeded */
DBG_PRINT(INFO_DBG,"%s:All LRO sessions already in use\n",
__FUNCTION__);
*lro = NULL;
return ret;
}
switch (ret) {
case 3:
initiate_new_session(*lro, buffer, ip, tcph, *tcp_len);
break;
case 2:
update_L3L4_header(sp, *lro);
break;
case 1:
aggregate_new_rx(*lro, ip, tcph, *tcp_len);
if ((*lro)->sg_num == sp->lro_max_aggr_per_sess) {
update_L3L4_header(sp, *lro);
ret = 4; /* Flush the LRO */
}
break;
default:
DBG_PRINT(ERR_DBG,"%s:Dont know, can't say!!\n",
__FUNCTION__);
break;
}
return ret;
}
static void clear_lro_session(lro_t *lro)
{
static u16 lro_struct_size = sizeof(lro_t);
memset(lro, 0, lro_struct_size);
}
static void queue_rx_frame(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
skb->protocol = eth_type_trans(skb, dev);
#ifdef CONFIG_S2IO_NAPI
netif_receive_skb(skb);
#else
netif_rx(skb);
#endif
}
static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb,
u32 tcp_len)
{
struct sk_buff *tmp, *first = lro->parent;
first->len += tcp_len;
first->data_len = lro->frags_len;
skb_pull(skb, (skb->len - tcp_len));
if ((tmp = skb_shinfo(first)->frag_list)) {
while (tmp->next)
tmp = tmp->next;
tmp->next = skb;
}
else
skb_shinfo(first)->frag_list = skb;
sp->mac_control.stats_info->sw_stat.clubbed_frms_cnt++;
return;
}

View file

@ -64,7 +64,7 @@ typedef enum xena_max_outstanding_splits {
#define INTR_DBG 4 #define INTR_DBG 4
/* Global variable that defines the present debug level of the driver. */ /* Global variable that defines the present debug level of the driver. */
int debug_level = ERR_DBG; /* Default level. */ static int debug_level = ERR_DBG;
/* DEBUG message print. */ /* DEBUG message print. */
#define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args) #define DBG_PRINT(dbg_level, args...) if(!(debug_level<dbg_level)) printk(args)
@ -78,6 +78,13 @@ int debug_level = ERR_DBG; /* Default level. */
typedef struct { typedef struct {
unsigned long long single_ecc_errs; unsigned long long single_ecc_errs;
unsigned long long double_ecc_errs; unsigned long long double_ecc_errs;
/* LRO statistics */
unsigned long long clubbed_frms_cnt;
unsigned long long sending_both;
unsigned long long outof_sequence_pkts;
unsigned long long flush_max_pkts;
unsigned long long sum_avg_pkts_aggregated;
unsigned long long num_aggregations;
} swStat_t; } swStat_t;
/* The statistics block of Xena */ /* The statistics block of Xena */
@ -268,7 +275,7 @@ typedef struct stat_block {
#define MAX_RX_RINGS 8 #define MAX_RX_RINGS 8
/* FIFO mappings for all possible number of fifos configured */ /* FIFO mappings for all possible number of fifos configured */
int fifo_map[][MAX_TX_FIFOS] = { static int fifo_map[][MAX_TX_FIFOS] = {
{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 1, 1, 1, 2, 2}, {0, 0, 0, 1, 1, 1, 2, 2},
@ -680,6 +687,24 @@ struct msix_info_st {
u64 data; u64 data;
}; };
/* Data structure to represent a LRO session */
typedef struct lro {
struct sk_buff *parent;
u8 *l2h;
struct iphdr *iph;
struct tcphdr *tcph;
u32 tcp_next_seq;
u32 tcp_ack;
int total_len;
int frags_len;
int sg_num;
int in_use;
u16 window;
u32 cur_tsval;
u32 cur_tsecr;
u8 saw_ts;
}lro_t;
/* Structure representing one instance of the NIC */ /* Structure representing one instance of the NIC */
struct s2io_nic { struct s2io_nic {
int rxd_mode; int rxd_mode;
@ -784,6 +809,13 @@ struct s2io_nic {
#define XFRAME_II_DEVICE 2 #define XFRAME_II_DEVICE 2
u8 device_type; u8 device_type;
#define MAX_LRO_SESSIONS 32
lro_t lro0_n[MAX_LRO_SESSIONS];
unsigned long clubbed_frms_cnt;
unsigned long sending_both;
u8 lro;
u16 lro_max_aggr_per_sess;
#define INTA 0 #define INTA 0
#define MSI 1 #define MSI 1
#define MSI_X 2 #define MSI_X 2
@ -911,18 +943,16 @@ static void tx_intr_handler(fifo_info_t *fifo_data);
static void alarm_intr_handler(struct s2io_nic *sp); static void alarm_intr_handler(struct s2io_nic *sp);
static int s2io_starter(void); static int s2io_starter(void);
void s2io_closer(void);
static void s2io_tx_watchdog(struct net_device *dev); static void s2io_tx_watchdog(struct net_device *dev);
static void s2io_tasklet(unsigned long dev_addr); static void s2io_tasklet(unsigned long dev_addr);
static void s2io_set_multicast(struct net_device *dev); static void s2io_set_multicast(struct net_device *dev);
static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp); static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp);
void s2io_link(nic_t * sp, int link); static void s2io_link(nic_t * sp, int link);
void s2io_reset(nic_t * sp);
#if defined(CONFIG_S2IO_NAPI) #if defined(CONFIG_S2IO_NAPI)
static int s2io_poll(struct net_device *dev, int *budget); static int s2io_poll(struct net_device *dev, int *budget);
#endif #endif
static void s2io_init_pci(nic_t * sp); static void s2io_init_pci(nic_t * sp);
int s2io_set_mac_addr(struct net_device *dev, u8 * addr); static int s2io_set_mac_addr(struct net_device *dev, u8 * addr);
static void s2io_alarm_handle(unsigned long data); static void s2io_alarm_handle(unsigned long data);
static int s2io_enable_msi(nic_t *nic); static int s2io_enable_msi(nic_t *nic);
static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs);
@ -930,14 +960,19 @@ static irqreturn_t
s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs); s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs);
static irqreturn_t static irqreturn_t
s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs); s2io_msix_fifo_handle(int irq, void *dev_id, struct pt_regs *regs);
int s2io_enable_msi_x(nic_t *nic);
static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs); static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs);
static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag); static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag);
static struct ethtool_ops netdev_ethtool_ops; static struct ethtool_ops netdev_ethtool_ops;
static void s2io_set_link(unsigned long data); static void s2io_set_link(unsigned long data);
int s2io_set_swapper(nic_t * sp); static int s2io_set_swapper(nic_t * sp);
static void s2io_card_down(nic_t *nic); static void s2io_card_down(nic_t *nic);
static int s2io_card_up(nic_t *nic); static int s2io_card_up(nic_t *nic);
int get_xena_rev_id(struct pci_dev *pdev); static int get_xena_rev_id(struct pci_dev *pdev);
void restore_xmsi_data(nic_t *nic); static void restore_xmsi_data(nic_t *nic);
static int s2io_club_tcp_session(u8 *buffer, u8 **tcp, u32 *tcp_len, lro_t **lro, RxD_t *rxdp, nic_t *sp);
static void clear_lro_session(lro_t *lro);
static void queue_rx_frame(struct sk_buff *skb);
static void update_L3L4_header(nic_t *sp, lro_t *lro);
static void lro_append_pkt(nic_t *sp, lro_t *lro, struct sk_buff *skb, u32 tcp_len);
#endif /* _S2IO_H */ #endif /* _S2IO_H */

View file

@ -59,7 +59,7 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n";
#ifdef SB1000_DEBUG #ifdef SB1000_DEBUG
static int sb1000_debug = SB1000_DEBUG; static int sb1000_debug = SB1000_DEBUG;
#else #else
static int sb1000_debug = 1; static const int sb1000_debug = 1;
#endif #endif
static const int SB1000_IO_EXTENT = 8; static const int SB1000_IO_EXTENT = 8;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2001,2002,2003 Broadcom Corporation * Copyright (C) 2001,2002,2003,2004 Broadcom Corporation
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -43,6 +43,7 @@
#define SBMAC_ETH0_HWADDR "40:00:00:00:01:00" #define SBMAC_ETH0_HWADDR "40:00:00:00:01:00"
#define SBMAC_ETH1_HWADDR "40:00:00:00:01:01" #define SBMAC_ETH1_HWADDR "40:00:00:00:01:01"
#define SBMAC_ETH2_HWADDR "40:00:00:00:01:02" #define SBMAC_ETH2_HWADDR "40:00:00:00:01:02"
#define SBMAC_ETH3_HWADDR "40:00:00:00:01:03"
#endif #endif
@ -57,7 +58,7 @@ static char version1[] __devinitdata =
#define CONFIG_SBMAC_COALESCE #define CONFIG_SBMAC_COALESCE
#define MAX_UNITS 3 /* More are supported, limit only on options */ #define MAX_UNITS 4 /* More are supported, limit only on options */
/* Time in jiffies before concluding the transmitter is hung. */ /* Time in jiffies before concluding the transmitter is hung. */
#define TX_TIMEOUT (2*HZ) #define TX_TIMEOUT (2*HZ)
@ -85,11 +86,11 @@ MODULE_PARM_DESC(noisy_mii, "MII status messages");
The media type is usually passed in 'options[]'. The media type is usually passed in 'options[]'.
*/ */
#ifdef MODULE #ifdef MODULE
static int options[MAX_UNITS] = {-1, -1, -1}; static int options[MAX_UNITS] = {-1, -1, -1, -1};
module_param_array(options, int, NULL, S_IRUGO); module_param_array(options, int, NULL, S_IRUGO);
MODULE_PARM_DESC(options, "1-" __MODULE_STRING(MAX_UNITS)); MODULE_PARM_DESC(options, "1-" __MODULE_STRING(MAX_UNITS));
static int full_duplex[MAX_UNITS] = {-1, -1, -1}; static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1};
module_param_array(full_duplex, int, NULL, S_IRUGO); module_param_array(full_duplex, int, NULL, S_IRUGO);
MODULE_PARM_DESC(full_duplex, "1-" __MODULE_STRING(MAX_UNITS)); MODULE_PARM_DESC(full_duplex, "1-" __MODULE_STRING(MAX_UNITS));
#endif #endif
@ -105,13 +106,26 @@ MODULE_PARM_DESC(int_timeout, "Timeout value");
#endif #endif
#include <asm/sibyte/sb1250.h> #include <asm/sibyte/sb1250.h>
#include <asm/sibyte/sb1250_defs.h> #if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
#include <asm/sibyte/bcm1480_regs.h>
#include <asm/sibyte/bcm1480_int.h>
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
#include <asm/sibyte/sb1250_regs.h> #include <asm/sibyte/sb1250_regs.h>
#include <asm/sibyte/sb1250_int.h>
#else
#error invalid SiByte MAC configuation
#endif
#include <asm/sibyte/sb1250_scd.h>
#include <asm/sibyte/sb1250_mac.h> #include <asm/sibyte/sb1250_mac.h>
#include <asm/sibyte/sb1250_dma.h> #include <asm/sibyte/sb1250_dma.h>
#include <asm/sibyte/sb1250_int.h>
#include <asm/sibyte/sb1250_scd.h>
#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
#define UNIT_INT(n) (K_BCM1480_INT_MAC_0 + ((n) * 2))
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
#define UNIT_INT(n) (K_INT_MAC_0 + (n))
#else
#error invalid SiByte MAC configuation
#endif
/********************************************************************** /**********************************************************************
* Simple types * Simple types
@ -1476,10 +1490,10 @@ static void sbmac_channel_start(struct sbmac_softc *s)
* and make sure that RD_THRSH + WR_THRSH <=128 for pass2 and above * and make sure that RD_THRSH + WR_THRSH <=128 for pass2 and above
* Use a larger RD_THRSH for gigabit * Use a larger RD_THRSH for gigabit
*/ */
if (periph_rev >= 2) if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2)
th_value = 64;
else
th_value = 28; th_value = 28;
else
th_value = 64;
fifo = V_MAC_TX_WR_THRSH(4) | /* Must be '4' or '8' */ fifo = V_MAC_TX_WR_THRSH(4) | /* Must be '4' or '8' */
((s->sbm_speed == sbmac_speed_1000) ((s->sbm_speed == sbmac_speed_1000)
@ -1589,13 +1603,17 @@ static void sbmac_channel_start(struct sbmac_softc *s)
* Turn on the rest of the bits in the enable register * Turn on the rest of the bits in the enable register
*/ */
#if defined(CONFIG_SIBYTE_BCM1x55) || defined(CONFIG_SIBYTE_BCM1x80)
__raw_writeq(M_MAC_RXDMA_EN0 |
M_MAC_TXDMA_EN0, s->sbm_macenable);
#elif defined(CONFIG_SIBYTE_SB1250) || defined(CONFIG_SIBYTE_BCM112X)
__raw_writeq(M_MAC_RXDMA_EN0 | __raw_writeq(M_MAC_RXDMA_EN0 |
M_MAC_TXDMA_EN0 | M_MAC_TXDMA_EN0 |
M_MAC_RX_ENABLE | M_MAC_RX_ENABLE |
M_MAC_TX_ENABLE, s->sbm_macenable); M_MAC_TX_ENABLE, s->sbm_macenable);
#else
#error invalid SiByte MAC configuation
#endif
#ifdef CONFIG_SBMAC_COALESCE #ifdef CONFIG_SBMAC_COALESCE
/* /*
@ -1786,11 +1804,12 @@ static void sbmac_set_iphdr_offset(struct sbmac_softc *sc)
reg &= ~M_MAC_IPHDR_OFFSET | V_MAC_IPHDR_OFFSET(15); reg &= ~M_MAC_IPHDR_OFFSET | V_MAC_IPHDR_OFFSET(15);
__raw_writeq(reg, sc->sbm_rxfilter); __raw_writeq(reg, sc->sbm_rxfilter);
/* read system identification to determine revision */ /* BCM1250 pass1 didn't have hardware checksum. Everything
if (periph_rev >= 2) { later does. */
sc->rx_hw_checksum = ENABLE; if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2) {
} else {
sc->rx_hw_checksum = DISABLE; sc->rx_hw_checksum = DISABLE;
} else {
sc->rx_hw_checksum = ENABLE;
} }
} }
@ -2220,7 +2239,7 @@ static void sbmac_setmulti(struct sbmac_softc *sc)
#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) #if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR)
/********************************************************************** /**********************************************************************
* SBMAC_PARSE_XDIGIT(str) * SBMAC_PARSE_XDIGIT(str)
* *
@ -2792,7 +2811,7 @@ static int sbmac_close(struct net_device *dev)
#if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) #if defined(SBMAC_ETH0_HWADDR) || defined(SBMAC_ETH1_HWADDR) || defined(SBMAC_ETH2_HWADDR) || defined(SBMAC_ETH3_HWADDR)
static void static void
sbmac_setup_hwaddr(int chan,char *addr) sbmac_setup_hwaddr(int chan,char *addr)
{ {
@ -2818,25 +2837,7 @@ sbmac_init_module(void)
unsigned long port; unsigned long port;
int chip_max_units; int chip_max_units;
/* /* Set the number of available units based on the SOC type. */
* For bringup when not using the firmware, we can pre-fill
* the MAC addresses using the environment variables
* specified in this file (or maybe from the config file?)
*/
#ifdef SBMAC_ETH0_HWADDR
sbmac_setup_hwaddr(0,SBMAC_ETH0_HWADDR);
#endif
#ifdef SBMAC_ETH1_HWADDR
sbmac_setup_hwaddr(1,SBMAC_ETH1_HWADDR);
#endif
#ifdef SBMAC_ETH2_HWADDR
sbmac_setup_hwaddr(2,SBMAC_ETH2_HWADDR);
#endif
/*
* Walk through the Ethernet controllers and find
* those who have their MAC addresses set.
*/
switch (soc_type) { switch (soc_type) {
case K_SYS_SOC_TYPE_BCM1250: case K_SYS_SOC_TYPE_BCM1250:
case K_SYS_SOC_TYPE_BCM1250_ALT: case K_SYS_SOC_TYPE_BCM1250_ALT:
@ -2848,6 +2849,10 @@ sbmac_init_module(void)
case K_SYS_SOC_TYPE_BCM1250_ALT2: /* Hybrid */ case K_SYS_SOC_TYPE_BCM1250_ALT2: /* Hybrid */
chip_max_units = 2; chip_max_units = 2;
break; break;
case K_SYS_SOC_TYPE_BCM1x55:
case K_SYS_SOC_TYPE_BCM1x80:
chip_max_units = 4;
break;
default: default:
chip_max_units = 0; chip_max_units = 0;
break; break;
@ -2855,6 +2860,32 @@ sbmac_init_module(void)
if (chip_max_units > MAX_UNITS) if (chip_max_units > MAX_UNITS)
chip_max_units = MAX_UNITS; chip_max_units = MAX_UNITS;
/*
* For bringup when not using the firmware, we can pre-fill
* the MAC addresses using the environment variables
* specified in this file (or maybe from the config file?)
*/
#ifdef SBMAC_ETH0_HWADDR
if (chip_max_units > 0)
sbmac_setup_hwaddr(0,SBMAC_ETH0_HWADDR);
#endif
#ifdef SBMAC_ETH1_HWADDR
if (chip_max_units > 1)
sbmac_setup_hwaddr(1,SBMAC_ETH1_HWADDR);
#endif
#ifdef SBMAC_ETH2_HWADDR
if (chip_max_units > 2)
sbmac_setup_hwaddr(2,SBMAC_ETH2_HWADDR);
#endif
#ifdef SBMAC_ETH3_HWADDR
if (chip_max_units > 3)
sbmac_setup_hwaddr(3,SBMAC_ETH3_HWADDR);
#endif
/*
* Walk through the Ethernet controllers and find
* those who have their MAC addresses set.
*/
for (idx = 0; idx < chip_max_units; idx++) { for (idx = 0; idx < chip_max_units; idx++) {
/* /*
@ -2886,7 +2917,7 @@ sbmac_init_module(void)
printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port); printk(KERN_DEBUG "sbmac: configuring MAC at %lx\n", port);
dev->irq = K_INT_MAC_0 + idx; dev->irq = UNIT_INT(idx);
dev->base_addr = port; dev->base_addr = port;
dev->mem_end = 0; dev->mem_end = 0;
if (sbmac_init(dev, idx)) { if (sbmac_init(dev, idx)) {

View file

@ -46,6 +46,7 @@ static const char version[] =
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/jiffies.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
@ -699,7 +700,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length)
int ioaddr = dev->base_addr; int ioaddr = dev->base_addr;
int status = inw(SEEQ_STATUS); int status = inw(SEEQ_STATUS);
int transmit_ptr = 0; int transmit_ptr = 0;
int tmp; unsigned long tmp;
if (net_debug>4) { if (net_debug>4) {
printk("%s: send 0x%04x\n",dev->name,length); printk("%s: send 0x%04x\n",dev->name,length);
@ -724,7 +725,7 @@ static void hardware_send_packet(struct net_device * dev, char *buf, int length)
/* drain FIFO */ /* drain FIFO */
tmp = jiffies; tmp = jiffies;
while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies - tmp < HZ)) while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && time_before(jiffies, tmp + HZ))
mb(); mb();
/* doit ! */ /* doit ! */

View file

@ -3,6 +3,9 @@
* *
* Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
*/ */
#undef DEBUG
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
@ -59,8 +62,6 @@ static char *sgiseeqstr = "SGI Seeq8003";
sp->tx_old + (SEEQ_TX_BUFFERS - 1) - sp->tx_new : \ sp->tx_old + (SEEQ_TX_BUFFERS - 1) - sp->tx_new : \
sp->tx_old - sp->tx_new - 1) sp->tx_old - sp->tx_new - 1)
#define DEBUG
struct sgiseeq_rx_desc { struct sgiseeq_rx_desc {
volatile struct hpc_dma_desc rdma; volatile struct hpc_dma_desc rdma;
volatile signed int buf_vaddr; volatile signed int buf_vaddr;
@ -209,7 +210,7 @@ static int seeq_init_ring(struct net_device *dev)
static struct sgiseeq_private *gpriv; static struct sgiseeq_private *gpriv;
static struct net_device *gdev; static struct net_device *gdev;
void sgiseeq_dump_rings(void) static void sgiseeq_dump_rings(void)
{ {
static int once; static int once;
struct sgiseeq_rx_desc *r = gpriv->rx_desc; struct sgiseeq_rx_desc *r = gpriv->rx_desc;
@ -311,9 +312,9 @@ static inline void sgiseeq_rx(struct net_device *dev, struct sgiseeq_private *sp
struct sgiseeq_regs *sregs) struct sgiseeq_regs *sregs)
{ {
struct sgiseeq_rx_desc *rd; struct sgiseeq_rx_desc *rd;
struct sk_buff *skb = 0; struct sk_buff *skb = NULL;
unsigned char pkt_status; unsigned char pkt_status;
unsigned char *pkt_pointer = 0; unsigned char *pkt_pointer = NULL;
int len = 0; int len = 0;
unsigned int orig_end = PREV_RX(sp->rx_new); unsigned int orig_end = PREV_RX(sp->rx_new);
@ -515,12 +516,6 @@ static inline int sgiseeq_reset(struct net_device *dev)
return 0; return 0;
} }
void sgiseeq_my_reset(void)
{
printk("RESET!\n");
sgiseeq_reset(gdev);
}
static int sgiseeq_start_xmit(struct sk_buff *skb, struct net_device *dev) static int sgiseeq_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct sgiseeq_private *sp = netdev_priv(dev); struct sgiseeq_private *sp = netdev_priv(dev);

View file

@ -83,6 +83,7 @@
#include <linux/if_arp.h> #include <linux/if_arp.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/if_shaper.h> #include <linux/if_shaper.h>
#include <linux/jiffies.h>
#include <net/dst.h> #include <net/dst.h>
#include <net/arp.h> #include <net/arp.h>
@ -168,7 +169,7 @@ static int shaper_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* /*
* Queue over time. Spill packet. * Queue over time. Spill packet.
*/ */
if(SHAPERCB(skb)->shapeclock-jiffies > SHAPER_LATENCY) { if(time_after(SHAPERCB(skb)->shapeclock,jiffies + SHAPER_LATENCY)) {
dev_kfree_skb(skb); dev_kfree_skb(skb);
shaper->stats.tx_dropped++; shaper->stats.tx_dropped++;
} else } else

View file

@ -366,7 +366,7 @@ static const u32 sis190_intr_mask =
* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). * Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
* The chips use a 64 element hash table based on the Ethernet CRC. * The chips use a 64 element hash table based on the Ethernet CRC.
*/ */
static int multicast_filter_limit = 32; static const int multicast_filter_limit = 32;
static void __mdio_cmd(void __iomem *ioaddr, u32 ctl) static void __mdio_cmd(void __iomem *ioaddr, u32 ctl)
{ {

View file

@ -100,7 +100,7 @@ enum {
SIS_900 = 0, SIS_900 = 0,
SIS_7016 SIS_7016
}; };
static char * card_names[] = { static const char * card_names[] = {
"SiS 900 PCI Fast Ethernet", "SiS 900 PCI Fast Ethernet",
"SiS 7016 PCI Fast Ethernet" "SiS 7016 PCI Fast Ethernet"
}; };
@ -115,7 +115,7 @@ MODULE_DEVICE_TABLE (pci, sis900_pci_tbl);
static void sis900_read_mode(struct net_device *net_dev, int *speed, int *duplex); static void sis900_read_mode(struct net_device *net_dev, int *speed, int *duplex);
static struct mii_chip_info { static const struct mii_chip_info {
const char * name; const char * name;
u16 phy_id0; u16 phy_id0;
u16 phy_id1; u16 phy_id1;
@ -400,7 +400,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
void *ring_space; void *ring_space;
long ioaddr; long ioaddr;
int i, ret; int i, ret;
char *card_name = card_names[pci_id->driver_data]; const char *card_name = card_names[pci_id->driver_data];
const char *dev_name = pci_name(pci_dev); const char *dev_name = pci_name(pci_dev);
/* when built into the kernel, we only print version if device is found */ /* when built into the kernel, we only print version if device is found */
@ -1275,7 +1275,7 @@ static void sis900_timer(unsigned long data)
struct net_device *net_dev = (struct net_device *)data; struct net_device *net_dev = (struct net_device *)data;
struct sis900_private *sis_priv = net_dev->priv; struct sis900_private *sis_priv = net_dev->priv;
struct mii_phy *mii_phy = sis_priv->mii; struct mii_phy *mii_phy = sis_priv->mii;
static int next_tick = 5*HZ; static const int next_tick = 5*HZ;
u16 status; u16 status;
if (!sis_priv->autong_complete){ if (!sis_priv->autong_complete){

View file

@ -236,18 +236,6 @@ extern int SkAddrMcClear(
SK_U32 PortNumber, SK_U32 PortNumber,
int Flags); int Flags);
extern int SkAddrXmacMcClear(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int Flags);
extern int SkAddrGmacMcClear(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int Flags);
extern int SkAddrMcAdd( extern int SkAddrMcAdd(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -255,35 +243,11 @@ extern int SkAddrMcAdd(
SK_MAC_ADDR *pMc, SK_MAC_ADDR *pMc,
int Flags); int Flags);
extern int SkAddrXmacMcAdd(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
SK_MAC_ADDR *pMc,
int Flags);
extern int SkAddrGmacMcAdd(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
SK_MAC_ADDR *pMc,
int Flags);
extern int SkAddrMcUpdate( extern int SkAddrMcUpdate(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
SK_U32 PortNumber); SK_U32 PortNumber);
extern int SkAddrXmacMcUpdate(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber);
extern int SkAddrGmacMcUpdate(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber);
extern int SkAddrOverride( extern int SkAddrOverride(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -297,18 +261,6 @@ extern int SkAddrPromiscuousChange(
SK_U32 PortNumber, SK_U32 PortNumber,
int NewPromMode); int NewPromMode);
extern int SkAddrXmacPromiscuousChange(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int NewPromMode);
extern int SkAddrGmacPromiscuousChange(
SK_AC *pAC,
SK_IOC IoC,
SK_U32 PortNumber,
int NewPromMode);
#ifndef SK_SLIM #ifndef SK_SLIM
extern int SkAddrSwap( extern int SkAddrSwap(
SK_AC *pAC, SK_AC *pAC,

View file

@ -203,12 +203,6 @@ extern SKCS_STATUS SkCsGetReceiveInfo(
unsigned Checksum2, unsigned Checksum2,
int NetNumber); int NetNumber);
extern void SkCsGetSendInfo(
SK_AC *pAc,
void *pIpHeader,
SKCS_PACKET_INFO *pPacketInfo,
int NetNumber);
extern void SkCsSetReceiveFlags( extern void SkCsSetReceiveFlags(
SK_AC *pAc, SK_AC *pAc,
unsigned ReceiveFlags, unsigned ReceiveFlags,

View file

@ -464,12 +464,6 @@ typedef struct s_GeInit {
/* /*
* public functions in skgeinit.c * public functions in skgeinit.c
*/ */
extern void SkGePollRxD(
SK_AC *pAC,
SK_IOC IoC,
int Port,
SK_BOOL PollRxD);
extern void SkGePollTxD( extern void SkGePollTxD(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -522,10 +516,6 @@ extern void SkGeXmitLED(
int Led, int Led,
int Mode); int Mode);
extern void SkGeInitRamIface(
SK_AC *pAC,
SK_IOC IoC);
extern int SkGeInitAssignRamToQueues( extern int SkGeInitAssignRamToQueues(
SK_AC *pAC, SK_AC *pAC,
int ActivePort, int ActivePort,
@ -549,11 +539,6 @@ extern void SkMacHardRst(
SK_IOC IoC, SK_IOC IoC,
int Port); int Port);
extern void SkMacClearRst(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmInitMac( extern void SkXmInitMac(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -580,11 +565,6 @@ extern void SkMacFlushTxFifo(
SK_IOC IoC, SK_IOC IoC,
int Port); int Port);
extern void SkMacFlushRxFifo(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkMacIrq( extern void SkMacIrq(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -601,12 +581,6 @@ extern void SkMacAutoNegLipaPhy(
int Port, int Port,
SK_U16 IStatus); SK_U16 IStatus);
extern void SkMacSetRxTxEn(
SK_AC *pAC,
SK_IOC IoC,
int Port,
int Para);
extern int SkMacRxTxEnable( extern int SkMacRxTxEnable(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -659,16 +633,6 @@ extern void SkXmClrExactAddr(
int StartNum, int StartNum,
int StopNum); int StopNum);
extern void SkXmInitDupMd(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmInitPauseMd(
SK_AC *pAC,
SK_IOC IoC,
int Port);
extern void SkXmAutoNegLipaXmac( extern void SkXmAutoNegLipaXmac(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC, SK_IOC IoC,
@ -729,17 +693,6 @@ extern int SkGmCableDiagStatus(
int Port, int Port,
SK_BOOL StartTest); SK_BOOL StartTest);
extern int SkGmEnterLowPowerMode(
SK_AC *pAC,
SK_IOC IoC,
int Port,
SK_U8 Mode);
extern int SkGmLeaveLowPowerMode(
SK_AC *pAC,
SK_IOC IoC,
int Port);
#ifdef SK_DIAG #ifdef SK_DIAG
extern void SkGePhyRead( extern void SkGePhyRead(
SK_AC *pAC, SK_AC *pAC,
@ -782,7 +735,6 @@ extern void SkXmSendCont(
/* /*
* public functions in skgeinit.c * public functions in skgeinit.c
*/ */
extern void SkGePollRxD();
extern void SkGePollTxD(); extern void SkGePollTxD();
extern void SkGeYellowLED(); extern void SkGeYellowLED();
extern int SkGeCfgSync(); extern int SkGeCfgSync();
@ -792,7 +744,6 @@ extern int SkGeInit();
extern void SkGeDeInit(); extern void SkGeDeInit();
extern int SkGeInitPort(); extern int SkGeInitPort();
extern void SkGeXmitLED(); extern void SkGeXmitLED();
extern void SkGeInitRamIface();
extern int SkGeInitAssignRamToQueues(); extern int SkGeInitAssignRamToQueues();
/* /*
@ -801,18 +752,15 @@ extern int SkGeInitAssignRamToQueues();
extern void SkMacRxTxDisable(); extern void SkMacRxTxDisable();
extern void SkMacSoftRst(); extern void SkMacSoftRst();
extern void SkMacHardRst(); extern void SkMacHardRst();
extern void SkMacClearRst();
extern void SkMacInitPhy(); extern void SkMacInitPhy();
extern int SkMacRxTxEnable(); extern int SkMacRxTxEnable();
extern void SkMacPromiscMode(); extern void SkMacPromiscMode();
extern void SkMacHashing(); extern void SkMacHashing();
extern void SkMacIrqDisable(); extern void SkMacIrqDisable();
extern void SkMacFlushTxFifo(); extern void SkMacFlushTxFifo();
extern void SkMacFlushRxFifo();
extern void SkMacIrq(); extern void SkMacIrq();
extern int SkMacAutoNegDone(); extern int SkMacAutoNegDone();
extern void SkMacAutoNegLipaPhy(); extern void SkMacAutoNegLipaPhy();
extern void SkMacSetRxTxEn();
extern void SkXmInitMac(); extern void SkXmInitMac();
extern void SkXmPhyRead(); extern void SkXmPhyRead();
extern void SkXmPhyWrite(); extern void SkXmPhyWrite();
@ -820,8 +768,6 @@ extern void SkGmInitMac();
extern void SkGmPhyRead(); extern void SkGmPhyRead();
extern void SkGmPhyWrite(); extern void SkGmPhyWrite();
extern void SkXmClrExactAddr(); extern void SkXmClrExactAddr();
extern void SkXmInitDupMd();
extern void SkXmInitPauseMd();
extern void SkXmAutoNegLipaXmac(); extern void SkXmAutoNegLipaXmac();
extern int SkXmUpdateStats(); extern int SkXmUpdateStats();
extern int SkGmUpdateStats(); extern int SkGmUpdateStats();
@ -832,8 +778,6 @@ extern int SkGmResetCounter();
extern int SkXmOverflowStatus(); extern int SkXmOverflowStatus();
extern int SkGmOverflowStatus(); extern int SkGmOverflowStatus();
extern int SkGmCableDiagStatus(); extern int SkGmCableDiagStatus();
extern int SkGmEnterLowPowerMode();
extern int SkGmLeaveLowPowerMode();
#ifdef SK_DIAG #ifdef SK_DIAG
extern void SkGePhyRead(); extern void SkGePhyRead();

View file

@ -946,10 +946,6 @@ typedef struct s_PnmiData {
* Function prototypes * Function prototypes
*/ */
extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level); extern int SkPnmiInit(SK_AC *pAC, SK_IOC IoC, int Level);
extern int SkPnmiGetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
unsigned int* pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiPreSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id,
void* pBuf, unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf, extern int SkPnmiSetVar(SK_AC *pAC, SK_IOC IoC, SK_U32 Id, void* pBuf,
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex); unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf, extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,

View file

@ -105,7 +105,6 @@
extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus); extern void SkGeSirqIsr(SK_AC *pAC, SK_IOC IoC, SK_U32 Istatus);
extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para); extern int SkGeSirqEvent(SK_AC *pAC, SK_IOC IoC, SK_U32 Event, SK_EVPARA Para);
extern void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port);
extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port); extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port);
#endif /* _INC_SKGESIRQ_H_ */ #endif /* _INC_SKGESIRQ_H_ */

View file

@ -162,9 +162,6 @@ typedef struct s_I2c {
} SK_I2C; } SK_I2C;
extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level); extern int SkI2cInit(SK_AC *pAC, SK_IOC IoC, int Level);
extern int SkI2cWrite(SK_AC *pAC, SK_IOC IoC, SK_U32 Data, int Dev, int Size,
int Reg, int Burst);
extern int SkI2cReadSensor(SK_AC *pAC, SK_IOC IoC, SK_SENSOR *pSen);
#ifdef SK_DIAG #ifdef SK_DIAG
extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg, extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
int Burst); int Burst);

View file

@ -183,14 +183,6 @@ extern SK_U32 VpdReadDWord(
int addr); int addr);
#endif /* SKDIAG */ #endif /* SKDIAG */
extern int VpdSetupPara(
SK_AC *pAC,
const char *key,
const char *buf,
int len,
int type,
int op);
extern SK_VPD_STATUS *VpdStat( extern SK_VPD_STATUS *VpdStat(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC); SK_IOC IoC);
@ -227,11 +219,6 @@ extern int VpdUpdate(
SK_AC *pAC, SK_AC *pAC,
SK_IOC IoC); SK_IOC IoC);
extern void VpdErrLog(
SK_AC *pAC,
SK_IOC IoC,
char *msg);
#ifdef SKDIAG #ifdef SKDIAG
extern int VpdReadBlock( extern int VpdReadBlock(
SK_AC *pAC, SK_AC *pAC,
@ -249,7 +236,6 @@ extern int VpdWriteBlock(
#endif /* SKDIAG */ #endif /* SKDIAG */
#else /* SK_KR_PROTO */ #else /* SK_KR_PROTO */
extern SK_U32 VpdReadDWord(); extern SK_U32 VpdReadDWord();
extern int VpdSetupPara();
extern SK_VPD_STATUS *VpdStat(); extern SK_VPD_STATUS *VpdStat();
extern int VpdKeys(); extern int VpdKeys();
extern int VpdRead(); extern int VpdRead();
@ -257,7 +243,6 @@ extern SK_BOOL VpdMayWrite();
extern int VpdWrite(); extern int VpdWrite();
extern int VpdDelete(); extern int VpdDelete();
extern int VpdUpdate(); extern int VpdUpdate();
extern void VpdErrLog();
#endif /* SK_KR_PROTO */ #endif /* SK_KR_PROTO */
#endif /* __INC_SKVPD_H_ */ #endif /* __INC_SKVPD_H_ */

View file

@ -87,6 +87,21 @@ static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
static int Next0[SK_MAX_MACS] = {0}; static int Next0[SK_MAX_MACS] = {0};
#endif /* DEBUG */ #endif /* DEBUG */
static int SkAddrGmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
SK_MAC_ADDR *pMc, int Flags);
static int SkAddrGmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
int Flags);
static int SkAddrGmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber);
static int SkAddrGmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC,
SK_U32 PortNumber, int NewPromMode);
static int SkAddrXmacMcAdd(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
SK_MAC_ADDR *pMc, int Flags);
static int SkAddrXmacMcClear(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber,
int Flags);
static int SkAddrXmacMcUpdate(SK_AC *pAC, SK_IOC IoC, SK_U32 PortNumber);
static int SkAddrXmacPromiscuousChange(SK_AC *pAC, SK_IOC IoC,
SK_U32 PortNumber, int NewPromMode);
/* functions ******************************************************************/ /* functions ******************************************************************/
/****************************************************************************** /******************************************************************************
@ -372,7 +387,7 @@ int Flags) /* permanent/non-perm, sw-only */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacMcClear( static int SkAddrXmacMcClear(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Index of affected port */ SK_U32 PortNumber, /* Index of affected port */
@ -429,7 +444,7 @@ int Flags) /* permanent/non-perm, sw-only */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacMcClear( static int SkAddrGmacMcClear(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Index of affected port */ SK_U32 PortNumber, /* Index of affected port */
@ -519,7 +534,7 @@ int Flags) /* permanent/non-perm, sw-only */
* Returns: * Returns:
* Hash value of multicast address. * Hash value of multicast address.
*/ */
SK_U32 SkXmacMcHash( static SK_U32 SkXmacMcHash(
unsigned char *pMc) /* Multicast address */ unsigned char *pMc) /* Multicast address */
{ {
SK_U32 Idx; SK_U32 Idx;
@ -557,7 +572,7 @@ unsigned char *pMc) /* Multicast address */
* Returns: * Returns:
* Hash value of multicast address. * Hash value of multicast address.
*/ */
SK_U32 SkGmacMcHash( static SK_U32 SkGmacMcHash(
unsigned char *pMc) /* Multicast address */ unsigned char *pMc) /* Multicast address */
{ {
SK_U32 Data; SK_U32 Data;
@ -672,7 +687,7 @@ int Flags) /* permanent/non-permanent */
* SK_MC_ILLEGAL_ADDRESS * SK_MC_ILLEGAL_ADDRESS
* SK_MC_RLMT_OVERFLOW * SK_MC_RLMT_OVERFLOW
*/ */
int SkAddrXmacMcAdd( static int SkAddrXmacMcAdd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Port Number */ SK_U32 PortNumber, /* Port Number */
@ -778,7 +793,7 @@ int Flags) /* permanent/non-permanent */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_MC_ILLEGAL_ADDRESS * SK_MC_ILLEGAL_ADDRESS
*/ */
int SkAddrGmacMcAdd( static int SkAddrGmacMcAdd(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* Port Number */ SK_U32 PortNumber, /* Port Number */
@ -937,7 +952,7 @@ SK_U32 PortNumber) /* Port Number */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacMcUpdate( static int SkAddrXmacMcUpdate(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber) /* Port Number */ SK_U32 PortNumber) /* Port Number */
@ -1082,7 +1097,7 @@ SK_U32 PortNumber) /* Port Number */
* SK_MC_FILTERING_INEXACT * SK_MC_FILTERING_INEXACT
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacMcUpdate( static int SkAddrGmacMcUpdate(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber) /* Port Number */ SK_U32 PortNumber) /* Port Number */
@ -1468,7 +1483,7 @@ int NewPromMode) /* new promiscuous mode */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrXmacPromiscuousChange( static int SkAddrXmacPromiscuousChange(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* port whose promiscuous mode changes */ SK_U32 PortNumber, /* port whose promiscuous mode changes */
@ -1585,7 +1600,7 @@ int NewPromMode) /* new promiscuous mode */
* SK_ADDR_SUCCESS * SK_ADDR_SUCCESS
* SK_ADDR_ILLEGAL_PORT * SK_ADDR_ILLEGAL_PORT
*/ */
int SkAddrGmacPromiscuousChange( static int SkAddrGmacPromiscuousChange(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* I/O context */ SK_IOC IoC, /* I/O context */
SK_U32 PortNumber, /* port whose promiscuous mode changes */ SK_U32 PortNumber, /* port whose promiscuous mode changes */

View file

@ -57,34 +57,6 @@ static struct s_Config OemConfig = {
#endif #endif
}; };
/******************************************************************************
*
* SkGePollRxD() - Enable / Disable Descriptor Polling of RxD Ring
*
* Description:
* Enable or disable the descriptor polling of the receive descriptor
* ring (RxD) for port 'Port'.
* The new configuration is *not* saved over any SkGeStopPort() and
* SkGeInitPort() calls.
*
* Returns:
* nothing
*/
void SkGePollRxD(
SK_AC *pAC, /* adapter context */
SK_IOC IoC, /* IO context */
int Port, /* Port Index (MAC_1 + n) */
SK_BOOL PollRxD) /* SK_TRUE (enable pol.), SK_FALSE (disable pol.) */
{
SK_GEPORT *pPrt;
pPrt = &pAC->GIni.GP[Port];
SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ?
CSR_ENA_POL : CSR_DIS_POL);
} /* SkGePollRxD */
/****************************************************************************** /******************************************************************************
* *
* SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings * SkGePollTxD() - Enable / Disable Descriptor Polling of TxD Rings
@ -952,7 +924,7 @@ int Port) /* Port Index (MAC_1 + n) */
* Returns: * Returns:
* nothing * nothing
*/ */
void SkGeInitRamIface( static void SkGeInitRamIface(
SK_AC *pAC, /* adapter context */ SK_AC *pAC, /* adapter context */
SK_IOC IoC) /* IO context */ SK_IOC IoC) /* IO context */
{ {
@ -1409,83 +1381,6 @@ SK_IOC IoC) /* IO context */
} /* SkGeInit0*/ } /* SkGeInit0*/
#ifdef SK_PCI_RESET
/******************************************************************************
*
* SkGePciReset() - Reset PCI interface
*
* Description:
* o Read PCI configuration.
* o Change power state to 3.
* o Change power state to 0.
* o Restore PCI configuration.
*
* Returns:
* 0: Success.
* 1: Power state could not be changed to 3.
*/
static int SkGePciReset(
SK_AC *pAC, /* adapter context */
SK_IOC IoC) /* IO context */
{
int i;
SK_U16 PmCtlSts;
SK_U32 Bp1;
SK_U32 Bp2;
SK_U16 PciCmd;
SK_U8 Cls;
SK_U8 Lat;
SK_U8 ConfigSpace[PCI_CFG_SIZE];
/*
* Note: Switching to D3 state is like a software reset.
* Switching from D3 to D0 is a hardware reset.
* We have to save and restore the configuration space.
*/
for (i = 0; i < PCI_CFG_SIZE; i++) {
SkPciReadCfgDWord(pAC, i*4, &ConfigSpace[i]);
}
/* We know the RAM Interface Arbiter is enabled. */
SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3);
SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) {
return(1);
}
/* Return to D0 state. */
SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D0);
/* Check for D0 state. */
SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) {
return(1);
}
/* Check PCI Config Registers. */
SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd);
SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls);
SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1);
SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2);
SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat);
if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 ||
(Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) {
return(1);
}
/* Restore PCI Config Space. */
for (i = 0; i < PCI_CFG_SIZE; i++) {
SkPciWriteCfgDWord(pAC, i*4, ConfigSpace[i]);
}
return(0);
} /* SkGePciReset */
#endif /* SK_PCI_RESET */
/****************************************************************************** /******************************************************************************
* *
@ -1524,10 +1419,6 @@ SK_IOC IoC) /* IO context */
/* save CLK_RUN bits (YUKON-Lite) */ /* save CLK_RUN bits (YUKON-Lite) */
SK_IN16(IoC, B0_CTST, &CtrlStat); SK_IN16(IoC, B0_CTST, &CtrlStat);
#ifdef SK_PCI_RESET
(void)SkGePciReset(pAC, IoC);
#endif /* SK_PCI_RESET */
/* do the SW-reset */ /* do the SW-reset */
SK_OUT8(IoC, B0_CTST, CS_RST_SET); SK_OUT8(IoC, B0_CTST, CS_RST_SET);
@ -1991,11 +1882,6 @@ SK_IOC IoC) /* IO context */
int i; int i;
SK_U16 Word; SK_U16 Word;
#ifdef SK_PHY_LP_MODE
SK_U8 Byte;
SK_U16 PmCtlSts;
#endif /* SK_PHY_LP_MODE */
#if (!defined(SK_SLIM) && !defined(VCPU)) #if (!defined(SK_SLIM) && !defined(VCPU))
/* ensure I2C is ready */ /* ensure I2C is ready */
SkI2cWaitIrq(pAC, IoC); SkI2cWaitIrq(pAC, IoC);
@ -2010,38 +1896,6 @@ SK_IOC IoC) /* IO context */
} }
} }
#ifdef SK_PHY_LP_MODE
/*
* for power saving purposes within mobile environments
* we set the PHY to coma mode and switch to D3 power state.
*/
if (pAC->GIni.GIYukonLite &&
pAC->GIni.GIChipRev >= CHIP_REV_YU_LITE_A3) {
/* for all ports switch PHY to coma mode */
for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
}
if (pAC->GIni.GIVauxAvail) {
/* switch power to VAUX */
Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF;
SK_OUT8(IoC, B0_POWER_CTRL, Byte);
}
/* switch to D3 state */
SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts);
PmCtlSts |= PCI_PM_STATE_D3;
SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts);
}
#endif /* SK_PHY_LP_MODE */
/* Reset all bits in the PCI STATUS register */ /* Reset all bits in the PCI STATUS register */
/* /*
* Note: PCI Cfg cycles cannot be used, because they are not * Note: PCI Cfg cycles cannot be used, because they are not

View file

@ -871,13 +871,6 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = {
sizeof(SK_PNMI_CONF), sizeof(SK_PNMI_CONF),
SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType), SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),
SK_PNMI_RO, MacPrivateConf, 0}, SK_PNMI_RO, MacPrivateConf, 0},
#ifdef SK_PHY_LP_MODE
{OID_SKGE_PHY_LP_MODE,
SK_PNMI_MAC_ENTRIES,
sizeof(SK_PNMI_CONF),
SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyMode),
SK_PNMI_RW, MacPrivateConf, 0},
#endif
{OID_SKGE_LINK_CAP, {OID_SKGE_LINK_CAP,
SK_PNMI_MAC_ENTRIES, SK_PNMI_MAC_ENTRIES,
sizeof(SK_PNMI_CONF), sizeof(SK_PNMI_CONF),

Some files were not shown because too many files have changed in this diff Show more