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:
commit
c7cace6437
156 changed files with 5816 additions and 5303 deletions
|
@ -9,7 +9,7 @@
|
|||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||
kernel-hacking.xml kernel-locking.xml deviceiobook.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
|
||||
|
||||
###
|
||||
|
|
|
@ -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 & 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_find_*.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
MII detection is modified to support multiple mii transceiver.
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
Bugs in read_eeprom, mdio_* 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>
|
|
@ -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)
|
||||
When: March 2006
|
||||
Why: deprecated since 2.5.53 in favor of lspci(8)
|
||||
|
|
|
@ -92,8 +92,6 @@ routing.txt
|
|||
- the new routing mechanism
|
||||
shaper.txt
|
||||
- info on the module that can shape/limit transmitted traffic.
|
||||
sis900.txt
|
||||
- SiS 900/7016 Fast Ethernet device driver info.
|
||||
sk98lin.txt
|
||||
- Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit
|
||||
Ethernet Adapter family driver info
|
||||
|
|
|
@ -3,18 +3,18 @@ Intel(R) PRO/Wireless 2100 Driver for Linux in support of:
|
|||
|
||||
Intel(R) PRO/Wireless 2100 Network Connection
|
||||
|
||||
Copyright (C) 2003-2005, Intel Corporation
|
||||
Copyright (C) 2003-2006, Intel Corporation
|
||||
|
||||
README.ipw2100
|
||||
|
||||
Version: 1.1.3
|
||||
Date : October 17, 2005
|
||||
Version: git-1.1.5
|
||||
Date : January 25, 2006
|
||||
|
||||
Index
|
||||
-----------------------------------------------
|
||||
0. IMPORTANT INFORMATION BEFORE USING THIS DRIVER
|
||||
1. Introduction
|
||||
2. Release 1.1.3 Current Features
|
||||
2. Release git-1.1.5 Current Features
|
||||
3. Command Line Parameters
|
||||
4. Sysfs Helper Files
|
||||
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.
|
||||
|
||||
|
||||
2. Release 1.1.3 Current Supported Features
|
||||
2. Release git-1.1.5 Current Supported Features
|
||||
-----------------------------------------------
|
||||
- Managed (BSS) and Ad-Hoc (IBSS)
|
||||
- WEP (shared key and open)
|
||||
|
@ -270,7 +270,7 @@ For installation support on the ipw2100 1.1.0 driver on Linux kernels
|
|||
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
|
||||
under the terms of the GNU General Public License (version 2) as
|
||||
|
|
|
@ -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
|
||||
unified driver.
|
||||
|
||||
Copyright (C) 2004-2005, Intel Corporation
|
||||
Copyright (C) 2004-2006, Intel Corporation
|
||||
|
||||
README.ipw2200
|
||||
|
||||
|
@ -26,9 +26,11 @@ Index
|
|||
1.2. Module parameters
|
||||
1.3. Wireless Extension Private Methods
|
||||
1.4. Sysfs Helper Files
|
||||
1.5. Supported channels
|
||||
2. Ad-Hoc Networking
|
||||
3. Interacting with Wireless Tools
|
||||
3.1. iwconfig mode
|
||||
3.2. iwconfig sens
|
||||
4. About the Version Numbers
|
||||
5. Firmware installation
|
||||
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.
|
||||
|
||||
|
||||
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
|
||||
-----------------------------------------------
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
-----------------------------------------------
|
||||
|
@ -408,7 +448,7 @@ For general information and support, go to:
|
|||
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
|
||||
under the terms of the GNU General Public License version 2 as
|
||||
|
|
|
@ -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.
|
|
@ -319,11 +319,10 @@ static void __init hdpu_fixup_eth_pdata(struct platform_device *pd)
|
|||
struct mv643xx_eth_platform_data *eth_pd;
|
||||
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->phy_addr = pd->id;
|
||||
eth_pd->speed = SPEED_100;
|
||||
eth_pd->duplex = DUPLEX_FULL;
|
||||
eth_pd->tx_queue_size = 400;
|
||||
eth_pd->rx_queue_size = 800;
|
||||
}
|
||||
|
|
|
@ -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 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
|
||||
static int el3_debug = EL3_DEBUG;
|
||||
#else
|
||||
|
@ -174,9 +178,6 @@ struct el3_private {
|
|||
/* skb send-queue */
|
||||
int head, size;
|
||||
struct sk_buff *queue[SKB_QUEUE_SIZE];
|
||||
#ifdef CONFIG_PM_LEGACY
|
||||
struct pm_dev *pmdev;
|
||||
#endif
|
||||
enum {
|
||||
EL3_MCA,
|
||||
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_up(struct net_device *dev);
|
||||
static struct ethtool_ops ethtool_ops;
|
||||
#ifdef CONFIG_PM_LEGACY
|
||||
static int el3_suspend(struct pm_dev *pdev);
|
||||
static int el3_resume(struct pm_dev *pdev);
|
||||
static int el3_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data);
|
||||
#ifdef EL3_SUSPEND
|
||||
static int el3_suspend(struct device *, pm_message_t);
|
||||
static int el3_resume(struct device *);
|
||||
#else
|
||||
#define el3_suspend NULL
|
||||
#define el3_resume NULL
|
||||
#endif
|
||||
|
||||
|
||||
/* generic device remove for all device types */
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
static int el3_device_remove (struct device *device);
|
||||
|
@ -229,7 +234,9 @@ static struct eisa_driver el3_eisa_driver = {
|
|||
.driver = {
|
||||
.name = "3c509",
|
||||
.probe = el3_eisa_probe,
|
||||
.remove = __devexit_p (el3_device_remove)
|
||||
.remove = __devexit_p (el3_device_remove),
|
||||
.suspend = el3_suspend,
|
||||
.resume = el3_resume,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
@ -262,6 +269,8 @@ static struct mca_driver el3_mca_driver = {
|
|||
.bus = &mca_bus_type,
|
||||
.probe = el3_mca_probe,
|
||||
.remove = __devexit_p(el3_device_remove),
|
||||
.suspend = el3_suspend,
|
||||
.resume = el3_resume,
|
||||
},
|
||||
};
|
||||
#endif /* CONFIG_MCA */
|
||||
|
@ -362,10 +371,6 @@ static void el3_common_remove (struct net_device *dev)
|
|||
struct el3_private *lp = netdev_priv(dev);
|
||||
|
||||
(void) lp; /* Keep gcc quiet... */
|
||||
#ifdef CONFIG_PM_LEGACY
|
||||
if (lp->pmdev)
|
||||
pm_unregister(lp->pmdev);
|
||||
#endif
|
||||
#if defined(__ISAPNP__)
|
||||
if (lp->type == EL3_PNP)
|
||||
pnp_device_detach(to_pnp_dev(lp->dev));
|
||||
|
@ -572,16 +577,6 @@ no_pnp:
|
|||
if (err)
|
||||
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++;
|
||||
lp->next_dev = el3_root_dev;
|
||||
el3_root_dev = dev;
|
||||
|
@ -1480,20 +1475,17 @@ el3_up(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Power Management support functions */
|
||||
#ifdef CONFIG_PM_LEGACY
|
||||
#ifdef EL3_SUSPEND
|
||||
|
||||
static int
|
||||
el3_suspend(struct pm_dev *pdev)
|
||||
el3_suspend(struct device *pdev, pm_message_t state)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct net_device *dev;
|
||||
struct el3_private *lp;
|
||||
int ioaddr;
|
||||
|
||||
if (!pdev && !pdev->data)
|
||||
return -EINVAL;
|
||||
|
||||
dev = (struct net_device *)pdev->data;
|
||||
dev = pdev->driver_data;
|
||||
lp = netdev_priv(dev);
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
|
@ -1510,17 +1502,14 @@ el3_suspend(struct pm_dev *pdev)
|
|||
}
|
||||
|
||||
static int
|
||||
el3_resume(struct pm_dev *pdev)
|
||||
el3_resume(struct device *pdev)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct net_device *dev;
|
||||
struct el3_private *lp;
|
||||
int ioaddr;
|
||||
|
||||
if (!pdev && !pdev->data)
|
||||
return -EINVAL;
|
||||
|
||||
dev = (struct net_device *)pdev->data;
|
||||
dev = pdev->driver_data;
|
||||
lp = netdev_priv(dev);
|
||||
ioaddr = dev->base_addr;
|
||||
|
||||
|
@ -1536,20 +1525,7 @@ el3_resume(struct pm_dev *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
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 */
|
||||
#endif /* EL3_SUSPEND */
|
||||
|
||||
/* Parameters that may be passed into the module. */
|
||||
static int debug = -1;
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
#include <linux/mca-legacy.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/processor.h>
|
||||
|
@ -658,7 +659,7 @@ static int init586(struct net_device *dev)
|
|||
|
||||
s = jiffies; /* warning: only active with interrupts on !! */
|
||||
while (!(cfg_cmd->cmd_status & STAT_COMPL)) {
|
||||
if (jiffies - s > 30*HZ/100)
|
||||
if (time_after(jiffies, s + 30*HZ/100))
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -684,7 +685,7 @@ static int init586(struct net_device *dev)
|
|||
|
||||
s = jiffies;
|
||||
while (!(ias_cmd->cmd_status & STAT_COMPL)) {
|
||||
if (jiffies - s > 30*HZ/100)
|
||||
if (time_after(jiffies, s + 30*HZ/100))
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -709,7 +710,7 @@ static int init586(struct net_device *dev)
|
|||
|
||||
s = jiffies;
|
||||
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__);
|
||||
result = 1;
|
||||
break;
|
||||
|
@ -798,7 +799,7 @@ static int init586(struct net_device *dev)
|
|||
elmc_id_attn586();
|
||||
s = jiffies;
|
||||
while (!(mc_cmd->cmd_status & STAT_COMPL)) {
|
||||
if (jiffies - s > 30*HZ/100)
|
||||
if (time_after(jiffies, s + 30*HZ/100))
|
||||
break;
|
||||
}
|
||||
if (!(mc_cmd->cmd_status & STAT_COMPL)) {
|
||||
|
|
|
@ -258,6 +258,7 @@ static int vortex_debug = 1;
|
|||
#include <linux/highmem.h>
|
||||
#include <linux/eisa.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <asm/irq.h> /* For NR_IRQS only. */
|
||||
#include <asm/io.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,
|
||||
};
|
||||
|
||||
static struct media_table {
|
||||
static const struct media_table {
|
||||
char *name;
|
||||
unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */
|
||||
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;
|
||||
EL3WINDOW(3);
|
||||
vp->available_media = ioread16(ioaddr + Wn3_Options);
|
||||
|
@ -2724,7 +2725,7 @@ boomerang_rx(struct net_device *dev)
|
|||
skb = dev_alloc_skb(PKT_BUF_SZ);
|
||||
if (skb == NULL) {
|
||||
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);
|
||||
last_jif = jiffies;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/irq.h>
|
||||
#include <asm/irq.h>
|
||||
/* Used for the temporal inet entries and routing */
|
||||
#include <linux/socket.h>
|
||||
#include <linux/bitops.h>
|
||||
|
|
|
@ -1276,7 +1276,7 @@ static int cp_change_mtu(struct net_device *dev, int new_mtu)
|
|||
}
|
||||
#endif /* BROKEN */
|
||||
|
||||
static char mii_2_8139_map[8] = {
|
||||
static const char mii_2_8139_map[8] = {
|
||||
BasicModeCtrl,
|
||||
BasicModeStatus,
|
||||
0,
|
||||
|
|
|
@ -229,7 +229,7 @@ typedef enum {
|
|||
|
||||
|
||||
/* indexed by board_t, above */
|
||||
static struct {
|
||||
static const struct {
|
||||
const char *name;
|
||||
u32 hw_flags;
|
||||
} 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)
|
||||
|
||||
|
||||
static char mii_2_8139_map[8] = {
|
||||
static const char mii_2_8139_map[8] = {
|
||||
BasicModeCtrl,
|
||||
BasicModeStatus,
|
||||
0,
|
||||
|
|
|
@ -614,7 +614,7 @@ static void rebuild_rx_bufs(struct net_device *dev)
|
|||
static int init_i596_mem(struct net_device *dev)
|
||||
{
|
||||
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;
|
||||
#endif
|
||||
unsigned long flags;
|
||||
|
|
|
@ -66,7 +66,7 @@ config BONDING
|
|||
'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux.
|
||||
|
||||
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
|
||||
information.
|
||||
|
@ -698,8 +698,8 @@ config VORTEX
|
|||
depends on NET_VENDOR_3COM && (PCI || EISA)
|
||||
select MII
|
||||
---help---
|
||||
This option enables driver support for a large number of 10mbps and
|
||||
10/100mbps EISA, PCI and PCMCIA 3Com network cards:
|
||||
This option enables driver support for a large number of 10Mbps and
|
||||
10/100Mbps EISA, PCI and PCMCIA 3Com network cards:
|
||||
|
||||
"Vortex" (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI
|
||||
"Boomerang" (EtherLink XL 3c900 or 3c905) PCI
|
||||
|
@ -1021,7 +1021,7 @@ config EEXPRESS_PRO
|
|||
depends on NET_ISA
|
||||
---help---
|
||||
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
|
||||
driver. Please read the Ethernet-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
@ -1208,7 +1208,7 @@ config IBM_EMAC_RX_SKB_HEADROOM
|
|||
help
|
||||
Additional receive skb headroom. Note, that driver
|
||||
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.
|
||||
|
||||
If unsure, set to 0.
|
||||
|
@ -1372,8 +1372,8 @@ config B44
|
|||
called b44.
|
||||
|
||||
config FORCEDETH
|
||||
tristate "Reverse Engineered nForce Ethernet support (EXPERIMENTAL)"
|
||||
depends on NET_PCI && PCI && EXPERIMENTAL
|
||||
tristate "nForce Ethernet support"
|
||||
depends on NET_PCI && PCI
|
||||
help
|
||||
If you have a network (Ethernet) controller of this type, say Y and
|
||||
read the Ethernet-HOWTO, available from
|
||||
|
@ -1614,11 +1614,7 @@ config SIS900
|
|||
---help---
|
||||
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
|
||||
SiS 630 and SiS 540 chipsets. If you have one of those, say Y and
|
||||
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.
|
||||
SiS 630 and SiS 540 chipsets.
|
||||
|
||||
This driver also supports AMD 79C901 HomePNA so that you can use
|
||||
your phone line as a network cable.
|
||||
|
@ -1934,7 +1930,7 @@ config MYRI_SBUS
|
|||
will be called myri_sbus. This is recommended.
|
||||
|
||||
config NS83820
|
||||
tristate "National Semiconduct DP83820 support"
|
||||
tristate "National Semiconductor DP83820 support"
|
||||
depends on PCI
|
||||
help
|
||||
This is a driver for the National Semiconductor DP83820 series
|
||||
|
@ -2195,6 +2191,7 @@ config GFAR_NAPI
|
|||
config MV643XX_ETH
|
||||
tristate "MV-643XX Ethernet support"
|
||||
depends on MOMENCO_OCELOT_C || MOMENCO_JAGUAR_ATX || MV64360 || MOMENCO_OCELOT_3 || PPC_MULTIPLATFORM
|
||||
select MII
|
||||
help
|
||||
This driver supports the gigabit Ethernet on the Marvell MV643XX
|
||||
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
|
||||
PPP interfaces. This allows you to control which packets count as
|
||||
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
|
||||
active-filter options to pppd.
|
||||
|
||||
|
@ -2702,8 +2699,8 @@ config SHAPER
|
|||
<file:Documentation/networking/shaper.txt> for more information.
|
||||
|
||||
An alternative to this traffic shaper is the experimental
|
||||
Class-Based Queueing (CBQ) scheduling support which you get if you
|
||||
say Y to "QoS and/or fair queueing" above.
|
||||
Class-Based Queuing (CBQ) scheduling support which you get if you
|
||||
say Y to "QoS and/or fair queuing" above.
|
||||
|
||||
To compile this driver as a module, choose M here: the module
|
||||
will be called shaper. If unsure, say N.
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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);
|
||||
|
||||
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");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -382,7 +383,7 @@ apne_reset_8390(struct net_device *dev)
|
|||
|
||||
/* This check _should_not_ be necessary, omit eventually. */
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -530,7 +531,7 @@ apne_block_output(struct net_device *dev, int count,
|
|||
dma_start = jiffies;
|
||||
|
||||
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);
|
||||
apne_reset_8390(dev);
|
||||
NS8390_init(dev,1);
|
||||
|
|
|
@ -68,10 +68,10 @@ config ARCNET_CAP
|
|||
packet is stuffed with an extra 4 byte "cookie" which doesn't
|
||||
actually appear on the network. After transmit the driver will send
|
||||
back a packet with protocol byte 0 containing the status of the
|
||||
transmition:
|
||||
transmission:
|
||||
0=no hardware acknowledge
|
||||
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
|
||||
be random data.
|
||||
|
|
|
@ -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,
|
||||
int bufnum);
|
||||
|
||||
struct ArcProto rawmode_proto =
|
||||
static struct ArcProto rawmode_proto =
|
||||
{
|
||||
.suffix = 'r',
|
||||
.mtu = XMTU,
|
||||
|
|
|
@ -97,25 +97,44 @@ static int __init arcrimi_probe(struct net_device *dev)
|
|||
"must specify the shmem and irq!\n");
|
||||
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
|
||||
* and this reserve will be released and the correct size
|
||||
* 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");
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -125,19 +144,28 @@ static int __init arcrimi_found(struct net_device *dev)
|
|||
{
|
||||
struct arcnet_local *lp;
|
||||
unsigned long first_mirror, last_mirror, shmem;
|
||||
void __iomem *p;
|
||||
int mirror_size;
|
||||
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 */
|
||||
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);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
shmem = dev->mem_start;
|
||||
isa_writeb(TESTvalue, shmem);
|
||||
isa_writeb(dev->dev_addr[0], shmem + 1); /* actually the node ID */
|
||||
writeb(TESTvalue, p);
|
||||
writeb(dev->dev_addr[0], p + 1); /* actually the node ID */
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
mirror_size = MIRROR_SIZE;
|
||||
if (isa_readb(shmem) == TESTvalue
|
||||
&& isa_readb(shmem - mirror_size) != TESTvalue
|
||||
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue)
|
||||
mirror_size *= 2;
|
||||
if (readb(p) == TESTvalue
|
||||
&& check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0
|
||||
&& check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
|
||||
mirror_size = 2 * MIRROR_SIZE;
|
||||
|
||||
first_mirror = last_mirror = shmem;
|
||||
while (isa_readb(first_mirror) == TESTvalue)
|
||||
first_mirror = shmem - mirror_size;
|
||||
while (check_mirror(first_mirror, mirror_size) == 1)
|
||||
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;
|
||||
|
||||
|
@ -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
|
||||
* fail.
|
||||
*/
|
||||
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)")) {
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include <net/arp.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/arcdevice.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
/* "do nothing" functions for protocol drivers */
|
||||
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,
|
||||
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
|
||||
|
@ -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,
|
||||
*arc_bcast_proto, *arc_raw_proto;
|
||||
|
||||
struct ArcProto arc_proto_null =
|
||||
static struct ArcProto arc_proto_null =
|
||||
{
|
||||
.suffix = '?',
|
||||
.mtu = XMTU,
|
||||
|
@ -90,7 +92,6 @@ EXPORT_SYMBOL(arc_proto_map);
|
|||
EXPORT_SYMBOL(arc_proto_default);
|
||||
EXPORT_SYMBOL(arc_bcast_proto);
|
||||
EXPORT_SYMBOL(arc_raw_proto);
|
||||
EXPORT_SYMBOL(arc_proto_null);
|
||||
EXPORT_SYMBOL(arcnet_unregister_proto);
|
||||
EXPORT_SYMBOL(arcnet_debug);
|
||||
EXPORT_SYMBOL(alloc_arcdev);
|
||||
|
@ -118,7 +119,7 @@ static int __init arcnet_init(void)
|
|||
|
||||
arcnet_debug = debug;
|
||||
|
||||
printk(VERSION);
|
||||
printk("arcnet loaded.\n");
|
||||
|
||||
#ifdef ALPHA_WARNING
|
||||
BUGLVL(D_EXTRA) {
|
||||
|
@ -178,8 +179,8 @@ EXPORT_SYMBOL(arcnet_dump_skb);
|
|||
* Dump the contents of an ARCnet buffer
|
||||
*/
|
||||
#if (ARCNET_DEBUG_MAX & (D_RX | D_TX))
|
||||
void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc,
|
||||
int take_arcnet_lock)
|
||||
static void arcnet_dump_packet(struct net_device *dev, int bufnum,
|
||||
char *desc, int take_arcnet_lock)
|
||||
{
|
||||
struct arcnet_local *lp = dev->priv;
|
||||
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
|
||||
|
||||
|
||||
|
@ -733,7 +737,7 @@ static void arcnet_timeout(struct net_device *dev)
|
|||
|
||||
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",
|
||||
msg, status, lp->intmask, lp->lasttrans_dest);
|
||||
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
|
||||
* 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 archdr pkt;
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
|
||||
|
||||
/* 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 int com90xx_status(struct net_device *dev);
|
||||
static void com90xx_setmask(struct net_device *dev, int mask);
|
||||
|
@ -116,14 +116,26 @@ static void __init com90xx_probe(void)
|
|||
unsigned long airqmask;
|
||||
int ports[(0x3f0 - 0x200) / 16 + 1] =
|
||||
{0};
|
||||
u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] =
|
||||
{0};
|
||||
unsigned long *shmems;
|
||||
void __iomem **iomem;
|
||||
int numports, numshmems, *port;
|
||||
u_long *p;
|
||||
int index;
|
||||
|
||||
if (!io && !irq && !shmem && !*device && com90xx_skip_probe)
|
||||
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);
|
||||
|
||||
/* set up the arrays where we'll store the possible probe addresses */
|
||||
|
@ -179,6 +191,8 @@ static void __init com90xx_probe(void)
|
|||
|
||||
if (!numports) {
|
||||
BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
|
||||
kfree(shmems);
|
||||
kfree(iomem);
|
||||
return;
|
||||
}
|
||||
/* 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.
|
||||
*/
|
||||
numprint = -1;
|
||||
for (p = &shmems[0]; p < shmems + numshmems; p++) {
|
||||
u_long ptr = *p;
|
||||
for (index = 0, p = &shmems[0]; index < numshmems; p++, index++) {
|
||||
void __iomem *base;
|
||||
|
||||
numprint++;
|
||||
numprint %= 8;
|
||||
|
@ -213,38 +227,49 @@ static void __init com90xx_probe(void)
|
|||
}
|
||||
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, "Stage 3: ");
|
||||
BUGLVL(D_INIT_REASONS) numprint = 0;
|
||||
*p-- = shmems[--numshmems];
|
||||
continue;
|
||||
goto out;
|
||||
}
|
||||
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",
|
||||
isa_readb(ptr), TESTvalue);
|
||||
readb(base), TESTvalue);
|
||||
BUGMSG2(D_INIT_REASONS, "S3: ");
|
||||
BUGLVL(D_INIT_REASONS) numprint = 0;
|
||||
release_mem_region(*p, BUFFER_SIZE);
|
||||
*p-- = shmems[--numshmems];
|
||||
continue;
|
||||
goto out2;
|
||||
}
|
||||
/* By writing 0x42 to the TESTvalue location, we also make
|
||||
* sure no "mirror" shmem areas show up - if they occur
|
||||
* in another pass through this loop, they will be discarded
|
||||
* because *cptr != TESTvalue.
|
||||
*/
|
||||
isa_writeb(0x42, ptr);
|
||||
if (isa_readb(ptr) != 0x42) {
|
||||
writeb(0x42, base);
|
||||
if (readb(base) != 0x42) {
|
||||
BUGMSG2(D_INIT_REASONS, "(read only)\n");
|
||||
BUGMSG2(D_INIT_REASONS, "S3: ");
|
||||
release_mem_region(*p, BUFFER_SIZE);
|
||||
*p-- = shmems[--numshmems];
|
||||
continue;
|
||||
goto out2;
|
||||
}
|
||||
BUGMSG2(D_INIT_REASONS, "\n");
|
||||
BUGMSG2(D_INIT_REASONS, "S3: ");
|
||||
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");
|
||||
|
||||
|
@ -252,6 +277,8 @@ static void __init com90xx_probe(void)
|
|||
BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
|
||||
for (port = &ports[0]; port < ports + numports; port++)
|
||||
release_region(*port, ARCNET_TOTAL_SIZE);
|
||||
kfree(shmems);
|
||||
kfree(iomem);
|
||||
return;
|
||||
}
|
||||
/* Stage 4: something of a dummy, to report the shmems that are
|
||||
|
@ -351,30 +378,32 @@ static void __init com90xx_probe(void)
|
|||
mdelay(RESETtime);
|
||||
} else {
|
||||
/* just one shmem and port, assume they match */
|
||||
isa_writeb(TESTvalue, shmems[0]);
|
||||
writeb(TESTvalue, iomem[0]);
|
||||
}
|
||||
#else
|
||||
inb(_RESET);
|
||||
mdelay(RESETtime);
|
||||
#endif
|
||||
|
||||
for (p = &shmems[0]; p < shmems + numshmems; p++) {
|
||||
u_long ptr = *p;
|
||||
for (index = 0; index < numshmems; index++) {
|
||||
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);
|
||||
openparen = 0;
|
||||
|
||||
/* register the card */
|
||||
if (com90xx_found(*port, airq, *p) == 0)
|
||||
if (com90xx_found(*port, airq, ptr, base) == 0)
|
||||
found = 1;
|
||||
numprint = -1;
|
||||
|
||||
/* remove shmem from the list */
|
||||
*p = shmems[--numshmems];
|
||||
shmems[index] = shmems[--numshmems];
|
||||
iomem[index] = iomem[numshmems];
|
||||
break; /* go to the next I/O port */
|
||||
} 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");
|
||||
|
||||
/* Now put back TESTvalue on all leftover shmems. */
|
||||
for (p = &shmems[0]; p < shmems + numshmems; p++) {
|
||||
isa_writeb(TESTvalue, *p);
|
||||
release_mem_region(*p, BUFFER_SIZE);
|
||||
for (index = 0; index < numshmems; index++) {
|
||||
writeb(TESTvalue, iomem[index]);
|
||||
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
|
||||
* 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 arcnet_local *lp;
|
||||
|
@ -412,7 +464,8 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem)
|
|||
dev = alloc_arcdev(device);
|
||||
if (!dev) {
|
||||
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;
|
||||
}
|
||||
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.
|
||||
*/
|
||||
mirror_size = MIRROR_SIZE;
|
||||
if (isa_readb(shmem) == TESTvalue
|
||||
&& isa_readb(shmem - mirror_size) != TESTvalue
|
||||
&& isa_readb(shmem - 2 * mirror_size) == TESTvalue)
|
||||
mirror_size *= 2;
|
||||
if (readb(p) == TESTvalue &&
|
||||
check_mirror(shmem - MIRROR_SIZE, MIRROR_SIZE) == 0 &&
|
||||
check_mirror(shmem - 2 * MIRROR_SIZE, MIRROR_SIZE) == 1)
|
||||
mirror_size = 2 * MIRROR_SIZE;
|
||||
|
||||
first_mirror = last_mirror = shmem;
|
||||
while (isa_readb(first_mirror) == TESTvalue)
|
||||
first_mirror = shmem - mirror_size;
|
||||
while (check_mirror(first_mirror, mirror_size) == 1)
|
||||
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;
|
||||
|
||||
dev->mem_start = first_mirror;
|
||||
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)"))
|
||||
goto err_free_dev;
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
|
|||
int bufnum);
|
||||
|
||||
|
||||
struct ArcProto rfc1051_proto =
|
||||
static struct ArcProto rfc1051_proto =
|
||||
{
|
||||
.suffix = 's',
|
||||
.mtu = XMTU - RFC1051_HDR_SIZE,
|
||||
|
|
|
@ -43,7 +43,7 @@ static int prepare_tx(struct net_device *dev, struct archdr *pkt, int length,
|
|||
int bufnum);
|
||||
static int continue_tx(struct net_device *dev, int bufnum);
|
||||
|
||||
struct ArcProto rfc1201_proto =
|
||||
static struct ArcProto rfc1201_proto =
|
||||
{
|
||||
.suffix = 'a',
|
||||
.mtu = 1500, /* could be more, but some receivers can't handle it... */
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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;
|
||||
|
||||
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",
|
||||
dev->name);
|
||||
etherh_reset (dev);
|
||||
|
|
|
@ -46,7 +46,7 @@ typedef enum {
|
|||
} board_t;
|
||||
|
||||
/* indexed by board_t, above */
|
||||
static struct {
|
||||
static const struct {
|
||||
char *name;
|
||||
} board_info[] __devinitdata = {
|
||||
{ "Broadcom NetXtreme II BCM5706 1000Base-T" },
|
||||
|
@ -3476,7 +3476,7 @@ bnx2_test_registers(struct bnx2 *bp)
|
|||
{
|
||||
int ret;
|
||||
int i;
|
||||
static struct {
|
||||
static const struct {
|
||||
u16 offset;
|
||||
u16 flags;
|
||||
u32 rw_mask;
|
||||
|
@ -3891,7 +3891,7 @@ reg_test_err:
|
|||
static int
|
||||
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 };
|
||||
int i;
|
||||
|
||||
|
@ -3916,7 +3916,7 @@ bnx2_test_memory(struct bnx2 *bp)
|
|||
{
|
||||
int ret = 0;
|
||||
int i;
|
||||
static struct {
|
||||
static const struct {
|
||||
u32 offset;
|
||||
u32 len;
|
||||
} mem_tbl[] = {
|
||||
|
@ -5122,7 +5122,7 @@ static struct {
|
|||
|
||||
#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_IfHCInBadOctets_hi),
|
||||
STATS_OFFSET32(stat_IfHCOutOctets_hi),
|
||||
|
|
|
@ -14,20 +14,20 @@
|
|||
* accompanying it.
|
||||
*/
|
||||
|
||||
static int bnx2_COM_b06FwReleaseMajor = 0x1;
|
||||
static int bnx2_COM_b06FwReleaseMinor = 0x0;
|
||||
static int bnx2_COM_b06FwReleaseFix = 0x0;
|
||||
static u32 bnx2_COM_b06FwStartAddr = 0x080008b4;
|
||||
static u32 bnx2_COM_b06FwTextAddr = 0x08000000;
|
||||
static int bnx2_COM_b06FwTextLen = 0x57bc;
|
||||
static u32 bnx2_COM_b06FwDataAddr = 0x08005840;
|
||||
static int bnx2_COM_b06FwDataLen = 0x0;
|
||||
static u32 bnx2_COM_b06FwRodataAddr = 0x080057c0;
|
||||
static int bnx2_COM_b06FwRodataLen = 0x58;
|
||||
static u32 bnx2_COM_b06FwBssAddr = 0x08005860;
|
||||
static int bnx2_COM_b06FwBssLen = 0x88;
|
||||
static u32 bnx2_COM_b06FwSbssAddr = 0x08005840;
|
||||
static int bnx2_COM_b06FwSbssLen = 0x1c;
|
||||
static const int bnx2_COM_b06FwReleaseMajor = 0x1;
|
||||
static const int bnx2_COM_b06FwReleaseMinor = 0x0;
|
||||
static const int bnx2_COM_b06FwReleaseFix = 0x0;
|
||||
static const u32 bnx2_COM_b06FwStartAddr = 0x080008b4;
|
||||
static const u32 bnx2_COM_b06FwTextAddr = 0x08000000;
|
||||
static const int bnx2_COM_b06FwTextLen = 0x57bc;
|
||||
static const u32 bnx2_COM_b06FwDataAddr = 0x08005840;
|
||||
static const int bnx2_COM_b06FwDataLen = 0x0;
|
||||
static const u32 bnx2_COM_b06FwRodataAddr = 0x080057c0;
|
||||
static const int bnx2_COM_b06FwRodataLen = 0x58;
|
||||
static const u32 bnx2_COM_b06FwBssAddr = 0x08005860;
|
||||
static const int bnx2_COM_b06FwBssLen = 0x88;
|
||||
static const u32 bnx2_COM_b06FwSbssAddr = 0x08005840;
|
||||
static const int bnx2_COM_b06FwSbssLen = 0x1c;
|
||||
static u32 bnx2_COM_b06FwText[(0x57bc/4) + 1] = {
|
||||
0x0a00022d, 0x00000000, 0x00000000, 0x0000000d, 0x636f6d20, 0x322e352e,
|
||||
0x38000000, 0x02050802, 0x00000000, 0x00000003, 0x00000014, 0x00000032,
|
||||
|
@ -2325,20 +2325,20 @@ static u32 bnx2_rv2p_proc2[] = {
|
|||
0x0000000c, 0x29520000, 0x00000018, 0x80000002, 0x0000000c, 0x29800000,
|
||||
0x00000018, 0x00570000 };
|
||||
|
||||
static int bnx2_TPAT_b06FwReleaseMajor = 0x1;
|
||||
static int bnx2_TPAT_b06FwReleaseMinor = 0x0;
|
||||
static int bnx2_TPAT_b06FwReleaseFix = 0x0;
|
||||
static u32 bnx2_TPAT_b06FwStartAddr = 0x08000860;
|
||||
static u32 bnx2_TPAT_b06FwTextAddr = 0x08000800;
|
||||
static int bnx2_TPAT_b06FwTextLen = 0x122c;
|
||||
static u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60;
|
||||
static int bnx2_TPAT_b06FwDataLen = 0x0;
|
||||
static u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000;
|
||||
static int bnx2_TPAT_b06FwRodataLen = 0x0;
|
||||
static u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0;
|
||||
static int bnx2_TPAT_b06FwBssLen = 0x250;
|
||||
static u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60;
|
||||
static int bnx2_TPAT_b06FwSbssLen = 0x34;
|
||||
static const int bnx2_TPAT_b06FwReleaseMajor = 0x1;
|
||||
static const int bnx2_TPAT_b06FwReleaseMinor = 0x0;
|
||||
static const int bnx2_TPAT_b06FwReleaseFix = 0x0;
|
||||
static const u32 bnx2_TPAT_b06FwStartAddr = 0x08000860;
|
||||
static const u32 bnx2_TPAT_b06FwTextAddr = 0x08000800;
|
||||
static const int bnx2_TPAT_b06FwTextLen = 0x122c;
|
||||
static const u32 bnx2_TPAT_b06FwDataAddr = 0x08001a60;
|
||||
static const int bnx2_TPAT_b06FwDataLen = 0x0;
|
||||
static const u32 bnx2_TPAT_b06FwRodataAddr = 0x00000000;
|
||||
static const int bnx2_TPAT_b06FwRodataLen = 0x0;
|
||||
static const u32 bnx2_TPAT_b06FwBssAddr = 0x08001aa0;
|
||||
static const int bnx2_TPAT_b06FwBssLen = 0x250;
|
||||
static const u32 bnx2_TPAT_b06FwSbssAddr = 0x08001a60;
|
||||
static const int bnx2_TPAT_b06FwSbssLen = 0x34;
|
||||
static u32 bnx2_TPAT_b06FwText[(0x122c/4) + 1] = {
|
||||
0x0a000218, 0x00000000, 0x00000000, 0x0000000d, 0x74706174, 0x20322e35,
|
||||
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_b06FwSbss[(0x34/4) + 1] = { 0x0 };
|
||||
|
||||
static int bnx2_TXP_b06FwReleaseMajor = 0x1;
|
||||
static int bnx2_TXP_b06FwReleaseMinor = 0x0;
|
||||
static int bnx2_TXP_b06FwReleaseFix = 0x0;
|
||||
static u32 bnx2_TXP_b06FwStartAddr = 0x080034b0;
|
||||
static u32 bnx2_TXP_b06FwTextAddr = 0x08000000;
|
||||
static int bnx2_TXP_b06FwTextLen = 0x5748;
|
||||
static u32 bnx2_TXP_b06FwDataAddr = 0x08005760;
|
||||
static int bnx2_TXP_b06FwDataLen = 0x0;
|
||||
static u32 bnx2_TXP_b06FwRodataAddr = 0x00000000;
|
||||
static int bnx2_TXP_b06FwRodataLen = 0x0;
|
||||
static u32 bnx2_TXP_b06FwBssAddr = 0x080057a0;
|
||||
static int bnx2_TXP_b06FwBssLen = 0x1c4;
|
||||
static u32 bnx2_TXP_b06FwSbssAddr = 0x08005760;
|
||||
static int bnx2_TXP_b06FwSbssLen = 0x38;
|
||||
static const int bnx2_TXP_b06FwReleaseMajor = 0x1;
|
||||
static const int bnx2_TXP_b06FwReleaseMinor = 0x0;
|
||||
static const int bnx2_TXP_b06FwReleaseFix = 0x0;
|
||||
static const u32 bnx2_TXP_b06FwStartAddr = 0x080034b0;
|
||||
static const u32 bnx2_TXP_b06FwTextAddr = 0x08000000;
|
||||
static const int bnx2_TXP_b06FwTextLen = 0x5748;
|
||||
static const u32 bnx2_TXP_b06FwDataAddr = 0x08005760;
|
||||
static const int bnx2_TXP_b06FwDataLen = 0x0;
|
||||
static const u32 bnx2_TXP_b06FwRodataAddr = 0x00000000;
|
||||
static const int bnx2_TXP_b06FwRodataLen = 0x0;
|
||||
static const u32 bnx2_TXP_b06FwBssAddr = 0x080057a0;
|
||||
static const int bnx2_TXP_b06FwBssLen = 0x1c4;
|
||||
static const u32 bnx2_TXP_b06FwSbssAddr = 0x08005760;
|
||||
static const int bnx2_TXP_b06FwSbssLen = 0x38;
|
||||
static u32 bnx2_TXP_b06FwText[(0x5748/4) + 1] = {
|
||||
0x0a000d2c, 0x00000000, 0x00000000, 0x0000000d, 0x74787020, 0x322e352e,
|
||||
0x38000000, 0x02050800, 0x0000000a, 0x000003e8, 0x0000ea60, 0x00000000,
|
||||
|
|
|
@ -1261,7 +1261,7 @@ int bond_alb_xmit(struct sk_buff *skb, struct net_device *bond_dev)
|
|||
struct ethhdr *eth_data;
|
||||
struct alb_bond_info *bond_info = &(BOND_ALB_INFO(bond));
|
||||
struct slave *tx_slave = NULL;
|
||||
static u32 ip_bcast = 0xffffffff;
|
||||
static const u32 ip_bcast = 0xffffffff;
|
||||
int hash_size = 0;
|
||||
int do_tx_balance = 1;
|
||||
u32 hash_index = 0;
|
||||
|
|
|
@ -131,7 +131,7 @@ MODULE_PARM_DESC(arp_ip_target, "arp targets in n.n.n.n form");
|
|||
|
||||
/*----------------------------- Global variables ----------------------------*/
|
||||
|
||||
static const char *version =
|
||||
static const char * const version =
|
||||
DRV_DESCRIPTION ": v" DRV_VERSION " (" DRV_RELDATE ")\n";
|
||||
|
||||
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) ||
|
||||
(bond->params.mode == BOND_MODE_ALB)) {
|
||||
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 {
|
||||
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) {
|
||||
case BOND_MODE_ACTIVEBACKUP:
|
||||
/* if we're in active-backup mode, we need one and only one active
|
||||
* interface. The backup interfaces will have their NOARP flag set
|
||||
* because we need them to be completely deaf and not to respond to
|
||||
* any ARP request on the network to avoid fooling a switch. Thus,
|
||||
* since we guarantee that curr_active_slave always point to the last
|
||||
* usable interface, we just have to verify this interface's flag.
|
||||
/* if we're in active-backup mode, we need one and
|
||||
* only one active interface. The backup interfaces
|
||||
* will have their SLAVE_INACTIVE flag set because we
|
||||
* need them to be drop all packets. Thus, since we
|
||||
* guarantee that curr_active_slave always point to
|
||||
* the last usable interface, we just have to verify
|
||||
* this interface's flag.
|
||||
*/
|
||||
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)) {
|
||||
dprintk("This is the first active slave\n");
|
||||
/* 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
|
||||
*/
|
||||
bond_change_active_slave(bond, new_slave);
|
||||
} else {
|
||||
bond_set_slave_inactive_flags(new_slave);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -1724,13 +1731,8 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
|
||||
/* restore the original state of the
|
||||
* IFF_NOARP flag that might have been
|
||||
* set by bond_set_slave_inactive_flags()
|
||||
*/
|
||||
if ((slave->original_flags & IFF_NOARP) == 0) {
|
||||
slave_dev->flags &= ~IFF_NOARP;
|
||||
}
|
||||
slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB |
|
||||
IFF_SLAVE_INACTIVE);
|
||||
|
||||
kfree(slave);
|
||||
|
||||
|
@ -1816,12 +1818,8 @@ static int bond_release_all(struct net_device *bond_dev)
|
|||
addr.sa_family = slave_dev->type;
|
||||
dev_set_mac_address(slave_dev, &addr);
|
||||
|
||||
/* restore the original state of the IFF_NOARP flag that might have
|
||||
* been set by bond_set_slave_inactive_flags()
|
||||
*/
|
||||
if ((slave->original_flags & IFF_NOARP) == 0) {
|
||||
slave_dev->flags &= ~IFF_NOARP;
|
||||
}
|
||||
slave_dev->priv_flags &= ~(IFF_MASTER_8023AD | IFF_MASTER_ALB |
|
||||
IFF_SLAVE_INACTIVE);
|
||||
|
||||
kfree(slave);
|
||||
|
||||
|
@ -4061,14 +4059,17 @@ void bond_set_mode_ops(struct bonding *bond, int mode)
|
|||
bond_dev->hard_start_xmit = bond_xmit_broadcast;
|
||||
break;
|
||||
case BOND_MODE_8023AD:
|
||||
bond_set_master_3ad_flags(bond);
|
||||
bond_dev->hard_start_xmit = bond_3ad_xmit_xor;
|
||||
if (bond->params.xmit_policy == BOND_XMIT_POLICY_LAYER34)
|
||||
bond->xmit_hash_policy = bond_xmit_hash_policy_l34;
|
||||
else
|
||||
bond->xmit_hash_policy = bond_xmit_hash_policy_l2;
|
||||
break;
|
||||
case BOND_MODE_TLB:
|
||||
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->set_mac_address = bond_alb_set_mac_address;
|
||||
break;
|
||||
|
|
|
@ -424,6 +424,12 @@ static ssize_t bonding_store_mode(struct class_device *cd, const char *buf, size
|
|||
ret = -EINVAL;
|
||||
goto out;
|
||||
} 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_set_mode_ops(bond, bond->params.mode);
|
||||
printk(KERN_INFO DRV_NAME ": %s: setting mode to %s (%d).\n",
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
#include "bond_3ad.h"
|
||||
#include "bond_alb.h"
|
||||
|
||||
#define DRV_VERSION "3.0.1"
|
||||
#define DRV_RELDATE "January 9, 2006"
|
||||
#define DRV_VERSION "3.0.2"
|
||||
#define DRV_RELDATE "February 21, 2006"
|
||||
#define DRV_NAME "bonding"
|
||||
#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)
|
||||
{
|
||||
slave->state = BOND_STATE_BACKUP;
|
||||
slave->dev->flags |= IFF_NOARP;
|
||||
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->dev->priv_flags |= IFF_SLAVE_INACTIVE;
|
||||
}
|
||||
|
||||
static inline void bond_set_slave_active_flags(struct slave *slave)
|
||||
{
|
||||
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);
|
||||
|
|
|
@ -87,15 +87,9 @@ static int tricn_write(adapter_t *adapter, int bundle_addr, int module_addr,
|
|||
static int tricn_init(adapter_t *adapter)
|
||||
{
|
||||
int i = 0;
|
||||
int sme = 1;
|
||||
int stat = 0;
|
||||
int timeout = 0;
|
||||
int is_ready = 0;
|
||||
int dynamic_deskew = 0;
|
||||
|
||||
if (dynamic_deskew)
|
||||
sme = 0;
|
||||
|
||||
|
||||
/* 1 */
|
||||
timeout=1000;
|
||||
|
@ -113,11 +107,9 @@ static int tricn_init(adapter_t *adapter)
|
|||
}
|
||||
|
||||
/* 2 */
|
||||
if (sme) {
|
||||
tricn_write(adapter, 0, 0, 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, 0, 0, TRICN_CNFG, 0x81);
|
||||
tricn_write(adapter, 0, 1, 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<= 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);
|
||||
|
|
|
@ -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 unsigned short speed_map[] = { 33, 66, 100, 133 };
|
||||
static const unsigned short speed_map[] = { 33, 66, 100, 133 };
|
||||
u32 pci_mode;
|
||||
|
||||
pci_read_config_dword(adapter->pdev, A_PCICFG_MODE, &pci_mode);
|
||||
|
|
|
@ -993,7 +993,7 @@ dgrs_download(struct net_device *dev0)
|
|||
int is;
|
||||
unsigned long i;
|
||||
|
||||
static int iv2is[16] = {
|
||||
static const int iv2is[16] = {
|
||||
0, 0, 0, ES4H_IS_INT3,
|
||||
0, ES4H_IS_INT5, 0, ES4H_IS_INT7,
|
||||
0, 0, ES4H_IS_INT10, ES4H_IS_INT11,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
static int dgrs_firmnum = 550;
|
||||
static const int dgrs_firmnum = 550;
|
||||
static char dgrs_firmver[] = "$Version$";
|
||||
static char dgrs_firmdate[] = "11/16/96 03:45:15";
|
||||
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,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0
|
||||
} ;
|
||||
static int dgrs_ncode = 119520 ;
|
||||
static const int dgrs_ncode = 119520 ;
|
||||
|
|
|
@ -90,8 +90,8 @@ module_param(tx_coalesce, int, 0); /* HW xmit count each TxDMAComplete */
|
|||
#define EnableInt() \
|
||||
writew(DEFAULT_INTR, ioaddr + IntEnable)
|
||||
|
||||
static int max_intrloop = 50;
|
||||
static int multicast_filter_limit = 0x40;
|
||||
static const int max_intrloop = 50;
|
||||
static const int multicast_filter_limit = 0x40;
|
||||
|
||||
static int rio_open (struct net_device *dev);
|
||||
static void rio_timer (unsigned long data);
|
||||
|
|
|
@ -598,8 +598,8 @@ static void e100_enable_irq(struct nic *nic)
|
|||
|
||||
spin_lock_irqsave(&nic->cmd_lock, flags);
|
||||
writeb(irq_mask_none, &nic->csr->scb.cmd_hi);
|
||||
spin_unlock_irqrestore(&nic->cmd_lock, flags);
|
||||
e100_write_flush(nic);
|
||||
spin_unlock_irqrestore(&nic->cmd_lock, flags);
|
||||
}
|
||||
|
||||
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);
|
||||
writeb(irq_mask_all, &nic->csr->scb.cmd_hi);
|
||||
spin_unlock_irqrestore(&nic->cmd_lock, flags);
|
||||
e100_write_flush(nic);
|
||||
spin_unlock_irqrestore(&nic->cmd_lock, flags);
|
||||
}
|
||||
|
||||
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 */
|
||||
spin_lock_irq(&nic->cmd_lock);
|
||||
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);
|
||||
spin_unlock_irq(&nic->cmd_lock);
|
||||
|
||||
e100_update_stats(nic);
|
||||
e100_adjust_adaptive_ifs(nic, cmd.speed, cmd.duplex);
|
||||
|
|
|
@ -83,10 +83,6 @@
|
|||
struct e1000_adapter;
|
||||
|
||||
#include "e1000_hw.h"
|
||||
#ifdef CONFIG_E1000_MQ
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/smp.h>
|
||||
#endif
|
||||
|
||||
#ifdef DBG
|
||||
#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
|
||||
|
@ -169,12 +165,6 @@ struct e1000_buffer {
|
|||
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_dma { uint64_t ps_page_dma[PS_PAGE_BUFFERS]; };
|
||||
|
@ -198,12 +188,7 @@ struct e1000_tx_ring {
|
|||
spinlock_t tx_lock;
|
||||
uint16_t tdh;
|
||||
uint16_t tdt;
|
||||
|
||||
boolean_t last_tx_tso;
|
||||
|
||||
#ifdef CONFIG_E1000_MQ
|
||||
struct e1000_queue_stats tx_stats;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct e1000_rx_ring {
|
||||
|
@ -230,9 +215,6 @@ struct e1000_rx_ring {
|
|||
|
||||
uint16_t rdh;
|
||||
uint16_t rdt;
|
||||
#ifdef CONFIG_E1000_MQ
|
||||
struct e1000_queue_stats rx_stats;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define E1000_DESC_UNUSED(R) \
|
||||
|
@ -260,6 +242,7 @@ struct e1000_adapter {
|
|||
uint32_t rx_buffer_len;
|
||||
uint32_t part_num;
|
||||
uint32_t wol;
|
||||
uint32_t ksp3_port_a;
|
||||
uint32_t smartspeed;
|
||||
uint32_t en_mng_pt;
|
||||
uint16_t link_speed;
|
||||
|
@ -269,8 +252,8 @@ struct e1000_adapter {
|
|||
spinlock_t tx_queue_lock;
|
||||
#endif
|
||||
atomic_t irq_sem;
|
||||
struct work_struct tx_timeout_task;
|
||||
struct work_struct watchdog_task;
|
||||
struct work_struct reset_task;
|
||||
uint8_t fc_autoneg;
|
||||
|
||||
struct timer_list blink_timer;
|
||||
|
@ -278,9 +261,6 @@ struct e1000_adapter {
|
|||
|
||||
/* TX */
|
||||
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;
|
||||
uint32_t txd_cmd;
|
||||
uint32_t tx_int_delay;
|
||||
|
@ -301,23 +281,18 @@ struct e1000_adapter {
|
|||
/* RX */
|
||||
#ifdef CONFIG_E1000_NAPI
|
||||
boolean_t (*clean_rx) (struct e1000_adapter *adapter,
|
||||
struct e1000_rx_ring *rx_ring,
|
||||
int *work_done, int work_to_do);
|
||||
struct e1000_rx_ring *rx_ring,
|
||||
int *work_done, int work_to_do);
|
||||
#else
|
||||
boolean_t (*clean_rx) (struct e1000_adapter *adapter,
|
||||
struct e1000_rx_ring *rx_ring);
|
||||
struct e1000_rx_ring *rx_ring);
|
||||
#endif
|
||||
void (*alloc_rx_buf) (struct e1000_adapter *adapter,
|
||||
struct e1000_rx_ring *rx_ring,
|
||||
int cleaned_count);
|
||||
struct e1000_rx_ring *rx_ring,
|
||||
int cleaned_count);
|
||||
struct e1000_rx_ring *rx_ring; /* One per active queue */
|
||||
#ifdef CONFIG_E1000_NAPI
|
||||
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
|
||||
int num_tx_queues;
|
||||
int num_rx_queues;
|
||||
|
@ -353,10 +328,37 @@ struct e1000_adapter {
|
|||
struct e1000_rx_ring test_rx_ring;
|
||||
|
||||
|
||||
u32 *config_space;
|
||||
uint32_t *config_space;
|
||||
int msg_enable;
|
||||
#ifdef CONFIG_PCI_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
|
||||
};
|
||||
|
||||
|
||||
/* 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_ */
|
||||
|
|
|
@ -32,19 +32,6 @@
|
|||
|
||||
#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 {
|
||||
char stat_string[ETH_GSTRING_LEN];
|
||||
int sizeof_stat;
|
||||
|
@ -60,7 +47,6 @@ static const struct e1000_stats e1000_gstrings_stats[] = {
|
|||
{ "tx_bytes", E1000_STAT(net_stats.tx_bytes) },
|
||||
{ "rx_errors", E1000_STAT(net_stats.rx_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) },
|
||||
{ "multicast", E1000_STAT(net_stats.multicast) },
|
||||
{ "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_crc_errors", E1000_STAT(net_stats.rx_crc_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_missed_errors", E1000_STAT(net_stats.rx_missed_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) },
|
||||
};
|
||||
|
||||
#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
|
||||
#endif
|
||||
#define E1000_GLOBAL_STATS_LEN \
|
||||
sizeof(e1000_gstrings_stats) / sizeof(struct e1000_stats)
|
||||
#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;
|
||||
else
|
||||
netdev->features &= ~NETIF_F_TSO;
|
||||
|
||||
DPRINTK(PROBE, INFO, "TSO is %s\n", data ? "Enabled" : "Disabled");
|
||||
adapter->tso_force = TRUE;
|
||||
return 0;
|
||||
}
|
||||
#endif /* NETIF_F_TSO */
|
||||
|
@ -594,6 +575,7 @@ e1000_get_drvinfo(struct net_device *netdev,
|
|||
case e1000_82571:
|
||||
case e1000_82572:
|
||||
case e1000_82573:
|
||||
case e1000_80003es2lan:
|
||||
sprintf(firmware_version, "%d.%d-%d",
|
||||
(eeprom_data & 0xF000) >> 12,
|
||||
(eeprom_data & 0x0FF0) >> 4,
|
||||
|
@ -642,6 +624,9 @@ e1000_set_ringparam(struct net_device *netdev,
|
|||
struct e1000_rx_ring *rxdr, *rx_old, *rx_new;
|
||||
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;
|
||||
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;
|
||||
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 = min(rxdr->count,(uint32_t)(mac_type < e1000_82544 ?
|
||||
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 */
|
||||
case e1000_82571:
|
||||
case e1000_82572:
|
||||
case e1000_80003es2lan:
|
||||
toggle = 0x7FFFF3FF;
|
||||
break;
|
||||
case e1000_82573:
|
||||
|
@ -1256,6 +1239,10 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
|
|||
e1000_write_phy_reg(&adapter->hw, PHY_CTRL, 0x9140);
|
||||
/* autoneg off */
|
||||
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 */
|
||||
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_82572:
|
||||
case e1000_82573:
|
||||
case e1000_80003es2lan:
|
||||
return e1000_integrated_phy_loopback(adapter);
|
||||
break;
|
||||
|
||||
|
@ -1405,6 +1393,11 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)
|
|||
case e1000_82546_rev_3:
|
||||
default:
|
||||
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);
|
||||
if (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_82545EM_FIBER:
|
||||
case E1000_DEV_ID_82545EM_COPPER:
|
||||
case E1000_DEV_ID_82546GB_QUAD_COPPER:
|
||||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
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_82546GB_FIBER:
|
||||
case E1000_DEV_ID_82571EB_FIBER:
|
||||
|
@ -1658,8 +1667,9 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
default:
|
||||
wol->supported = WAKE_UCAST | WAKE_MCAST |
|
||||
WAKE_BCAST | WAKE_MAGIC;
|
||||
|
||||
wol->wolopts = 0;
|
||||
|
||||
do_defaults:
|
||||
if (adapter->wol & E1000_WUFC_EX)
|
||||
wol->wolopts |= WAKE_UCAST;
|
||||
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_82544EI_FIBER:
|
||||
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_COPPER:
|
||||
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_82546GB_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 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;
|
||||
|
||||
e1000_update_stats(adapter);
|
||||
|
@ -1812,29 +1829,12 @@ e1000_get_ethtool_stats(struct net_device *netdev,
|
|||
data[i] = (e1000_gstrings_stats[i].sizeof_stat ==
|
||||
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); */
|
||||
}
|
||||
|
||||
static void
|
||||
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;
|
||||
int i;
|
||||
|
||||
|
@ -1849,20 +1849,6 @@ e1000_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data)
|
|||
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); */
|
||||
break;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -60,6 +60,7 @@ typedef enum {
|
|||
e1000_82571,
|
||||
e1000_82572,
|
||||
e1000_82573,
|
||||
e1000_80003es2lan,
|
||||
e1000_num_macs
|
||||
} e1000_mac_type;
|
||||
|
||||
|
@ -138,6 +139,13 @@ typedef enum {
|
|||
e1000_cable_length_undefined = 0xFF
|
||||
} 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 {
|
||||
e1000_igp_cable_length_10 = 10,
|
||||
e1000_igp_cable_length_20 = 20,
|
||||
|
@ -208,6 +216,7 @@ typedef enum {
|
|||
e1000_phy_m88 = 0,
|
||||
e1000_phy_igp,
|
||||
e1000_phy_igp_2,
|
||||
e1000_phy_gg82563,
|
||||
e1000_phy_undefined = 0xFF
|
||||
} e1000_phy_type;
|
||||
|
||||
|
@ -281,6 +290,7 @@ typedef enum {
|
|||
#define E1000_ERR_MASTER_REQUESTS_PENDING 10
|
||||
#define E1000_ERR_HOST_INTERFACE_COMMAND 11
|
||||
#define E1000_BLK_PHY_RESET 12
|
||||
#define E1000_ERR_SWFW_SYNC 13
|
||||
|
||||
/* Function prototypes */
|
||||
/* 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_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_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 */
|
||||
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_82573L 0x109A
|
||||
#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
|
||||
|
@ -850,6 +864,7 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_TXCW 0x00178 /* TX Configuration Word - RW */
|
||||
#define E1000_RXCW 0x00180 /* RX Configuration Word - RO */
|
||||
#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_TBT 0x00448 /* TX Burst Timer - 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_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_GSCL_1 0x05B10 /* PCI-Ex Statistic Control #1 */
|
||||
#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_MTA 0x00200
|
||||
#define E1000_82542_TCTL E1000_TCTL
|
||||
#define E1000_82542_TCTL_EXT E1000_TCTL_EXT
|
||||
#define E1000_82542_TIPG E1000_TIPG
|
||||
#define E1000_82542_TDBAL 0x00420
|
||||
#define E1000_82542_TDBAH 0x00424
|
||||
|
@ -1212,6 +1233,8 @@ struct e1000_ffvt_entry {
|
|||
#define E1000_82542_RSSRK E1000_RSSRK
|
||||
#define E1000_82542_RSSIM E1000_RSSIM
|
||||
#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 */
|
||||
struct e1000_hw_stats {
|
||||
|
@ -1303,6 +1326,7 @@ struct e1000_hw {
|
|||
e1000_ffe_config ffe_config_state;
|
||||
uint32_t asf_firmware_present;
|
||||
uint32_t eeprom_semaphore_present;
|
||||
uint32_t swfw_sync_present;
|
||||
unsigned long io_base;
|
||||
uint32_t phy_id;
|
||||
uint32_t phy_revision;
|
||||
|
@ -1361,6 +1385,7 @@ struct e1000_hw {
|
|||
boolean_t ifs_params_forced;
|
||||
boolean_t in_ifs_mode;
|
||||
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_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_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_SWDPIN1 0x00080000 /* SWDPIN 1 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_PCIX_MODE 0x00002000 /* PCI-X mode */
|
||||
#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. */
|
||||
#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_GMII 0x00000000
|
||||
#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_256 0x00000000
|
||||
#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_IAME 0x08000000 /* Interrupt acknowledge Auto-mask */
|
||||
#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 */
|
||||
#define E1000_MDIC_DATA_MASK 0x0000FFFF
|
||||
|
@ -1528,6 +1570,32 @@ struct e1000_hw {
|
|||
#define E1000_MDIC_INT_EN 0x20000000
|
||||
#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 */
|
||||
#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F
|
||||
#define E1000_LEDCTL_LED0_MODE_SHIFT 0
|
||||
|
@ -1590,6 +1658,13 @@ struct e1000_hw {
|
|||
#define E1000_ICR_MNG 0x00040000 /* Manageability event */
|
||||
#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_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 */
|
||||
#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_MNG E1000_ICR_MNG /* Manageability event */
|
||||
#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 */
|
||||
#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_MNG E1000_ICR_MNG /* Manageability event */
|
||||
#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 */
|
||||
#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_MNG E1000_ICR_MNG /* Manageability event */
|
||||
#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 */
|
||||
#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_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 */
|
||||
#define E1000_RDT_DELAY 0x0000ffff /* Delay timer (1=1024us) */
|
||||
#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_NRTU 0x02000000 /* No Re-transmit on underrun */
|
||||
#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 */
|
||||
#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_RCV_TCO_EN 0x00020000 /* Receive TCO Packets 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_EN_MAC_ADDR_FILTER 0x00100000 /* Enable MAC address
|
||||
* filtering */
|
||||
|
@ -1962,19 +2067,19 @@ struct e1000_host_command_info {
|
|||
/* PCI-Ex registers */
|
||||
|
||||
/* PCI-Ex Control Register */
|
||||
#define E1000_GCR_RXD_NO_SNOOP 0x00000001
|
||||
#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002
|
||||
#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004
|
||||
#define E1000_GCR_TXD_NO_SNOOP 0x00000008
|
||||
#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010
|
||||
#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020
|
||||
#define E1000_GCR_RXD_NO_SNOOP 0x00000001
|
||||
#define E1000_GCR_RXDSCW_NO_SNOOP 0x00000002
|
||||
#define E1000_GCR_RXDSCR_NO_SNOOP 0x00000004
|
||||
#define E1000_GCR_TXD_NO_SNOOP 0x00000008
|
||||
#define E1000_GCR_TXDSCW_NO_SNOOP 0x00000010
|
||||
#define E1000_GCR_TXDSCR_NO_SNOOP 0x00000020
|
||||
|
||||
#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \
|
||||
E1000_GCR_RXDSCW_NO_SNOOP | \
|
||||
E1000_GCR_RXDSCR_NO_SNOOP | \
|
||||
E1000_GCR TXD_NO_SNOOP | \
|
||||
E1000_GCR_TXDSCW_NO_SNOOP | \
|
||||
E1000_GCR_TXDSCR_NO_SNOOP)
|
||||
#define PCI_EX_NO_SNOOP_ALL (E1000_GCR_RXD_NO_SNOOP | \
|
||||
E1000_GCR_RXDSCW_NO_SNOOP | \
|
||||
E1000_GCR_RXDSCR_NO_SNOOP | \
|
||||
E1000_GCR_TXD_NO_SNOOP | \
|
||||
E1000_GCR_TXDSCW_NO_SNOOP | \
|
||||
E1000_GCR_TXDSCR_NO_SNOOP)
|
||||
|
||||
#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
|
||||
/* Function Active and Power State to MNG */
|
||||
|
@ -2035,12 +2140,14 @@ struct e1000_host_command_info {
|
|||
#define EEPROM_INIT_CONTROL1_REG 0x000A
|
||||
#define EEPROM_INIT_CONTROL2_REG 0x000F
|
||||
#define EEPROM_INIT_CONTROL3_PORT_B 0x0014
|
||||
#define EEPROM_INIT_3GIO_3 0x001A
|
||||
#define EEPROM_INIT_CONTROL3_PORT_A 0x0024
|
||||
#define EEPROM_CFG 0x0012
|
||||
#define EEPROM_FLASH_VERSION 0x0032
|
||||
#define EEPROM_CHECKSUM_REG 0x003F
|
||||
|
||||
#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 */
|
||||
#define ID_LED_RESERVED_0000 0x0000
|
||||
|
@ -2084,6 +2191,9 @@ struct e1000_host_command_info {
|
|||
#define EEPROM_WORD0F_ANE 0x0800
|
||||
#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. */
|
||||
#define EEPROM_SUM 0xBABA
|
||||
|
||||
|
@ -2126,8 +2236,11 @@ struct e1000_host_command_info {
|
|||
|
||||
#define DEFAULT_82542_TIPG_IPGR2 10
|
||||
#define DEFAULT_82543_TIPG_IPGR2 6
|
||||
#define DEFAULT_80003ES2LAN_TIPG_IPGR2 7
|
||||
#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
|
||||
|
||||
/* Adaptive IFS defines */
|
||||
|
@ -2368,6 +2481,78 @@ struct e1000_host_command_info {
|
|||
|
||||
#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 */
|
||||
#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_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. */
|
||||
/* I = Integrated
|
||||
|
@ -2695,6 +2987,7 @@ struct e1000_host_command_info {
|
|||
#define M88E1011_I_REV_4 0x04
|
||||
#define M88E1111_I_PHY_ID 0x01410CC0
|
||||
#define L1LXT971A_PHY_ID 0x001378E0
|
||||
#define GG82563_E_PHY_ID 0x01410CA0
|
||||
|
||||
/* Miscellaneous PHY bit definitions. */
|
||||
#define PHY_PREAMBLE 0xFFFFFFFF
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -268,7 +268,7 @@ e1000_validate_option(int *value, struct e1000_option *opt,
|
|||
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);
|
||||
*value = opt->def;
|
||||
return -1;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
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: $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, };
|
||||
|
||||
/* PHY media interface chips. */
|
||||
static const char *phys[] = {
|
||||
static const char * const phys[] = {
|
||||
"None", "i82553-A/B", "i82553-C", "i82503",
|
||||
"DP83840", "80c240", "80c24", "i82555",
|
||||
"unknown-8", "unknown-9", "DP83840A", "unknown-11",
|
||||
|
|
|
@ -225,7 +225,7 @@ struct epic_chip_info {
|
|||
|
||||
|
||||
/* 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",
|
||||
EPIC_IOTYPE, EPIC_TOTAL_SIZE, TYPE2_INTR | NO_MII | MII_PWRDWN },
|
||||
{ "SMSC EPIC/100 83c170",
|
||||
|
@ -291,7 +291,7 @@ enum CommandBits {
|
|||
RxDone | RxStarted | RxEarlyWarn | RxOverflow | RxFull)
|
||||
#define EpicNormalEvent (0x0000ffff & ~EpicNapiEvent)
|
||||
|
||||
static u16 media2miictl[16] = {
|
||||
static const u16 media2miictl[16] = {
|
||||
0, 0x0C00, 0x0C00, 0x2000, 0x0100, 0x2100, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
|
|
|
@ -161,6 +161,7 @@ static char *version =
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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)
|
||||
{
|
||||
int starttime;
|
||||
unsigned long starttime;
|
||||
|
||||
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);
|
||||
|
||||
while( (inb(ioaddr + TX_STATUS_REG) & 0x80) == 0) {
|
||||
if( (jiffies - starttime) > TX_TIMEOUT) {
|
||||
if( time_after(jiffies, starttime + TX_TIMEOUT)) {
|
||||
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)
|
||||
{
|
||||
int starttime;
|
||||
unsigned long starttime;
|
||||
|
||||
starttime = jiffies;
|
||||
|
||||
while((inb(ioaddr + TX_STATUS_REG) & 0x20) == 0) {
|
||||
if( (jiffies - starttime) > TX_TIMEOUT) {
|
||||
if( time_after(jiffies, starttime + TX_TIMEOUT)) {
|
||||
|
||||
if(eth16i_debug > 1)
|
||||
printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
|
||||
starttime = jiffies;
|
||||
while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
|
||||
if( (jiffies - starttime) > TX_TIMEOUT) {
|
||||
if( time_after(jiffies, starttime + TX_TIMEOUT)) {
|
||||
if(eth16i_debug > 1)
|
||||
printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
|
||||
return -1;
|
||||
|
|
|
@ -160,7 +160,7 @@ struct chip_info {
|
|||
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_CHIP_XCVR},
|
||||
{"1000/100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR},
|
||||
|
|
|
@ -102,6 +102,9 @@
|
|||
* 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan.
|
||||
* 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single
|
||||
* 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:
|
||||
* 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
|
||||
* superfluous timer interrupts from the nic.
|
||||
*/
|
||||
#define FORCEDETH_VERSION "0.49"
|
||||
#define FORCEDETH_VERSION "0.52"
|
||||
#define DRV_NAME "forcedeth"
|
||||
|
||||
#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_HIGH_DMA 0x0008 /* device supports 64bit dma */
|
||||
#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 {
|
||||
NvRegIrqStatus = 0x000,
|
||||
|
@ -166,14 +172,17 @@ enum {
|
|||
#define NVREG_IRQ_TX_OK 0x0010
|
||||
#define NVREG_IRQ_TIMER 0x0020
|
||||
#define NVREG_IRQ_LINK 0x0040
|
||||
#define NVREG_IRQ_TX_ERROR 0x0080
|
||||
#define NVREG_IRQ_TX1 0x0100
|
||||
#define NVREG_IRQ_RX_FORCED 0x0080
|
||||
#define NVREG_IRQ_TX_FORCED 0x0100
|
||||
#define NVREG_IRQMASK_THROUGHPUT 0x00df
|
||||
#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| \
|
||||
NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \
|
||||
NVREG_IRQ_TX1))
|
||||
NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_RX_FORCED| \
|
||||
NVREG_IRQ_TX_FORCED))
|
||||
|
||||
NvRegUnknownSetupReg6 = 0x008,
|
||||
#define NVREG_UNKSETUP6_VAL 3
|
||||
|
@ -185,6 +194,10 @@ enum {
|
|||
NvRegPollingInterval = 0x00c,
|
||||
#define NVREG_POLL_DEFAULT_THROUGHPUT 970
|
||||
#define NVREG_POLL_DEFAULT_CPU 13
|
||||
NvRegMSIMap0 = 0x020,
|
||||
NvRegMSIMap1 = 0x024,
|
||||
NvRegMSIIrqMask = 0x030,
|
||||
#define NVREG_MSI_VECTOR_0_ENABLED 0x01
|
||||
NvRegMisc1 = 0x080,
|
||||
#define NVREG_MISC1_HD 0x02
|
||||
#define NVREG_MISC1_FORCE 0x3b0f3c
|
||||
|
@ -254,6 +267,10 @@ enum {
|
|||
#define NVREG_TXRXCTL_DESC_1 0
|
||||
#define NVREG_TXRXCTL_DESC_2 0x02100
|
||||
#define NVREG_TXRXCTL_DESC_3 0x02200
|
||||
#define NVREG_TXRXCTL_VLANSTRIP 0x00040
|
||||
#define NVREG_TXRXCTL_VLANINS 0x00080
|
||||
NvRegTxRingPhysAddrHigh = 0x148,
|
||||
NvRegRxRingPhysAddrHigh = 0x14C,
|
||||
NvRegMIIStatus = 0x180,
|
||||
#define NVREG_MIISTAT_ERROR 0x0001
|
||||
#define NVREG_MIISTAT_LINKCHANGE 0x0008
|
||||
|
@ -303,6 +320,11 @@ enum {
|
|||
#define NVREG_POWERSTATE_D1 0x0001
|
||||
#define NVREG_POWERSTATE_D2 0x0002
|
||||
#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 */
|
||||
|
@ -314,7 +336,7 @@ struct ring_desc {
|
|||
struct ring_desc_ex {
|
||||
u32 PacketBufferHigh;
|
||||
u32 PacketBufferLow;
|
||||
u32 Reserved;
|
||||
u32 TxVlan;
|
||||
u32 FlagLen;
|
||||
};
|
||||
|
||||
|
@ -355,6 +377,8 @@ typedef union _ring_type {
|
|||
#define NV_TX2_CHECKSUM_L3 (1<<27)
|
||||
#define NV_TX2_CHECKSUM_L4 (1<<26)
|
||||
|
||||
#define NV_TX3_VLAN_TAG_PRESENT (1<<18)
|
||||
|
||||
#define NV_RX_DESCRIPTORVALID (1<<16)
|
||||
#define NV_RX_MISSEDFRAME (1<<17)
|
||||
#define NV_RX_SUBSTRACT1 (1<<18)
|
||||
|
@ -385,6 +409,9 @@ typedef union _ring_type {
|
|||
#define NV_RX2_ERROR (1<<30)
|
||||
#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: */
|
||||
#define NV_PCI_REGSZ 0x270
|
||||
|
||||
|
@ -475,6 +502,18 @@ typedef union _ring_type {
|
|||
#define LPA_1000FULL 0x0800
|
||||
#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:
|
||||
|
@ -511,6 +550,7 @@ struct fe_priv {
|
|||
u32 irqmask;
|
||||
u32 desc_ver;
|
||||
u32 txrxctl_bits;
|
||||
u32 vlanctl_bits;
|
||||
|
||||
void __iomem *base;
|
||||
|
||||
|
@ -525,6 +565,7 @@ struct fe_priv {
|
|||
unsigned int pkt_limit;
|
||||
struct timer_list oom_kick;
|
||||
struct timer_list nic_poll;
|
||||
u32 nic_poll_irq;
|
||||
|
||||
/* media detection workaround.
|
||||
* 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];
|
||||
unsigned int tx_dma_len[TX_RING];
|
||||
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;
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
return netdev_priv(dev);
|
||||
|
@ -612,6 +670,33 @@ static int reg_delay(struct net_device *dev, int offset, u32 mask, u32 target,
|
|||
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)
|
||||
/* 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 fe_priv *np = netdev_priv(dev);
|
||||
|
||||
disable_irq(dev->irq);
|
||||
|
||||
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);
|
||||
} else {
|
||||
disable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
|
||||
}
|
||||
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);
|
||||
}
|
||||
enable_irq(dev->irq);
|
||||
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);
|
||||
} else {
|
||||
enable_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector);
|
||||
}
|
||||
}
|
||||
|
||||
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]) {
|
||||
dev_kfree_skb_irq(np->tx_skbuff[skbnr]);
|
||||
dev_kfree_skb_any(np->tx_skbuff[skbnr]);
|
||||
np->tx_skbuff[skbnr] = NULL;
|
||||
return 1;
|
||||
} else {
|
||||
|
@ -1031,6 +1129,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
u32 bcnt;
|
||||
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 tx_flags_vlan = 0;
|
||||
|
||||
/* add fragments to entries count */
|
||||
for (i = 0; i < fragments; i++) {
|
||||
|
@ -1111,10 +1210,16 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
#endif
|
||||
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 */
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
|
||||
|
@ -1209,9 +1314,14 @@ static void nv_tx_timeout(struct net_device *dev)
|
|||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u8 __iomem *base = get_hwbase(dev);
|
||||
u32 status;
|
||||
|
||||
printk(KERN_INFO "%s: Got tx_timeout. irq: %08x\n", dev->name,
|
||||
readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK);
|
||||
if (np->msi_flags & NV_MSI_X_ENABLED)
|
||||
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;
|
||||
|
@ -1273,10 +1383,7 @@ static void nv_tx_timeout(struct net_device *dev)
|
|||
printk(KERN_DEBUG "%s: tx_timeout: dead entries!\n", dev->name);
|
||||
nv_drain_tx(dev);
|
||||
np->next_tx = np->nic_tx = 0;
|
||||
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);
|
||||
setup_hw_rings(dev, NV_SETUP_TX_RING);
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
|
||||
|
@ -1342,6 +1449,8 @@ static void nv_rx_process(struct net_device *dev)
|
|||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u32 Flags;
|
||||
u32 vlanflags = 0;
|
||||
|
||||
|
||||
for (;;) {
|
||||
struct sk_buff *skb;
|
||||
|
@ -1357,6 +1466,7 @@ static void nv_rx_process(struct net_device *dev)
|
|||
} else {
|
||||
Flags = le32_to_cpu(np->rx_ring.ex[i].FlagLen);
|
||||
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",
|
||||
|
@ -1474,7 +1584,11 @@ static void nv_rx_process(struct net_device *dev)
|
|||
skb->protocol = eth_type_trans(skb, dev);
|
||||
dprintk(KERN_DEBUG "%s: nv_rx_process: packet %d with %d bytes, proto %d accepted.\n",
|
||||
dev->name, np->cur_rx, len, skb->protocol);
|
||||
netif_rx(skb);
|
||||
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);
|
||||
}
|
||||
dev->last_rx = jiffies;
|
||||
np->stats.rx_packets++;
|
||||
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.
|
||||
* Changing the MTU is a rare event, it shouldn't matter.
|
||||
*/
|
||||
disable_irq(dev->irq);
|
||||
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);
|
||||
} 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(&np->lock);
|
||||
/* 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 */
|
||||
writel(np->rx_buf_sz, base + NvRegOffloadConfig);
|
||||
writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr);
|
||||
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);
|
||||
setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING);
|
||||
writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
|
||||
base + NvRegRingSizes);
|
||||
pci_push(base);
|
||||
|
@ -1560,7 +1678,15 @@ static int nv_change_mtu(struct net_device *dev, int new_mtu)
|
|||
nv_start_tx(dev);
|
||||
spin_unlock(&np->lock);
|
||||
spin_unlock_bh(&dev->xmit_lock);
|
||||
enable_irq(dev->irq);
|
||||
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);
|
||||
} 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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
for (i=0; ; i++) {
|
||||
events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
|
||||
writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
|
||||
if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
|
||||
events = readl(base + NvRegIrqStatus) & NVREG_IRQSTAT_MASK;
|
||||
writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
|
||||
} else {
|
||||
events = readl(base + NvRegMSIXIrqStatus) & NVREG_IRQSTAT_MASK;
|
||||
writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
|
||||
}
|
||||
pci_push(base);
|
||||
dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, events);
|
||||
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) {
|
||||
spin_lock(&np->lock);
|
||||
/* disable interrupts on the nic */
|
||||
writel(0, base + NvRegIrqMask);
|
||||
if (!(np->msi_flags & NV_MSI_X_ENABLED))
|
||||
writel(0, base + NvRegIrqMask);
|
||||
else
|
||||
writel(np->irqmask, base + NvRegIrqMask);
|
||||
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);
|
||||
}
|
||||
printk(KERN_DEBUG "%s: too many iterations (%d) in nv_nic_irq.\n", dev->name, i);
|
||||
spin_unlock(&np->lock);
|
||||
break;
|
||||
|
@ -1923,22 +2059,212 @@ static irqreturn_t nv_nic_irq(int foo, void *data, struct pt_regs *regs)
|
|||
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)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *) data;
|
||||
struct fe_priv *np = netdev_priv(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
|
||||
* 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);
|
||||
nv_nic_irq((int) 0, (void *) data, (struct pt_regs *) NULL);
|
||||
enable_irq(dev->irq);
|
||||
|
||||
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);
|
||||
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
|
||||
|
@ -2217,11 +2543,66 @@ static struct ethtool_ops ops = {
|
|||
.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)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u8 __iomem *base = get_hwbase(dev);
|
||||
int ret, oom, i;
|
||||
int ret = 1;
|
||||
int oom, i;
|
||||
|
||||
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);
|
||||
|
||||
/* 4) give hw rings */
|
||||
writel((u32) np->ring_addr, base + NvRegRxRingPhysAddr);
|
||||
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);
|
||||
setup_hw_rings(dev, NV_SETUP_RX_RING | NV_SETUP_TX_RING);
|
||||
writel( ((RX_RING-1) << NVREG_RINGSZ_RXSHIFT) + ((TX_RING-1) << NVREG_RINGSZ_TXSHIFT),
|
||||
base + NvRegRingSizes);
|
||||
|
||||
|
@ -2265,6 +2642,7 @@ static int nv_open(struct net_device *dev)
|
|||
writel(np->linkspeed, base + NvRegLinkSpeed);
|
||||
writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3);
|
||||
writel(np->txrxctl_bits, base + NvRegTxRxControl);
|
||||
writel(np->vlanctl_bits, base + NvRegVlanControl);
|
||||
pci_push(base);
|
||||
writel(NVREG_TXRXCTL_BIT1|np->txrxctl_bits, base + NvRegTxRxControl);
|
||||
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);
|
||||
pci_push(base);
|
||||
|
||||
ret = request_irq(dev->irq, &nv_nic_irq, SA_SHIRQ, dev->name, dev);
|
||||
if (ret)
|
||||
goto out_drain;
|
||||
if (np->msi_flags & NV_MSI_X_CAPABLE) {
|
||||
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;
|
||||
}
|
||||
/* 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 */
|
||||
writel(np->irqmask, base + NvRegIrqMask);
|
||||
|
@ -2364,6 +2810,7 @@ static int nv_close(struct net_device *dev)
|
|||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u8 __iomem *base;
|
||||
int i;
|
||||
|
||||
spin_lock_irq(&np->lock);
|
||||
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 */
|
||||
base = get_hwbase(dev);
|
||||
writel(0, base + NvRegIrqMask);
|
||||
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);
|
||||
}
|
||||
pci_push(base);
|
||||
dprintk(KERN_INFO "%s: Irqmask is zero again\n", dev->name);
|
||||
|
||||
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);
|
||||
|
||||
|
@ -2471,7 +2936,14 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
printk(KERN_INFO "forcedeth: 64-bit DMA failed, using 32-bit addressing for device %s.\n",
|
||||
pci_name(pci_dev));
|
||||
} else {
|
||||
dev->features |= NETIF_F_HIGHDMA;
|
||||
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 {
|
||||
dev->features |= NETIF_F_HIGHDMA;
|
||||
printk(KERN_INFO "forcedeth: using HIGHDMA\n");
|
||||
}
|
||||
}
|
||||
np->txrxctl_bits = NVREG_TXRXCTL_DESC_3;
|
||||
} 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
|
||||
}
|
||||
|
||||
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;
|
||||
np->base = ioremap(addr, NV_PCI_REGSZ);
|
||||
if (!np->base)
|
||||
|
@ -2578,10 +3066,15 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
} else {
|
||||
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;
|
||||
else
|
||||
if (np->msi_flags & NV_MSI_X_CAPABLE) /* set number of vectors */
|
||||
np->msi_flags |= 0x0003;
|
||||
} else {
|
||||
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)
|
||||
np->irqmask |= NVREG_IRQ_TIMER;
|
||||
|
@ -2737,11 +3230,11 @@ static struct pci_device_id pci_tbl[] = {
|
|||
},
|
||||
{ /* MCP55 Ethernet Controller */
|
||||
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 */
|
||||
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,},
|
||||
};
|
||||
|
@ -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_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_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_DESCRIPTION("Reverse Engineered nForce ethernet driver");
|
||||
|
|
|
@ -427,7 +427,7 @@ that case.
|
|||
static void hamachi_timer(unsigned long data);
|
||||
|
||||
enum capability_flags {CanHaveMII=1, };
|
||||
static struct chip_info {
|
||||
static const struct chip_info {
|
||||
u16 vendor_id, device_id, device_id_mask, pad;
|
||||
const char *name;
|
||||
void (*media_timer)(unsigned long data);
|
||||
|
|
|
@ -905,7 +905,7 @@ static int epp_open(struct net_device *dev)
|
|||
/* autoprobe baud rate */
|
||||
tstart = jiffies;
|
||||
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)
|
||||
goto epptimeout;
|
||||
if ((stat & (EPP_NRAEF|EPP_NRHF)) == EPP_NRHF) {
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.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);
|
||||
#endif
|
||||
/* not waited long enough since last tx? */
|
||||
if (jiffies - dev->trans_start < HZ)
|
||||
if (time_before(jiffies, dev->trans_start + HZ))
|
||||
return -EAGAIN;
|
||||
|
||||
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);
|
||||
#endif
|
||||
/* 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
|
||||
printk("hp100: %s: trans_start timing problem\n",
|
||||
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 */
|
||||
|
||||
if (lp->mode == 2) { /* memory mapped */
|
||||
if (lp->mem_ptr_virt) { /* high pci memory was remapped */
|
||||
/* Note: The J2585B needs alignment to 32bits here! */
|
||||
memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
|
||||
if (!ok_flag)
|
||||
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);
|
||||
}
|
||||
/* Note: The J2585B needs alignment to 32bits here! */
|
||||
memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
|
||||
if (!ok_flag)
|
||||
memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
|
||||
} else { /* programmed i/o */
|
||||
outsl(ioaddr + HP100_REG_DATA32, skb->data,
|
||||
(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 */
|
||||
/* actual length of the received packet. */
|
||||
if (lp->mode == 2) { /* memory mapped mode */
|
||||
if (lp->mem_ptr_virt) /* if memory was remapped */
|
||||
header = readl(lp->mem_ptr_virt);
|
||||
else
|
||||
header = isa_readl(lp->mem_ptr_phys);
|
||||
header = readl(lp->mem_ptr_virt);
|
||||
} else /* programmed i/o */
|
||||
header = hp100_inl(DATA32);
|
||||
|
||||
|
@ -1833,13 +1824,9 @@ static void hp100_rx(struct net_device *dev)
|
|||
ptr = skb->data;
|
||||
|
||||
/* Now transfer the data from the card into that area */
|
||||
if (lp->mode == 2) {
|
||||
if (lp->mem_ptr_virt)
|
||||
memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
|
||||
/* Note alignment to 32bit transfers */
|
||||
else
|
||||
isa_memcpy_fromio(ptr, lp->mem_ptr_phys, pkt_len);
|
||||
} else /* io mapped */
|
||||
if (lp->mode == 2)
|
||||
memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
|
||||
else /* io mapped */
|
||||
insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
|
||||
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
|
|
@ -204,7 +204,7 @@ static inline int emac_phy_gpcs(int phy_mode)
|
|||
|
||||
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;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
unsigned long flags;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
unsigned long flags;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
unsigned long flags;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
unsigned long flags;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
unsigned long flags;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
u16 gaht[4] = { 0 };
|
||||
struct dev_mc_list *dmi;
|
||||
|
||||
|
@ -393,7 +393,7 @@ static inline int emac_opb_mhz(void)
|
|||
/* BHs disabled */
|
||||
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;
|
||||
int gige;
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
u32 r;
|
||||
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,
|
||||
u16 val)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
int n;
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
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,
|
||||
int flags)
|
||||
gfp_t flags)
|
||||
{
|
||||
struct sk_buff *skb = alloc_skb(dev->rx_skb_size, flags);
|
||||
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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
struct net_device *ndev = dev->ndev;
|
||||
|
||||
/* 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)
|
||||
{
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
ocp_set_drvdata(ocpdev, 0);
|
||||
ocp_set_drvdata(ocpdev, NULL);
|
||||
unregister_netdev(dev->ndev);
|
||||
|
||||
tah_fini(dev->tah_dev);
|
||||
rgmii_fini(dev->rgmii_dev, dev->rgmii_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);
|
||||
iounmap((void *)dev->emacp);
|
||||
iounmap(dev->emacp);
|
||||
kfree(dev->ndev);
|
||||
}
|
||||
|
||||
|
@ -2048,9 +2048,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
|
|||
goto out4;
|
||||
|
||||
/* Map EMAC regs */
|
||||
dev->emacp =
|
||||
(struct emac_regs *)ioremap(dev->def->paddr,
|
||||
sizeof(struct emac_regs));
|
||||
dev->emacp = ioremap(dev->def->paddr, sizeof(struct emac_regs));
|
||||
if (!dev->emacp) {
|
||||
printk(KERN_ERR "emac%d: could not ioremap device registers!\n",
|
||||
dev->def->index);
|
||||
|
@ -2210,7 +2208,7 @@ static int __init emac_probe(struct ocp_device *ocpdev)
|
|||
|
||||
return 0;
|
||||
out6:
|
||||
iounmap((void *)dev->emacp);
|
||||
iounmap(dev->emacp);
|
||||
out5:
|
||||
tah_fini(dev->tah_dev);
|
||||
out4:
|
||||
|
|
|
@ -155,7 +155,7 @@ struct ibm_emac_error_stats {
|
|||
|
||||
struct ocp_enet_private {
|
||||
struct net_device *ndev; /* 0 */
|
||||
struct emac_regs *emacp;
|
||||
struct emac_regs __iomem *emacp;
|
||||
|
||||
struct mal_descriptor *tx_desc;
|
||||
int tx_cnt;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct emac_regs *p = dev->emacp;
|
||||
struct emac_regs __iomem *p = dev->emacp;
|
||||
|
||||
printk("** EMAC%d registers **\n"
|
||||
"MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n"
|
||||
|
|
|
@ -31,7 +31,7 @@ struct rgmii_regs {
|
|||
|
||||
/* RGMII device */
|
||||
struct ibm_ocp_rgmii {
|
||||
struct rgmii_regs *base;
|
||||
struct rgmii_regs __iomem *base;
|
||||
int users; /* number of EMACs using this RGMII bridge */
|
||||
};
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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);
|
||||
|
||||
|
@ -94,8 +94,7 @@ static int __init zmii_init(struct ocp_device *ocpdev, int input, int *mode)
|
|||
}
|
||||
dev->mode = PHY_MODE_NA;
|
||||
|
||||
p = (struct zmii_regs *)ioremap(ocpdev->def->paddr,
|
||||
sizeof(struct zmii_regs));
|
||||
p = ioremap(ocpdev->def->paddr, sizeof(struct zmii_regs));
|
||||
if (!p) {
|
||||
printk(KERN_ERR
|
||||
"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) {
|
||||
/* Free everything if this is the last user */
|
||||
ocp_set_drvdata(ocpdev, NULL);
|
||||
iounmap((void *)dev->base);
|
||||
iounmap(dev->base);
|
||||
kfree(dev);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ struct zmii_regs {
|
|||
|
||||
/* ZMII device */
|
||||
struct ibm_ocp_zmii {
|
||||
struct zmii_regs *base;
|
||||
struct zmii_regs __iomem *base;
|
||||
int mode; /* subset of PHY_MODE_XXXX */
|
||||
int users; /* number of EMACs using this ZMII bridge */
|
||||
u32 fer_save; /* FER value left by firmware */
|
||||
|
|
|
@ -283,7 +283,7 @@ config USB_IRDA
|
|||
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
|
||||
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
|
||||
support SIR and FIR (4Mbps) speeds. On the other hand, those
|
||||
dongles tend to be less efficient than a FIR chipset.
|
||||
|
@ -360,7 +360,7 @@ config ALI_FIR
|
|||
help
|
||||
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,
|
||||
M1535, M1535D, M1535+, M1535D Sourth Bridge. This driver supports
|
||||
M1535, M1535D, M1535+, M1535D South Bridge. This driver supports
|
||||
SIR, MIR and FIR (4Mbps) speeds.
|
||||
|
||||
To compile it as a module, choose M here: the module will be called
|
||||
|
|
|
@ -622,7 +622,7 @@ static int __init mac_sonic_init_module(void)
|
|||
return 0;
|
||||
|
||||
out_unregister:
|
||||
driver_unregister(&mac_sonic_driver);
|
||||
platform_driver_unregister(&mac_sonic_driver);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5,53 +5,16 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/mii.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
|
||||
* fails if previous packet sent did not use hw csum
|
||||
*/
|
||||
#define MV643XX_CHECKSUM_OFFLOAD_TX
|
||||
#define MV643XX_NAPI
|
||||
#define MV643XX_TX_FAST_REFILL
|
||||
#undef MV643XX_RX_QUEUE_FILL_ON_TASK /* Does not work, yet */
|
||||
#undef MV643XX_COAL
|
||||
|
||||
/*
|
||||
|
@ -73,25 +36,40 @@
|
|||
#define MV643XX_RX_COAL 100
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The second part is the low level driver of the gigE ethernet ports.
|
||||
*/
|
||||
#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
|
||||
#define MAX_DESCS_PER_SKB (MAX_SKB_FRAGS + 1)
|
||||
#else
|
||||
#define MAX_DESCS_PER_SKB 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Header File for : MV-643xx network interface header
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* This header file contains macros typedefs and function declaration for
|
||||
* the Marvell Gig Bit Ethernet Controller.
|
||||
*
|
||||
* DEPENDENCIES:
|
||||
* None.
|
||||
*
|
||||
*/
|
||||
#define ETH_VLAN_HLEN 4
|
||||
#define ETH_FCS_LEN 4
|
||||
#define ETH_DMA_ALIGN 8 /* hw requires 8-byte alignment */
|
||||
#define ETH_HW_IP_ALIGN 2 /* hw aligns IP header */
|
||||
#define ETH_WRAPPER_LEN (ETH_HW_IP_ALIGN + ETH_HLEN + \
|
||||
ETH_VLAN_HLEN + ETH_FCS_LEN)
|
||||
#define ETH_RX_SKB_SIZE ((dev->mtu + ETH_WRAPPER_LEN + 7) & ~0x7)
|
||||
|
||||
/* MAC accepet/reject macros */
|
||||
#define ACCEPT_MAC_ADDR 0
|
||||
#define REJECT_MAC_ADDR 1
|
||||
#define ETH_RX_QUEUES_ENABLED (1 << 0) /* use only Q0 for receive */
|
||||
#define ETH_TX_QUEUES_ENABLED (1 << 0) /* use only Q0 for transmit */
|
||||
|
||||
#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 */
|
||||
#define RX_BUF_OFFSET 0x2
|
||||
|
@ -133,88 +111,71 @@
|
|||
#define ETH_MIB_LATE_COLLISION 0x7c
|
||||
|
||||
/* Port serial status reg (PSR) */
|
||||
#define ETH_INTERFACE_GMII_MII 0
|
||||
#define ETH_INTERFACE_PCM BIT0
|
||||
#define ETH_LINK_IS_DOWN 0
|
||||
#define ETH_LINK_IS_UP BIT1
|
||||
#define ETH_PORT_AT_HALF_DUPLEX 0
|
||||
#define ETH_PORT_AT_FULL_DUPLEX BIT2
|
||||
#define ETH_RX_FLOW_CTRL_DISABLED 0
|
||||
#define ETH_RX_FLOW_CTRL_ENBALED BIT3
|
||||
#define ETH_GMII_SPEED_100_10 0
|
||||
#define ETH_GMII_SPEED_1000 BIT4
|
||||
#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)
|
||||
#define ETH_INTERFACE_PCM 0x00000001
|
||||
#define ETH_LINK_IS_UP 0x00000002
|
||||
#define ETH_PORT_AT_FULL_DUPLEX 0x00000004
|
||||
#define ETH_RX_FLOW_CTRL_ENABLED 0x00000008
|
||||
#define ETH_GMII_SPEED_1000 0x00000010
|
||||
#define ETH_MII_SPEED_100 0x00000020
|
||||
#define ETH_TX_IN_PROGRESS 0x00000080
|
||||
#define ETH_BYPASS_ACTIVE 0x00000100
|
||||
#define ETH_PORT_AT_PARTITION_STATE 0x00000200
|
||||
#define ETH_PORT_TX_FIFO_EMPTY 0x00000400
|
||||
|
||||
/* SMI reg */
|
||||
#define ETH_SMI_BUSY BIT28 /* 0 - Write, 1 - Read */
|
||||
#define ETH_SMI_READ_VALID BIT27 /* 0 - Write, 1 - Read */
|
||||
#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read operation */
|
||||
#define ETH_SMI_OPCODE_READ BIT26 /* Operation is in progress */
|
||||
#define ETH_SMI_BUSY 0x10000000 /* 0 - Write, 1 - Read */
|
||||
#define ETH_SMI_READ_VALID 0x08000000 /* 0 - Write, 1 - Read */
|
||||
#define ETH_SMI_OPCODE_WRITE 0 /* Completion of Read */
|
||||
#define ETH_SMI_OPCODE_READ 0x04000000 /* Operation is in progress */
|
||||
|
||||
/* Interrupt Cause Register Bit Definitions */
|
||||
|
||||
/* SDMA command status fields macros */
|
||||
|
||||
/* Tx & Rx descriptors status */
|
||||
#define ETH_ERROR_SUMMARY (BIT0)
|
||||
#define ETH_ERROR_SUMMARY 0x00000001
|
||||
|
||||
/* Tx & Rx descriptors command */
|
||||
#define ETH_BUFFER_OWNED_BY_DMA (BIT31)
|
||||
#define ETH_BUFFER_OWNED_BY_DMA 0x80000000
|
||||
|
||||
/* Tx descriptors status */
|
||||
#define ETH_LC_ERROR (0 )
|
||||
#define ETH_UR_ERROR (BIT1 )
|
||||
#define ETH_RL_ERROR (BIT2 )
|
||||
#define ETH_LLC_SNAP_FORMAT (BIT9 )
|
||||
#define ETH_LC_ERROR 0
|
||||
#define ETH_UR_ERROR 0x00000002
|
||||
#define ETH_RL_ERROR 0x00000004
|
||||
#define ETH_LLC_SNAP_FORMAT 0x00000200
|
||||
|
||||
/* Rx descriptors status */
|
||||
#define ETH_CRC_ERROR (0 )
|
||||
#define ETH_OVERRUN_ERROR (BIT1 )
|
||||
#define ETH_MAX_FRAME_LENGTH_ERROR (BIT2 )
|
||||
#define ETH_RESOURCE_ERROR ((BIT2 | BIT1))
|
||||
#define ETH_VLAN_TAGGED (BIT19)
|
||||
#define ETH_BPDU_FRAME (BIT20)
|
||||
#define ETH_TCP_FRAME_OVER_IP_V_4 (0 )
|
||||
#define ETH_UDP_FRAME_OVER_IP_V_4 (BIT21)
|
||||
#define ETH_OTHER_FRAME_TYPE (BIT22)
|
||||
#define ETH_LAYER_2_IS_ETH_V_2 (BIT23)
|
||||
#define ETH_FRAME_TYPE_IP_V_4 (BIT24)
|
||||
#define ETH_FRAME_HEADER_OK (BIT25)
|
||||
#define ETH_RX_LAST_DESC (BIT26)
|
||||
#define ETH_RX_FIRST_DESC (BIT27)
|
||||
#define ETH_UNKNOWN_DESTINATION_ADDR (BIT28)
|
||||
#define ETH_RX_ENABLE_INTERRUPT (BIT29)
|
||||
#define ETH_LAYER_4_CHECKSUM_OK (BIT30)
|
||||
#define ETH_OVERRUN_ERROR 0x00000002
|
||||
#define ETH_MAX_FRAME_LENGTH_ERROR 0x00000004
|
||||
#define ETH_RESOURCE_ERROR 0x00000006
|
||||
#define ETH_VLAN_TAGGED 0x00080000
|
||||
#define ETH_BPDU_FRAME 0x00100000
|
||||
#define ETH_UDP_FRAME_OVER_IP_V_4 0x00200000
|
||||
#define ETH_OTHER_FRAME_TYPE 0x00400000
|
||||
#define ETH_LAYER_2_IS_ETH_V_2 0x00800000
|
||||
#define ETH_FRAME_TYPE_IP_V_4 0x01000000
|
||||
#define ETH_FRAME_HEADER_OK 0x02000000
|
||||
#define ETH_RX_LAST_DESC 0x04000000
|
||||
#define ETH_RX_FIRST_DESC 0x08000000
|
||||
#define ETH_UNKNOWN_DESTINATION_ADDR 0x10000000
|
||||
#define ETH_RX_ENABLE_INTERRUPT 0x20000000
|
||||
#define ETH_LAYER_4_CHECKSUM_OK 0x40000000
|
||||
|
||||
/* Rx descriptors byte count */
|
||||
#define ETH_FRAME_FRAGMENTED (BIT2)
|
||||
#define ETH_FRAME_FRAGMENTED 0x00000004
|
||||
|
||||
/* Tx descriptors command */
|
||||
#define ETH_LAYER_4_CHECKSUM_FIRST_DESC (BIT10)
|
||||
#define ETH_FRAME_SET_TO_VLAN (BIT15)
|
||||
#define ETH_TCP_FRAME (0 )
|
||||
#define ETH_UDP_FRAME (BIT16)
|
||||
#define ETH_GEN_TCP_UDP_CHECKSUM (BIT17)
|
||||
#define ETH_GEN_IP_V_4_CHECKSUM (BIT18)
|
||||
#define ETH_ZERO_PADDING (BIT19)
|
||||
#define ETH_TX_LAST_DESC (BIT20)
|
||||
#define ETH_TX_FIRST_DESC (BIT21)
|
||||
#define ETH_GEN_CRC (BIT22)
|
||||
#define ETH_TX_ENABLE_INTERRUPT (BIT23)
|
||||
#define ETH_AUTO_MODE (BIT30)
|
||||
#define ETH_LAYER_4_CHECKSUM_FIRST_DESC 0x00000400
|
||||
#define ETH_FRAME_SET_TO_VLAN 0x00008000
|
||||
#define ETH_UDP_FRAME 0x00010000
|
||||
#define ETH_GEN_TCP_UDP_CHECKSUM 0x00020000
|
||||
#define ETH_GEN_IP_V_4_CHECKSUM 0x00040000
|
||||
#define ETH_ZERO_PADDING 0x00080000
|
||||
#define ETH_TX_LAST_DESC 0x00100000
|
||||
#define ETH_TX_FIRST_DESC 0x00200000
|
||||
#define ETH_GEN_CRC 0x00400000
|
||||
#define ETH_TX_ENABLE_INTERRUPT 0x00800000
|
||||
#define ETH_AUTO_MODE 0x40000000
|
||||
|
||||
#define ETH_TX_IHL_SHIFT 11
|
||||
|
||||
|
@ -324,13 +285,6 @@ struct mv643xx_mib_counters {
|
|||
|
||||
struct mv643xx_private {
|
||||
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_size; /* Size of rx sram area */
|
||||
|
@ -338,7 +292,6 @@ struct mv643xx_private {
|
|||
u32 tx_sram_size; /* Size of tx sram area */
|
||||
|
||||
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 */
|
||||
|
||||
|
@ -347,10 +300,6 @@ struct mv643xx_private {
|
|||
|
||||
/* Next available and first returning Tx resource */
|
||||
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
|
||||
u32 tx_clean_threshold;
|
||||
|
@ -358,54 +307,43 @@ struct mv643xx_private {
|
|||
|
||||
struct eth_rx_desc *p_rx_desc_area;
|
||||
dma_addr_t rx_desc_dma;
|
||||
unsigned int rx_desc_area_size;
|
||||
int rx_desc_area_size;
|
||||
struct sk_buff **rx_skb;
|
||||
|
||||
struct eth_tx_desc *p_tx_desc_area;
|
||||
dma_addr_t tx_desc_dma;
|
||||
unsigned int tx_desc_area_size;
|
||||
int tx_desc_area_size;
|
||||
struct sk_buff **tx_skb;
|
||||
|
||||
struct work_struct tx_timeout_task;
|
||||
|
||||
/*
|
||||
* Former struct mv643xx_eth_priv members start here
|
||||
*/
|
||||
struct net_device_stats stats;
|
||||
struct mv643xx_mib_counters mib_counters;
|
||||
spinlock_t lock;
|
||||
/* Size of Tx Ring per queue */
|
||||
unsigned int tx_ring_size;
|
||||
/* Ammont of SKBs outstanding on Tx queue */
|
||||
unsigned int tx_ring_skbs;
|
||||
int tx_ring_size;
|
||||
/* Number of tx descriptors in use */
|
||||
int tx_desc_count;
|
||||
/* Size of Rx Ring per queue */
|
||||
unsigned int rx_ring_size;
|
||||
/* Ammount of SKBs allocated to Rx Ring per queue */
|
||||
unsigned int rx_ring_skbs;
|
||||
|
||||
/*
|
||||
* rx_task used to fill RX ring out of bottom half context
|
||||
*/
|
||||
struct work_struct rx_task;
|
||||
int rx_ring_size;
|
||||
/* Number of rx descriptors in use */
|
||||
int rx_desc_count;
|
||||
|
||||
/*
|
||||
* Used in case RX Ring is empty, which can be caused when
|
||||
* system does not have resources (skb's)
|
||||
*/
|
||||
struct timer_list timeout;
|
||||
long rx_task_busy __attribute__ ((aligned(SMP_CACHE_BYTES)));
|
||||
unsigned rx_timer_flag;
|
||||
|
||||
u32 rx_int_coal;
|
||||
u32 tx_int_coal;
|
||||
struct mii_if_info mii;
|
||||
};
|
||||
|
||||
/* ethernet.h API list */
|
||||
|
||||
/* Port operation control routines */
|
||||
static void eth_port_init(struct mv643xx_private *mp);
|
||||
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 */
|
||||
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);
|
||||
|
||||
/* 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,
|
||||
struct pkt_info *p_pkt_info);
|
||||
static ETH_FUNC_RET_STATUS eth_rx_return_buff(struct mv643xx_private *mp,
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
Written/copyright 1999-2001 by Donald Becker.
|
||||
Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.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
|
||||
the GNU General Public License (GPL), incorporated herein by reference.
|
||||
|
@ -135,8 +136,6 @@
|
|||
|
||||
TODO:
|
||||
* big endian support with CFG:BEM instead of cpu_to_le32
|
||||
* support for an external PHY
|
||||
* NAPI
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
|
@ -160,6 +159,7 @@
|
|||
#include <linux/mii.h>
|
||||
#include <linux/crc32.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include <asm/processor.h> /* Processor type for cache alignment. */
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -183,13 +183,11 @@
|
|||
NETIF_MSG_TX_ERR)
|
||||
static int debug = -1;
|
||||
|
||||
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
|
||||
static int max_interrupt_work = 20;
|
||||
static int mtu;
|
||||
|
||||
/* Maximum number of multicast addresses to filter (vs. rx-all-multicast).
|
||||
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.
|
||||
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_LICENSE("GPL");
|
||||
|
||||
module_param(max_interrupt_work, int, 0);
|
||||
module_param(mtu, int, 0);
|
||||
module_param(debug, int, 0);
|
||||
module_param(rx_copybreak, int, 0);
|
||||
module_param_array(options, 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(debug, "DP8381x default debug level");
|
||||
MODULE_PARM_DESC(rx_copybreak,
|
||||
|
@ -374,7 +369,7 @@ enum pcistuff {
|
|||
|
||||
|
||||
/* array of board data directly indexed by pci_tbl[x].driver_data */
|
||||
static struct {
|
||||
static const struct {
|
||||
const char *name;
|
||||
unsigned long flags;
|
||||
} natsemi_pci_info[] __devinitdata = {
|
||||
|
@ -691,6 +686,8 @@ struct netdev_private {
|
|||
/* Based on MTU+slack. */
|
||||
unsigned int rx_buf_sz;
|
||||
int oom;
|
||||
/* Interrupt status */
|
||||
u32 intr_status;
|
||||
/* Do not touch the nic registers */
|
||||
int hands_off;
|
||||
/* 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 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_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 int natsemi_change_mtu(struct net_device *dev, int new_mtu);
|
||||
#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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
np->msg_enable = (debug >= 0) ? (1<<debug)-1 : NATSEMI_DEF_MSG;
|
||||
np->hands_off = 0;
|
||||
np->intr_status = 0;
|
||||
|
||||
/* Initial port:
|
||||
* - 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->tx_timeout = &tx_timeout;
|
||||
dev->watchdog_timeo = TX_TIMEOUT;
|
||||
dev->poll = natsemi_poll;
|
||||
dev->weight = 64;
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
dev->poll_controller = &natsemi_poll_controller;
|
||||
#endif
|
||||
|
@ -1484,6 +1498,31 @@ static void natsemi_reset(struct net_device *dev)
|
|||
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)
|
||||
{
|
||||
struct netdev_private *np = netdev_priv(dev);
|
||||
|
@ -2158,68 +2197,92 @@ static void netdev_tx_done(struct net_device *dev)
|
|||
}
|
||||
}
|
||||
|
||||
/* The interrupt handler does all of the Rx thread work and cleans up
|
||||
after the Tx thread. */
|
||||
/* The interrupt handler doesn't actually handle interrupts itself, it
|
||||
* schedules a NAPI poll if there is anything to do. */
|
||||
static irqreturn_t intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
|
||||
{
|
||||
struct net_device *dev = dev_instance;
|
||||
struct netdev_private *np = netdev_priv(dev);
|
||||
void __iomem * ioaddr = ns_ioaddr(dev);
|
||||
int boguscnt = max_interrupt_work;
|
||||
unsigned int handled = 0;
|
||||
|
||||
if (np->hands_off)
|
||||
return IRQ_NONE;
|
||||
|
||||
/* Reading automatically acknowledges. */
|
||||
np->intr_status = readl(ioaddr + IntrStatus);
|
||||
|
||||
if (netif_msg_intr(np))
|
||||
printk(KERN_DEBUG
|
||||
"%s: Interrupt, status %#08x, mask %#08x.\n",
|
||||
dev->name, np->intr_status,
|
||||
readl(ioaddr + IntrMask));
|
||||
|
||||
if (!np->intr_status)
|
||||
return IRQ_NONE;
|
||||
|
||||
prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]);
|
||||
|
||||
if (netif_rx_schedule_prep(dev)) {
|
||||
/* Disable interrupts and register for poll */
|
||||
natsemi_irq_disable(dev);
|
||||
__netif_rx_schedule(dev);
|
||||
}
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/* 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 {
|
||||
/* Reading automatically acknowledges all int sources. */
|
||||
u32 intr_status = readl(ioaddr + IntrStatus);
|
||||
|
||||
if (netif_msg_intr(np))
|
||||
printk(KERN_DEBUG
|
||||
"%s: Interrupt, status %#08x, mask %#08x.\n",
|
||||
dev->name, intr_status,
|
||||
readl(ioaddr + IntrMask));
|
||||
|
||||
if (intr_status == 0)
|
||||
break;
|
||||
handled = 1;
|
||||
|
||||
if (intr_status &
|
||||
(IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
|
||||
IntrRxErr | IntrRxOverrun)) {
|
||||
netdev_rx(dev);
|
||||
}
|
||||
|
||||
if (intr_status &
|
||||
(IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
|
||||
if (np->intr_status &
|
||||
(IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) {
|
||||
spin_lock(&np->lock);
|
||||
netdev_tx_done(dev);
|
||||
spin_unlock(&np->lock);
|
||||
}
|
||||
|
||||
/* Abnormal error summary/uncommon events handlers. */
|
||||
if (intr_status & IntrAbnormalSummary)
|
||||
netdev_error(dev, intr_status);
|
||||
|
||||
if (--boguscnt < 0) {
|
||||
if (netif_msg_intr(np))
|
||||
printk(KERN_WARNING
|
||||
"%s: Too much work at interrupt, "
|
||||
"status=%#08x.\n",
|
||||
dev->name, intr_status);
|
||||
break;
|
||||
if (np->intr_status & IntrAbnormalSummary)
|
||||
netdev_error(dev, np->intr_status);
|
||||
|
||||
if (np->intr_status &
|
||||
(IntrRxDone | IntrRxIntr | RxStatusFIFOOver |
|
||||
IntrRxErr | IntrRxOverrun)) {
|
||||
netdev_rx(dev, &work_done, work_to_do);
|
||||
}
|
||||
} while (1);
|
||||
|
||||
*budget -= work_done;
|
||||
dev->quota -= work_done;
|
||||
|
||||
if (netif_msg_intr(np))
|
||||
printk(KERN_DEBUG "%s: exiting interrupt.\n", dev->name);
|
||||
if (work_done >= work_to_do)
|
||||
return 1;
|
||||
|
||||
return IRQ_RETVAL(handled);
|
||||
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
|
||||
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);
|
||||
int entry = np->cur_rx % RX_RING_SIZE;
|
||||
|
@ -2237,6 +2300,12 @@ static void netdev_rx(struct net_device *dev)
|
|||
entry, desc_status);
|
||||
if (--boguscnt < 0)
|
||||
break;
|
||||
|
||||
if (*work_done >= work_to_do)
|
||||
break;
|
||||
|
||||
(*work_done)++;
|
||||
|
||||
pkt_len = (desc_status & DescSizeMask) - 4;
|
||||
if ((desc_status&(DescMore|DescPktOK|DescRxLong)) != DescPktOK){
|
||||
if (desc_status & DescMore) {
|
||||
|
@ -2248,6 +2317,23 @@ static void netdev_rx(struct net_device *dev)
|
|||
"status %#08x.\n", dev->name,
|
||||
np->cur_rx, desc_status);
|
||||
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 {
|
||||
/* There was an error. */
|
||||
np->stats.rx_errors++;
|
||||
|
@ -2293,7 +2379,7 @@ static void netdev_rx(struct net_device *dev)
|
|||
np->rx_skbuff[entry] = NULL;
|
||||
}
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
netif_rx(skb);
|
||||
netif_receive_skb(skb);
|
||||
dev->last_rx = jiffies;
|
||||
np->stats.rx_packets++;
|
||||
np->stats.rx_bytes += pkt_len;
|
||||
|
@ -3074,9 +3160,7 @@ static int netdev_close(struct net_device *dev)
|
|||
del_timer_sync(&np->timer);
|
||||
disable_irq(dev->irq);
|
||||
spin_lock_irq(&np->lock);
|
||||
/* Disable interrupts, and flush posted writes */
|
||||
writel(0, ioaddr + IntrEnable);
|
||||
readl(ioaddr + IntrEnable);
|
||||
natsemi_irq_disable(dev);
|
||||
np->hands_off = 1;
|
||||
spin_unlock_irq(&np->lock);
|
||||
enable_irq(dev->irq);
|
||||
|
@ -3158,6 +3242,9 @@ static void __devexit natsemi_remove1 (struct pci_dev *pdev)
|
|||
* * netdev_timer: timer stopped by natsemi_suspend.
|
||||
* * intr_handler: doesn't acquire the spinlock. suspend calls
|
||||
* 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.
|
||||
*/
|
||||
|
@ -3183,6 +3270,8 @@ static int natsemi_suspend (struct pci_dev *pdev, pm_message_t state)
|
|||
spin_unlock_irq(&np->lock);
|
||||
enable_irq(dev->irq);
|
||||
|
||||
netif_poll_disable(dev);
|
||||
|
||||
/* Update the error counts. */
|
||||
__get_stats(dev);
|
||||
|
||||
|
@ -3235,6 +3324,7 @@ static int natsemi_resume (struct pci_dev *pdev)
|
|||
mod_timer(&np->timer, jiffies + 1*HZ);
|
||||
}
|
||||
netif_device_attach(dev);
|
||||
netif_poll_enable(dev);
|
||||
out:
|
||||
rtnl_unlock();
|
||||
return 0;
|
||||
|
|
|
@ -27,6 +27,7 @@ static const char version1[] =
|
|||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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. */
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -580,7 +581,7 @@ retry:
|
|||
#endif
|
||||
|
||||
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);
|
||||
ne_reset_8390(dev);
|
||||
NS8390_init(dev,1);
|
||||
|
|
|
@ -50,6 +50,7 @@ static const char version2[] =
|
|||
#include <linux/delay.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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);
|
||||
|
||||
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) {
|
||||
printk(" (warning: no reset ack)");
|
||||
break;
|
||||
|
@ -580,7 +581,7 @@ static void ne_reset_8390(struct net_device *dev)
|
|||
|
||||
/* This check _should_not_ be necessary, omit eventually. */
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
@ -787,7 +788,7 @@ retry:
|
|||
#endif
|
||||
|
||||
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);
|
||||
ne_reset_8390(dev);
|
||||
NS8390_init(dev,1);
|
||||
|
|
|
@ -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/skbuff.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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);
|
||||
|
||||
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");
|
||||
retval = -ENODEV;
|
||||
goto out;
|
||||
|
@ -548,7 +549,7 @@ static void ne_reset_8390(struct net_device *dev)
|
|||
|
||||
/* This check _should_not_ be necessary, omit eventually. */
|
||||
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",
|
||||
dev->name);
|
||||
break;
|
||||
|
@ -749,7 +750,7 @@ retry:
|
|||
#endif
|
||||
|
||||
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);
|
||||
ne_reset_8390(dev);
|
||||
NS8390_init(dev,1);
|
||||
|
|
|
@ -117,7 +117,7 @@ enum ne2k_pci_chipsets {
|
|||
};
|
||||
|
||||
|
||||
static struct {
|
||||
static const struct {
|
||||
char *name;
|
||||
int flags;
|
||||
} pci_clone_list[] __devinitdata = {
|
||||
|
|
|
@ -116,6 +116,7 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/io.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)
|
||||
{
|
||||
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 tbisr, tanar, tanlpar;
|
||||
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);
|
||||
int timed_out = 0;
|
||||
long start;
|
||||
unsigned long start;
|
||||
u32 status;
|
||||
int loops = 0;
|
||||
|
||||
|
@ -1625,7 +1626,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab
|
|||
break;
|
||||
if (status & fail)
|
||||
break;
|
||||
if ((jiffies - start) >= HZ) {
|
||||
if (time_after_eq(jiffies, start + HZ)) {
|
||||
timed_out = 1;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/board.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -606,7 +607,7 @@ retry:
|
|||
#endif
|
||||
|
||||
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);
|
||||
oaknet_reset_8390(dev);
|
||||
NS8390_init(dev, TRUE);
|
||||
|
|
|
@ -341,7 +341,7 @@ static void tc574_detach(struct pcmcia_device *p_dev)
|
|||
#define CS_CHECK(fn, ret) \
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/if_arp.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <pcmcia/cs_types.h>
|
||||
#include <pcmcia/cs.h>
|
||||
|
@ -115,7 +116,7 @@ struct el3_private {
|
|||
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;
|
||||
|
||||
/* 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;
|
||||
} else {
|
||||
/* Try harder to detect carrier errors */
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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++) {
|
||||
link->io.BasePort2 = serial_base[i];
|
||||
|
|
|
@ -388,7 +388,7 @@ static char *version =
|
|||
DRV_NAME " " DRV_VERSION " (Roger C. Pao)";
|
||||
#endif
|
||||
|
||||
static char *if_names[]={
|
||||
static const char *if_names[]={
|
||||
"Auto", "10baseT", "BNC",
|
||||
};
|
||||
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
|
||||
#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
|
||||
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", "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-LN100TE", 0x88fcdeda, 0x0e714bee),
|
||||
PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922),
|
||||
PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0),
|
||||
PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578),
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
|
||||
/*====================================================================*/
|
||||
|
||||
static char *if_names[] = { "auto", "10baseT", "10base2"};
|
||||
static const char *if_names[] = { "auto", "10baseT", "10base2"};
|
||||
|
||||
/* Module parameters */
|
||||
|
||||
|
@ -777,7 +777,7 @@ free_cfg_mem:
|
|||
static int osi_config(dev_link_t *link)
|
||||
{
|
||||
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;
|
||||
|
||||
link->conf.Attributes |= CONF_ENABLE_SPKR;
|
||||
|
|
|
@ -208,7 +208,7 @@ enum xirc_cmd { /* Commands */
|
|||
#define XIRCREG45_REV 15 /* Revision Register (rd) */
|
||||
#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
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#define DRV_RELDATE "01.Nov.2005"
|
||||
#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";
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -109,7 +109,7 @@ static int rx_copybreak = 200;
|
|||
* table to translate option values from tulip
|
||||
* to internal options
|
||||
*/
|
||||
static unsigned char options_mapping[] = {
|
||||
static const unsigned char options_mapping[] = {
|
||||
PCNET32_PORT_ASEL, /* 0 Auto-select */
|
||||
PCNET32_PORT_AUI, /* 1 BNC/AUI */
|
||||
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 size; /* size of packets */
|
||||
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 ticks;
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ struct phy_setting {
|
|||
};
|
||||
|
||||
/* A mapping of all SUPPORTED settings to speed/duplex */
|
||||
static struct phy_setting settings[] = {
|
||||
static const struct phy_setting settings[] = {
|
||||
{
|
||||
.speed = 10000,
|
||||
.duplex = DUPLEX_FULL,
|
||||
|
|
|
@ -123,7 +123,7 @@ static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n"
|
|||
#ifndef NET_DEBUG
|
||||
#define NET_DEBUG 1
|
||||
#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 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,
|
||||
struct plip_local *snd, struct plip_local *rcv);
|
||||
|
||||
static plip_func connection_state_table[] =
|
||||
static const plip_func connection_state_table[] =
|
||||
{
|
||||
plip_none,
|
||||
plip_receive_packet,
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/ppp_channel.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/string.h>
|
||||
|
||||
|
@ -570,7 +571,7 @@ ppp_async_encode(struct asyncppp *ap)
|
|||
* character if necessary.
|
||||
*/
|
||||
if (islcp || flag_time == 0
|
||||
|| jiffies - ap->last_xmit >= flag_time)
|
||||
|| time_after_eq(jiffies, ap->last_xmit + flag_time))
|
||||
*buf++ = PPP_FLAG;
|
||||
ap->last_xmit = jiffies;
|
||||
fcs = PPP_INITFCS;
|
||||
|
|
|
@ -108,7 +108,7 @@ static void
|
|||
ppp_print_hex (register __u8 * out, const __u8 * in, int count)
|
||||
{
|
||||
register __u8 next_ch;
|
||||
static char hex[] = "0123456789ABCDEF";
|
||||
static const char hex[] = "0123456789ABCDEF";
|
||||
|
||||
while (count-- > 0) {
|
||||
next_ch = *in++;
|
||||
|
|
|
@ -113,11 +113,11 @@ static int media[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1 };
|
|||
static int num_media = 0;
|
||||
|
||||
/* 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).
|
||||
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 */
|
||||
#define MAC_ADDR_LEN 6
|
||||
|
|
|
@ -57,23 +57,27 @@
|
|||
#include <linux/ethtool.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <net/tcp.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/div64.h>
|
||||
|
||||
/* local include */
|
||||
#include "s2io.h"
|
||||
#include "s2io-regs.h"
|
||||
|
||||
#define DRV_VERSION "Version 2.0.9.4"
|
||||
#define DRV_VERSION "2.0.11.2"
|
||||
|
||||
/* S2io Driver name & version. */
|
||||
static char s2io_driver_name[] = "Neterion";
|
||||
static char s2io_driver_version[] = DRV_VERSION;
|
||||
|
||||
int rxd_size[4] = {32,48,48,64};
|
||||
int rxd_count[4] = {127,85,85,63};
|
||||
static int rxd_size[4] = {32,48,48,64};
|
||||
static int rxd_count[4] = {127,85,85,63};
|
||||
|
||||
static inline int RXD_IS_UP2DT(RxD_t *rxdp)
|
||||
{
|
||||
|
@ -168,6 +172,11 @@ static char ethtool_stats_keys[][ETH_GSTRING_LEN] = {
|
|||
{"\n DRIVER STATISTICS"},
|
||||
{"single_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
|
||||
|
@ -214,7 +223,7 @@ static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid)
|
|||
#define SWITCH_SIGN 0xA5A5A5A5A5A5A5A5ULL
|
||||
#define END_SIGN 0x0
|
||||
|
||||
static u64 herc_act_dtx_cfg[] = {
|
||||
static const u64 herc_act_dtx_cfg[] = {
|
||||
/* Set address */
|
||||
0x8000051536750000ULL, 0x80000515367500E0ULL,
|
||||
/* Write data */
|
||||
|
@ -235,7 +244,7 @@ static u64 herc_act_dtx_cfg[] = {
|
|||
END_SIGN
|
||||
};
|
||||
|
||||
static u64 xena_mdio_cfg[] = {
|
||||
static const u64 xena_mdio_cfg[] = {
|
||||
/* Reset PMA PLL */
|
||||
0xC001010000000000ULL, 0xC0010100000000E0ULL,
|
||||
0xC0010100008000E4ULL,
|
||||
|
@ -245,7 +254,7 @@ static u64 xena_mdio_cfg[] = {
|
|||
END_SIGN
|
||||
};
|
||||
|
||||
static u64 xena_dtx_cfg[] = {
|
||||
static const u64 xena_dtx_cfg[] = {
|
||||
0x8000051500000000ULL, 0x80000515000000E0ULL,
|
||||
0x80000515D93500E4ULL, 0x8001051500000000ULL,
|
||||
0x80010515000000E0ULL, 0x80010515001E00E4ULL,
|
||||
|
@ -273,7 +282,7 @@ static u64 xena_dtx_cfg[] = {
|
|||
* Constants for Fixing the MacAddress problem seen mostly on
|
||||
* Alpha machines.
|
||||
*/
|
||||
static u64 fix_mac[] = {
|
||||
static const u64 fix_mac[] = {
|
||||
0x0060000000000000ULL, 0x0060600000000000ULL,
|
||||
0x0040600000000000ULL, 0x0000600000000000ULL,
|
||||
0x0020600000000000ULL, 0x0060600000000000ULL,
|
||||
|
@ -317,6 +326,12 @@ static unsigned int indicate_max_pkts;
|
|||
static unsigned int rxsync_frequency = 3;
|
||||
/* Interrupt type. Values can be 0(INTA), 1(MSI), 2(MSI_X) */
|
||||
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.
|
||||
|
@ -1476,6 +1491,19 @@ static int init_nic(struct s2io_nic *nic)
|
|||
writel((u32) (val64 >> 32), (add + 4));
|
||||
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
|
||||
* 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 sk_buff *frag_list;
|
||||
|
@ -2569,6 +2597,8 @@ static void rx_intr_handler(ring_info_t *ring_data)
|
|||
#ifndef CONFIG_S2IO_NAPI
|
||||
int pkt_cnt = 0;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
spin_lock(&nic->rx_lock);
|
||||
if (atomic_read(&nic->card_state) == CARD_DOWN) {
|
||||
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;
|
||||
#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);
|
||||
}
|
||||
|
||||
|
@ -2852,7 +2894,7 @@ static int wait_for_cmd_complete(nic_t * sp)
|
|||
* void.
|
||||
*/
|
||||
|
||||
void s2io_reset(nic_t * sp)
|
||||
static void s2io_reset(nic_t * sp)
|
||||
{
|
||||
XENA_dev_config_t __iomem *bar0 = sp->bar0;
|
||||
u64 val64;
|
||||
|
@ -2940,7 +2982,7 @@ void s2io_reset(nic_t * sp)
|
|||
* 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;
|
||||
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;
|
||||
}
|
||||
|
||||
void restore_xmsi_data(nic_t *nic)
|
||||
static void restore_xmsi_data(nic_t *nic)
|
||||
{
|
||||
XENA_dev_config_t __iomem *bar0 = nic->bar0;
|
||||
u64 val64;
|
||||
|
@ -3180,7 +3222,7 @@ int s2io_enable_msi(nic_t *nic)
|
|||
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;
|
||||
u64 tx_mat, rx_mat;
|
||||
|
@ -3668,23 +3710,32 @@ s2io_msi_handle(int irq, void *dev_id, struct pt_regs *regs)
|
|||
* else schedule a tasklet to reallocate the buffers.
|
||||
*/
|
||||
for (i = 0; i < config->rx_ring_num; i++) {
|
||||
int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
|
||||
int level = rx_buffer_level(sp, rxb_size, i);
|
||||
if (!sp->lro) {
|
||||
int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
|
||||
int level = rx_buffer_level(sp, rxb_size, i);
|
||||
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", dev->name);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "%s:Out of memory",
|
||||
dev->name);
|
||||
DBG_PRINT(ERR_DBG, " in ISR!!\n");
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ",
|
||||
dev->name);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "%s:Out of memory",
|
||||
dev->name);
|
||||
DBG_PRINT(ERR_DBG, " in ISR!!\n");
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
atomic_dec(&sp->isr_cnt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
atomic_dec(&sp->isr_cnt);
|
||||
return IRQ_HANDLED;
|
||||
} else if (level == LOW) {
|
||||
tasklet_schedule(&sp->task);
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
} else if (level == LOW) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3697,29 +3748,37 @@ s2io_msix_ring_handle(int irq, void *dev_id, struct pt_regs *regs)
|
|||
{
|
||||
ring_info_t *ring = (ring_info_t *)dev_id;
|
||||
nic_t *sp = ring->nic;
|
||||
struct net_device *dev = (struct net_device *) dev_id;
|
||||
int rxb_size, level, rng_n;
|
||||
|
||||
atomic_inc(&sp->isr_cnt);
|
||||
rx_intr_handler(ring);
|
||||
|
||||
rng_n = ring->ring_no;
|
||||
rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]);
|
||||
level = rx_buffer_level(sp, rxb_size, rng_n);
|
||||
if (!sp->lro) {
|
||||
rxb_size = atomic_read(&sp->rx_bufs_left[rng_n]);
|
||||
level = rx_buffer_level(sp, rxb_size, rng_n);
|
||||
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
int ret;
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "Out of memory in %s",
|
||||
__FUNCTION__);
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
int ret;
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", __FUNCTION__);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, rng_n)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "Out of memory in %s",
|
||||
__FUNCTION__);
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
return IRQ_HANDLED;
|
||||
} else if (level == LOW) {
|
||||
tasklet_schedule(&sp->task);
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
} else if (level == LOW) {
|
||||
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);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
@ -3875,24 +3934,33 @@ static irqreturn_t s2io_isr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
*/
|
||||
#ifndef CONFIG_S2IO_NAPI
|
||||
for (i = 0; i < config->rx_ring_num; i++) {
|
||||
int ret;
|
||||
int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
|
||||
int level = rx_buffer_level(sp, rxb_size, i);
|
||||
if (!sp->lro) {
|
||||
int ret;
|
||||
int rxb_size = atomic_read(&sp->rx_bufs_left[i]);
|
||||
int level = rx_buffer_level(sp, rxb_size, i);
|
||||
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ", dev->name);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "%s:Out of memory",
|
||||
dev->name);
|
||||
DBG_PRINT(ERR_DBG, " in ISR!!\n");
|
||||
if ((level == PANIC) && (!TASKLET_IN_USE)) {
|
||||
DBG_PRINT(INTR_DBG, "%s: Rx BD hit ",
|
||||
dev->name);
|
||||
DBG_PRINT(INTR_DBG, "PANIC levels\n");
|
||||
if ((ret = fill_rx_buffers(sp, i)) == -ENOMEM) {
|
||||
DBG_PRINT(ERR_DBG, "%s:Out of memory",
|
||||
dev->name);
|
||||
DBG_PRINT(ERR_DBG, " in ISR!!\n");
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
atomic_dec(&sp->isr_cnt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
atomic_dec(&sp->isr_cnt);
|
||||
return IRQ_HANDLED;
|
||||
} else if (level == LOW) {
|
||||
tasklet_schedule(&sp->task);
|
||||
}
|
||||
clear_bit(0, (&sp->tasklet_status));
|
||||
} else if (level == LOW) {
|
||||
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
|
||||
|
@ -4129,7 +4197,7 @@ static void s2io_set_multicast(struct net_device *dev)
|
|||
* 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;
|
||||
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;
|
||||
nic_t *sp = dev->priv;
|
||||
StatInfo_t *stat_info = sp->mac_control.stats_info;
|
||||
u64 tmp;
|
||||
|
||||
s2io_updt_stats(sp);
|
||||
tmp_stats[i++] =
|
||||
|
@ -5135,6 +5204,16 @@ static void s2io_get_ethtool_stats(struct net_device *dev,
|
|||
tmp_stats[i++] = 0;
|
||||
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.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)
|
||||
|
@ -5516,6 +5595,14 @@ static int s2io_card_up(nic_t * sp)
|
|||
/* Setting its receive mode */
|
||||
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 */
|
||||
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);
|
||||
int ring_no = ring_data->ring_no;
|
||||
u16 l3_csum, l4_csum;
|
||||
lro_t *lro;
|
||||
|
||||
skb->dev = dev;
|
||||
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);
|
||||
}
|
||||
|
||||
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)) {
|
||||
l3_csum = RXD_GET_L3_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.
|
||||
*/
|
||||
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 {
|
||||
/*
|
||||
* Packet with erroneous checksum, let the
|
||||
|
@ -5678,25 +5815,31 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
|
|||
skb->ip_summed = CHECKSUM_NONE;
|
||||
}
|
||||
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
if (!sp->lro) {
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
#ifdef CONFIG_S2IO_NAPI
|
||||
if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) {
|
||||
/* Queueing the vlan frame to the upper layer */
|
||||
vlan_hwaccel_receive_skb(skb, sp->vlgrp,
|
||||
RXD_GET_VLAN_TAG(rxdp->Control_2));
|
||||
} else {
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) {
|
||||
/* Queueing the vlan frame to the upper layer */
|
||||
vlan_hwaccel_receive_skb(skb, sp->vlgrp,
|
||||
RXD_GET_VLAN_TAG(rxdp->Control_2));
|
||||
} else {
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
#else
|
||||
if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) {
|
||||
/* Queueing the vlan frame to the upper layer */
|
||||
vlan_hwaccel_rx(skb, sp->vlgrp,
|
||||
RXD_GET_VLAN_TAG(rxdp->Control_2));
|
||||
} else {
|
||||
netif_rx(skb);
|
||||
}
|
||||
if (sp->vlgrp && RXD_GET_VLAN_TAG(rxdp->Control_2)) {
|
||||
/* Queueing the vlan frame to the upper layer */
|
||||
vlan_hwaccel_rx(skb, sp->vlgrp,
|
||||
RXD_GET_VLAN_TAG(rxdp->Control_2));
|
||||
} else {
|
||||
netif_rx(skb);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
send_up:
|
||||
queue_rx_frame(skb);
|
||||
}
|
||||
dev->last_rx = jiffies;
|
||||
aggregate:
|
||||
atomic_dec(&sp->rx_bufs_left[ring_no]);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
@ -5714,7 +5857,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp)
|
|||
* 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;
|
||||
|
||||
|
@ -5739,7 +5882,7 @@ void s2io_link(nic_t * sp, int link)
|
|||
* 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;
|
||||
int ret;
|
||||
|
@ -5808,6 +5951,8 @@ module_param(indicate_max_pkts, int, 0);
|
|||
#endif
|
||||
module_param(rxsync_frequency, 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 .
|
||||
|
@ -5939,6 +6084,7 @@ Defaulting to INTA\n");
|
|||
else
|
||||
sp->device_type = XFRAME_I_DEVICE;
|
||||
|
||||
sp->lro = lro;
|
||||
|
||||
/* Initialize some PCI/PCI-X fields of the NIC. */
|
||||
s2io_init_pci(sp);
|
||||
|
@ -6242,6 +6388,10 @@ Defaulting to INTA\n");
|
|||
DBG_PRINT(ERR_DBG, "%s: 3-Buffer mode support has been "
|
||||
"enabled\n",dev->name);
|
||||
|
||||
if (sp->lro)
|
||||
DBG_PRINT(ERR_DBG, "%s: Large receive offload enabled\n",
|
||||
dev->name);
|
||||
|
||||
/* Initialize device name */
|
||||
strcpy(sp->name, dev->name);
|
||||
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.
|
||||
*/
|
||||
|
||||
void s2io_closer(void)
|
||||
static void s2io_closer(void)
|
||||
{
|
||||
pci_unregister_driver(&s2io_driver);
|
||||
DBG_PRINT(INIT_DBG, "cleanup done\n");
|
||||
|
@ -6352,3 +6502,318 @@ void s2io_closer(void)
|
|||
|
||||
module_init(s2io_starter);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ typedef enum xena_max_outstanding_splits {
|
|||
#define INTR_DBG 4
|
||||
|
||||
/* 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. */
|
||||
#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 {
|
||||
unsigned long long single_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;
|
||||
|
||||
/* The statistics block of Xena */
|
||||
|
@ -268,7 +275,7 @@ typedef struct stat_block {
|
|||
#define MAX_RX_RINGS 8
|
||||
|
||||
/* 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, 1, 1, 1, 1},
|
||||
{0, 0, 0, 1, 1, 1, 2, 2},
|
||||
|
@ -680,6 +687,24 @@ struct msix_info_st {
|
|||
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 */
|
||||
struct s2io_nic {
|
||||
int rxd_mode;
|
||||
|
@ -784,6 +809,13 @@ struct s2io_nic {
|
|||
#define XFRAME_II_DEVICE 2
|
||||
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 MSI 1
|
||||
#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 int s2io_starter(void);
|
||||
void s2io_closer(void);
|
||||
static void s2io_tx_watchdog(struct net_device *dev);
|
||||
static void s2io_tasklet(unsigned long dev_addr);
|
||||
static void s2io_set_multicast(struct net_device *dev);
|
||||
static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp);
|
||||
void s2io_link(nic_t * sp, int link);
|
||||
void s2io_reset(nic_t * sp);
|
||||
static void s2io_link(nic_t * sp, int link);
|
||||
#if defined(CONFIG_S2IO_NAPI)
|
||||
static int s2io_poll(struct net_device *dev, int *budget);
|
||||
#endif
|
||||
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 int s2io_enable_msi(nic_t *nic);
|
||||
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);
|
||||
static irqreturn_t
|
||||
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 int verify_xena_quiescence(nic_t *sp, u64 val64, int flag);
|
||||
static struct ethtool_ops netdev_ethtool_ops;
|
||||
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 int s2io_card_up(nic_t *nic);
|
||||
int get_xena_rev_id(struct pci_dev *pdev);
|
||||
void restore_xmsi_data(nic_t *nic);
|
||||
static int get_xena_rev_id(struct pci_dev *pdev);
|
||||
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 */
|
||||
|
|
|
@ -59,7 +59,7 @@ static char version[] = "sb1000.c:v1.1.2 6/01/98 (fventuri@mediaone.net)\n";
|
|||
#ifdef SB1000_DEBUG
|
||||
static int sb1000_debug = SB1000_DEBUG;
|
||||
#else
|
||||
static int sb1000_debug = 1;
|
||||
static const int sb1000_debug = 1;
|
||||
#endif
|
||||
|
||||
static const int SB1000_IO_EXTENT = 8;
|
||||
|
|
|
@ -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
|
||||
* 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_ETH1_HWADDR "40:00:00:00:01:01"
|
||||
#define SBMAC_ETH2_HWADDR "40:00:00:00:01:02"
|
||||
#define SBMAC_ETH3_HWADDR "40:00:00:00:01:03"
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -57,7 +58,7 @@ static char version1[] __devinitdata =
|
|||
|
||||
#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. */
|
||||
#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[]'.
|
||||
*/
|
||||
#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_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_PARM_DESC(full_duplex, "1-" __MODULE_STRING(MAX_UNITS));
|
||||
#endif
|
||||
|
@ -105,13 +106,26 @@ MODULE_PARM_DESC(int_timeout, "Timeout value");
|
|||
#endif
|
||||
|
||||
#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_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_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
|
||||
|
@ -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
|
||||
* Use a larger RD_THRSH for gigabit
|
||||
*/
|
||||
if (periph_rev >= 2)
|
||||
th_value = 64;
|
||||
else
|
||||
if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2)
|
||||
th_value = 28;
|
||||
else
|
||||
th_value = 64;
|
||||
|
||||
fifo = V_MAC_TX_WR_THRSH(4) | /* Must be '4' or '8' */
|
||||
((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
|
||||
*/
|
||||
|
||||
#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 |
|
||||
M_MAC_TXDMA_EN0 |
|
||||
M_MAC_RX_ENABLE |
|
||||
M_MAC_TX_ENABLE, s->sbm_macenable);
|
||||
|
||||
|
||||
|
||||
#else
|
||||
#error invalid SiByte MAC configuation
|
||||
#endif
|
||||
|
||||
#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);
|
||||
__raw_writeq(reg, sc->sbm_rxfilter);
|
||||
|
||||
/* read system identification to determine revision */
|
||||
if (periph_rev >= 2) {
|
||||
sc->rx_hw_checksum = ENABLE;
|
||||
} else {
|
||||
/* BCM1250 pass1 didn't have hardware checksum. Everything
|
||||
later does. */
|
||||
if (soc_type == K_SYS_SOC_TYPE_BCM1250 && periph_rev < 2) {
|
||||
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)
|
||||
*
|
||||
|
@ -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
|
||||
sbmac_setup_hwaddr(int chan,char *addr)
|
||||
{
|
||||
|
@ -2818,25 +2837,7 @@ sbmac_init_module(void)
|
|||
unsigned long port;
|
||||
int chip_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
|
||||
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.
|
||||
*/
|
||||
/* Set the number of available units based on the SOC type. */
|
||||
switch (soc_type) {
|
||||
case K_SYS_SOC_TYPE_BCM1250:
|
||||
case K_SYS_SOC_TYPE_BCM1250_ALT:
|
||||
|
@ -2848,6 +2849,10 @@ sbmac_init_module(void)
|
|||
case K_SYS_SOC_TYPE_BCM1250_ALT2: /* Hybrid */
|
||||
chip_max_units = 2;
|
||||
break;
|
||||
case K_SYS_SOC_TYPE_BCM1x55:
|
||||
case K_SYS_SOC_TYPE_BCM1x80:
|
||||
chip_max_units = 4;
|
||||
break;
|
||||
default:
|
||||
chip_max_units = 0;
|
||||
break;
|
||||
|
@ -2855,6 +2860,32 @@ sbmac_init_module(void)
|
|||
if (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++) {
|
||||
|
||||
/*
|
||||
|
@ -2886,7 +2917,7 @@ sbmac_init_module(void)
|
|||
|
||||
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->mem_end = 0;
|
||||
if (sbmac_init(dev, idx)) {
|
||||
|
|
|
@ -46,6 +46,7 @@ static const char version[] =
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/system.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 status = inw(SEEQ_STATUS);
|
||||
int transmit_ptr = 0;
|
||||
int tmp;
|
||||
unsigned long tmp;
|
||||
|
||||
if (net_debug>4) {
|
||||
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 */
|
||||
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();
|
||||
|
||||
/* doit ! */
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
*
|
||||
* Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.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 - sp->tx_new - 1)
|
||||
|
||||
#define DEBUG
|
||||
|
||||
struct sgiseeq_rx_desc {
|
||||
volatile struct hpc_dma_desc rdma;
|
||||
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 net_device *gdev;
|
||||
|
||||
void sgiseeq_dump_rings(void)
|
||||
static void sgiseeq_dump_rings(void)
|
||||
{
|
||||
static int once;
|
||||
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_rx_desc *rd;
|
||||
struct sk_buff *skb = 0;
|
||||
struct sk_buff *skb = NULL;
|
||||
unsigned char pkt_status;
|
||||
unsigned char *pkt_pointer = 0;
|
||||
unsigned char *pkt_pointer = NULL;
|
||||
int len = 0;
|
||||
unsigned int orig_end = PREV_RX(sp->rx_new);
|
||||
|
||||
|
@ -515,12 +516,6 @@ static inline int sgiseeq_reset(struct net_device *dev)
|
|||
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)
|
||||
{
|
||||
struct sgiseeq_private *sp = netdev_priv(dev);
|
||||
|
|
|
@ -83,6 +83,7 @@
|
|||
#include <linux/if_arp.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/if_shaper.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <net/dst.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.
|
||||
*/
|
||||
if(SHAPERCB(skb)->shapeclock-jiffies > SHAPER_LATENCY) {
|
||||
if(time_after(SHAPERCB(skb)->shapeclock,jiffies + SHAPER_LATENCY)) {
|
||||
dev_kfree_skb(skb);
|
||||
shaper->stats.tx_dropped++;
|
||||
} else
|
||||
|
|
|
@ -366,7 +366,7 @@ static const u32 sis190_intr_mask =
|
|||
* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).
|
||||
* 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)
|
||||
{
|
||||
|
|
|
@ -100,7 +100,7 @@ enum {
|
|||
SIS_900 = 0,
|
||||
SIS_7016
|
||||
};
|
||||
static char * card_names[] = {
|
||||
static const char * card_names[] = {
|
||||
"SiS 900 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 struct mii_chip_info {
|
||||
static const struct mii_chip_info {
|
||||
const char * name;
|
||||
u16 phy_id0;
|
||||
u16 phy_id1;
|
||||
|
@ -400,7 +400,7 @@ static int __devinit sis900_probe(struct pci_dev *pci_dev,
|
|||
void *ring_space;
|
||||
long ioaddr;
|
||||
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);
|
||||
|
||||
/* 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 sis900_private *sis_priv = net_dev->priv;
|
||||
struct mii_phy *mii_phy = sis_priv->mii;
|
||||
static int next_tick = 5*HZ;
|
||||
static const int next_tick = 5*HZ;
|
||||
u16 status;
|
||||
|
||||
if (!sis_priv->autong_complete){
|
||||
|
|
|
@ -236,18 +236,6 @@ extern int SkAddrMcClear(
|
|||
SK_U32 PortNumber,
|
||||
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(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -255,35 +243,11 @@ extern int SkAddrMcAdd(
|
|||
SK_MAC_ADDR *pMc,
|
||||
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(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
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(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -297,18 +261,6 @@ extern int SkAddrPromiscuousChange(
|
|||
SK_U32 PortNumber,
|
||||
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
|
||||
extern int SkAddrSwap(
|
||||
SK_AC *pAC,
|
||||
|
|
|
@ -203,12 +203,6 @@ extern SKCS_STATUS SkCsGetReceiveInfo(
|
|||
unsigned Checksum2,
|
||||
int NetNumber);
|
||||
|
||||
extern void SkCsGetSendInfo(
|
||||
SK_AC *pAc,
|
||||
void *pIpHeader,
|
||||
SKCS_PACKET_INFO *pPacketInfo,
|
||||
int NetNumber);
|
||||
|
||||
extern void SkCsSetReceiveFlags(
|
||||
SK_AC *pAc,
|
||||
unsigned ReceiveFlags,
|
||||
|
|
|
@ -464,12 +464,6 @@ typedef struct s_GeInit {
|
|||
/*
|
||||
* public functions in skgeinit.c
|
||||
*/
|
||||
extern void SkGePollRxD(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
int Port,
|
||||
SK_BOOL PollRxD);
|
||||
|
||||
extern void SkGePollTxD(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -522,10 +516,6 @@ extern void SkGeXmitLED(
|
|||
int Led,
|
||||
int Mode);
|
||||
|
||||
extern void SkGeInitRamIface(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC);
|
||||
|
||||
extern int SkGeInitAssignRamToQueues(
|
||||
SK_AC *pAC,
|
||||
int ActivePort,
|
||||
|
@ -549,11 +539,6 @@ extern void SkMacHardRst(
|
|||
SK_IOC IoC,
|
||||
int Port);
|
||||
|
||||
extern void SkMacClearRst(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
int Port);
|
||||
|
||||
extern void SkXmInitMac(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -580,11 +565,6 @@ extern void SkMacFlushTxFifo(
|
|||
SK_IOC IoC,
|
||||
int Port);
|
||||
|
||||
extern void SkMacFlushRxFifo(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
int Port);
|
||||
|
||||
extern void SkMacIrq(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -601,12 +581,6 @@ extern void SkMacAutoNegLipaPhy(
|
|||
int Port,
|
||||
SK_U16 IStatus);
|
||||
|
||||
extern void SkMacSetRxTxEn(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
int Port,
|
||||
int Para);
|
||||
|
||||
extern int SkMacRxTxEnable(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -659,16 +633,6 @@ extern void SkXmClrExactAddr(
|
|||
int StartNum,
|
||||
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(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
|
@ -729,17 +693,6 @@ extern int SkGmCableDiagStatus(
|
|||
int Port,
|
||||
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
|
||||
extern void SkGePhyRead(
|
||||
SK_AC *pAC,
|
||||
|
@ -782,7 +735,6 @@ extern void SkXmSendCont(
|
|||
/*
|
||||
* public functions in skgeinit.c
|
||||
*/
|
||||
extern void SkGePollRxD();
|
||||
extern void SkGePollTxD();
|
||||
extern void SkGeYellowLED();
|
||||
extern int SkGeCfgSync();
|
||||
|
@ -792,7 +744,6 @@ extern int SkGeInit();
|
|||
extern void SkGeDeInit();
|
||||
extern int SkGeInitPort();
|
||||
extern void SkGeXmitLED();
|
||||
extern void SkGeInitRamIface();
|
||||
extern int SkGeInitAssignRamToQueues();
|
||||
|
||||
/*
|
||||
|
@ -801,18 +752,15 @@ extern int SkGeInitAssignRamToQueues();
|
|||
extern void SkMacRxTxDisable();
|
||||
extern void SkMacSoftRst();
|
||||
extern void SkMacHardRst();
|
||||
extern void SkMacClearRst();
|
||||
extern void SkMacInitPhy();
|
||||
extern int SkMacRxTxEnable();
|
||||
extern void SkMacPromiscMode();
|
||||
extern void SkMacHashing();
|
||||
extern void SkMacIrqDisable();
|
||||
extern void SkMacFlushTxFifo();
|
||||
extern void SkMacFlushRxFifo();
|
||||
extern void SkMacIrq();
|
||||
extern int SkMacAutoNegDone();
|
||||
extern void SkMacAutoNegLipaPhy();
|
||||
extern void SkMacSetRxTxEn();
|
||||
extern void SkXmInitMac();
|
||||
extern void SkXmPhyRead();
|
||||
extern void SkXmPhyWrite();
|
||||
|
@ -820,8 +768,6 @@ extern void SkGmInitMac();
|
|||
extern void SkGmPhyRead();
|
||||
extern void SkGmPhyWrite();
|
||||
extern void SkXmClrExactAddr();
|
||||
extern void SkXmInitDupMd();
|
||||
extern void SkXmInitPauseMd();
|
||||
extern void SkXmAutoNegLipaXmac();
|
||||
extern int SkXmUpdateStats();
|
||||
extern int SkGmUpdateStats();
|
||||
|
@ -832,8 +778,6 @@ extern int SkGmResetCounter();
|
|||
extern int SkXmOverflowStatus();
|
||||
extern int SkGmOverflowStatus();
|
||||
extern int SkGmCableDiagStatus();
|
||||
extern int SkGmEnterLowPowerMode();
|
||||
extern int SkGmLeaveLowPowerMode();
|
||||
|
||||
#ifdef SK_DIAG
|
||||
extern void SkGePhyRead();
|
||||
|
|
|
@ -946,10 +946,6 @@ typedef struct s_PnmiData {
|
|||
* Function prototypes
|
||||
*/
|
||||
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,
|
||||
unsigned int *pLen, SK_U32 Instance, SK_U32 NetIndex);
|
||||
extern int SkPnmiGetStruct(SK_AC *pAC, SK_IOC IoC, void* pBuf,
|
||||
|
|
|
@ -105,7 +105,6 @@
|
|||
|
||||
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 void SkHWLinkUp(SK_AC *pAC, SK_IOC IoC, int Port);
|
||||
extern void SkHWLinkDown(SK_AC *pAC, SK_IOC IoC, int Port);
|
||||
|
||||
#endif /* _INC_SKGESIRQ_H_ */
|
||||
|
|
|
@ -162,9 +162,6 @@ typedef struct s_I2c {
|
|||
} SK_I2C;
|
||||
|
||||
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
|
||||
extern SK_U32 SkI2cRead(SK_AC *pAC, SK_IOC IoC, int Dev, int Size, int Reg,
|
||||
int Burst);
|
||||
|
|
|
@ -183,14 +183,6 @@ extern SK_U32 VpdReadDWord(
|
|||
int addr);
|
||||
#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(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC);
|
||||
|
@ -227,11 +219,6 @@ extern int VpdUpdate(
|
|||
SK_AC *pAC,
|
||||
SK_IOC IoC);
|
||||
|
||||
extern void VpdErrLog(
|
||||
SK_AC *pAC,
|
||||
SK_IOC IoC,
|
||||
char *msg);
|
||||
|
||||
#ifdef SKDIAG
|
||||
extern int VpdReadBlock(
|
||||
SK_AC *pAC,
|
||||
|
@ -249,7 +236,6 @@ extern int VpdWriteBlock(
|
|||
#endif /* SKDIAG */
|
||||
#else /* SK_KR_PROTO */
|
||||
extern SK_U32 VpdReadDWord();
|
||||
extern int VpdSetupPara();
|
||||
extern SK_VPD_STATUS *VpdStat();
|
||||
extern int VpdKeys();
|
||||
extern int VpdRead();
|
||||
|
@ -257,7 +243,6 @@ extern SK_BOOL VpdMayWrite();
|
|||
extern int VpdWrite();
|
||||
extern int VpdDelete();
|
||||
extern int VpdUpdate();
|
||||
extern void VpdErrLog();
|
||||
#endif /* SK_KR_PROTO */
|
||||
|
||||
#endif /* __INC_SKVPD_H_ */
|
||||
|
|
|
@ -87,6 +87,21 @@ static const SK_U16 OnesHash[4] = {0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF};
|
|||
static int Next0[SK_MAX_MACS] = {0};
|
||||
#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 ******************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -372,7 +387,7 @@ int Flags) /* permanent/non-perm, sw-only */
|
|||
* SK_ADDR_SUCCESS
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrXmacMcClear(
|
||||
static int SkAddrXmacMcClear(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* Index of affected port */
|
||||
|
@ -429,7 +444,7 @@ int Flags) /* permanent/non-perm, sw-only */
|
|||
* SK_ADDR_SUCCESS
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrGmacMcClear(
|
||||
static int SkAddrGmacMcClear(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* Index of affected port */
|
||||
|
@ -519,7 +534,7 @@ int Flags) /* permanent/non-perm, sw-only */
|
|||
* Returns:
|
||||
* Hash value of multicast address.
|
||||
*/
|
||||
SK_U32 SkXmacMcHash(
|
||||
static SK_U32 SkXmacMcHash(
|
||||
unsigned char *pMc) /* Multicast address */
|
||||
{
|
||||
SK_U32 Idx;
|
||||
|
@ -557,7 +572,7 @@ unsigned char *pMc) /* Multicast address */
|
|||
* Returns:
|
||||
* Hash value of multicast address.
|
||||
*/
|
||||
SK_U32 SkGmacMcHash(
|
||||
static SK_U32 SkGmacMcHash(
|
||||
unsigned char *pMc) /* Multicast address */
|
||||
{
|
||||
SK_U32 Data;
|
||||
|
@ -672,7 +687,7 @@ int Flags) /* permanent/non-permanent */
|
|||
* SK_MC_ILLEGAL_ADDRESS
|
||||
* SK_MC_RLMT_OVERFLOW
|
||||
*/
|
||||
int SkAddrXmacMcAdd(
|
||||
static int SkAddrXmacMcAdd(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* Port Number */
|
||||
|
@ -778,7 +793,7 @@ int Flags) /* permanent/non-permanent */
|
|||
* SK_MC_FILTERING_INEXACT
|
||||
* SK_MC_ILLEGAL_ADDRESS
|
||||
*/
|
||||
int SkAddrGmacMcAdd(
|
||||
static int SkAddrGmacMcAdd(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* Port Number */
|
||||
|
@ -937,7 +952,7 @@ SK_U32 PortNumber) /* Port Number */
|
|||
* SK_MC_FILTERING_INEXACT
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrXmacMcUpdate(
|
||||
static int SkAddrXmacMcUpdate(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber) /* Port Number */
|
||||
|
@ -1082,7 +1097,7 @@ SK_U32 PortNumber) /* Port Number */
|
|||
* SK_MC_FILTERING_INEXACT
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrGmacMcUpdate(
|
||||
static int SkAddrGmacMcUpdate(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber) /* Port Number */
|
||||
|
@ -1468,7 +1483,7 @@ int NewPromMode) /* new promiscuous mode */
|
|||
* SK_ADDR_SUCCESS
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrXmacPromiscuousChange(
|
||||
static int SkAddrXmacPromiscuousChange(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* port whose promiscuous mode changes */
|
||||
|
@ -1585,7 +1600,7 @@ int NewPromMode) /* new promiscuous mode */
|
|||
* SK_ADDR_SUCCESS
|
||||
* SK_ADDR_ILLEGAL_PORT
|
||||
*/
|
||||
int SkAddrGmacPromiscuousChange(
|
||||
static int SkAddrGmacPromiscuousChange(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC, /* I/O context */
|
||||
SK_U32 PortNumber, /* port whose promiscuous mode changes */
|
||||
|
|
|
@ -57,34 +57,6 @@ static struct s_Config OemConfig = {
|
|||
#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
|
||||
|
@ -952,7 +924,7 @@ int Port) /* Port Index (MAC_1 + n) */
|
|||
* Returns:
|
||||
* nothing
|
||||
*/
|
||||
void SkGeInitRamIface(
|
||||
static void SkGeInitRamIface(
|
||||
SK_AC *pAC, /* adapter context */
|
||||
SK_IOC IoC) /* IO context */
|
||||
{
|
||||
|
@ -1409,83 +1381,6 @@ SK_IOC IoC) /* IO context */
|
|||
|
||||
} /* 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) */
|
||||
SK_IN16(IoC, B0_CTST, &CtrlStat);
|
||||
|
||||
#ifdef SK_PCI_RESET
|
||||
(void)SkGePciReset(pAC, IoC);
|
||||
#endif /* SK_PCI_RESET */
|
||||
|
||||
/* do the SW-reset */
|
||||
SK_OUT8(IoC, B0_CTST, CS_RST_SET);
|
||||
|
||||
|
@ -1991,11 +1882,6 @@ SK_IOC IoC) /* IO context */
|
|||
int i;
|
||||
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))
|
||||
/* ensure I2C is ready */
|
||||
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 */
|
||||
/*
|
||||
* Note: PCI Cfg cycles cannot be used, because they are not
|
||||
|
|
|
@ -871,13 +871,6 @@ PNMI_STATIC const SK_PNMI_TAB_ENTRY IdTable[] = {
|
|||
sizeof(SK_PNMI_CONF),
|
||||
SK_PNMI_OFF(Conf) + SK_PNMI_CNF_OFF(ConfPhyType),
|
||||
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,
|
||||
SK_PNMI_MAC_ENTRIES,
|
||||
sizeof(SK_PNMI_CONF),
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue