Commit 3f102da8 authored by Linus Torvalds's avatar Linus Torvalds

Merge http://gkernel.bkbits.net/net-drivers-2.5

into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux
parents 7c165ccf 3ec5b5ab
This diff is collapsed.
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
=============================================================== ===============================================================
February 5, 2002 April 23, 2002
Contents Contents
...@@ -11,6 +11,7 @@ Contents ...@@ -11,6 +11,7 @@ Contents
- Supported Adapters - Supported Adapters
- Command Line Parameters - Command Line Parameters
- Speed and Duplex Configuration - Speed and Duplex Configuration
- Additional Configurations
- Known Issues - Known Issues
- Support - Support
...@@ -19,17 +20,27 @@ In This Release ...@@ -19,17 +20,27 @@ In This Release
=============== ===============
This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family This file describes the Linux* Base Driver for the Intel(R) PRO/1000 Family
of Adapters, version 4.2.x. of Adapters, version 4.2.x. This driver includes support for
This driver includes support for Itanium(TM)-based systems. Itanium(TM)-based systems.
This release version includes the following: This release version includes the following:
- support for the ethtool 1.4 interface. A third-party application can use - Support for the ethtool 1.5 interface. A third-party application can use
the ethtool interface to get and set driver parameters. the ethtool interface to get and set driver parameters.
- the zero copy feature. Zero copy provides faster information throughput. - Zero copy. This feature provides faster data throughput. Enabled by
By default, this feature is enabled if using a kernel that supports it. default in supporting kernels. It is not supported on the Intel(R)
Zero copy is not supported on the original PWLA8490 (plain) adapter. PRO/1000 Gigabit Server Adapter.
New features include:
- Support for the 82545 and 82546-based adapters listed below
- Wake on LAN* support via ethtool for 82540, 82544, 82545, and 82546-
based adapters
- Adaptive IFS for increased performance at half duplex
Supported Adapters Supported Adapters
...@@ -38,21 +49,32 @@ Supported Adapters ...@@ -38,21 +49,32 @@ Supported Adapters
The following Intel network adapters are compatible with the drivers in this The following Intel network adapters are compatible with the drivers in this
release: release:
Controller Adapter Name Board IDs Controller Adapter Name Board IDs
---------- ------------ --------- ---------- ------------ ---------
82542 PRO/1000 Gigabit Server Adapter 700262-xxx, 717037-xxx
82543 PRO/1000 F Server Adapter 738640-xxx, A38888-xxx
82543 PRO/1000 T Server Adapter A19845-xxx, A33948-xxx
82544 PRO/1000 XT Server Adapter A51580-xxx
82544 PRO/1000 XF Server Adapter A50484-xxx
82542 PRO/1000 Gigabit Server Adapter 700262-xxx, 717037-xxx 82544 PRO/1000 T Desktop Adapter A62947-xxx
82543 PRO/1000 F Server Adapter 738640-xxx, A38888-xxx, 82540 PRO/1000 MT Desktop Adapter A78408-xxx
A06512-xxx
82543 PRO/1000 T Server Adapter A19845-xxx, A33948-xxx 82545 PRO/1000 MT Server Adapter A92165-xxx
82544 PRO/1000 XT Server Adapter A51580-xxx 82546 PRO/1000 MT Dual Port Server Adapter A92111-xxx
82544 PRO/1000 XF Server Adapter A50484-xxx 82545 PRO/1000 MF Server Adapter A91622-xxx
82544 PRO/1000 T Desktop Adapter A62947-xxx 82545 PRO/1000 MF Server Adapter(LX) A91624-xxx
82546 PRO/1000 MF Dual Port Server Adapter A91620-xxx
To verify your Intel adapter is supported, find the board ID number on the To verify your Intel adapter is supported, find the board ID number on the
...@@ -73,8 +95,8 @@ For the latest Intel network drivers for Linux, go to: ...@@ -73,8 +95,8 @@ For the latest Intel network drivers for Linux, go to:
Command Line Parameters Command Line Parameters
======================= =======================
If the driver is built as a module, the following parameters are used by If the driver is built as a module, the following parameters are used by
entering them on the command line with the modprobe or insmod command. entering them on the command line with the modprobe or insmod command.
For example, with two PRO/1000 PCI adapters, entering: For example, with two PRO/1000 PCI adapters, entering:
insmod e1000 TxDescriptors=80,128 insmod e1000 TxDescriptors=80,128
...@@ -86,14 +108,14 @@ For more information about the AutoNeg, Duplex, and Speed parameters, see the ...@@ -86,14 +108,14 @@ For more information about the AutoNeg, Duplex, and Speed parameters, see the
"Speed and Duplex Configuration" section in this document. "Speed and Duplex Configuration" section in this document.
AutoNeg (Intel PRO/1000 T and PRO/1000 XT server adapters only) AutoNeg (adapters using copper connections only)
Valid Range: 0-0x0F, 0x20-0x2F Valid Range: 0x01-0x0F, 0x20-0x2F
Default Value: 0x2F Default Value: 0x2F
This parameter is a bit mask that specifies which speed and duplex This parameter is a bit mask that specifies which speed and duplex
settings the board advertises. When this parameter is used, the Speed and settings the board advertises. When this parameter is used, the Speed and
Duplex parameters must not be specified. Duplex parameters must not be specified.
Duplex (Intel PRO/1000 T and PRO/1000 XT server adapters only) Duplex (adapters using copper connections only)
Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full) Valid Range: 0-2 (0=auto-negotiate, 1=half, 2=full)
Default Value: 0 Default Value: 0
Defines the direction in which data is allowed to flow. Can by either one Defines the direction in which data is allowed to flow. Can by either one
...@@ -109,26 +131,27 @@ Default: Read flow control settings from the EEPROM ...@@ -109,26 +131,27 @@ Default: Read flow control settings from the EEPROM
RxDescriptors RxDescriptors
Valid Range: 80-256 for 82542 and 82543-based adapters Valid Range: 80-256 for 82542 and 82543-based adapters
80-4096 for 82544-based adapters 80-4096 for 82540, 82544, 82545, and 82546-based adapters
Default Value: 256 Default Value: 80
This value is the number of receive descriptors allocated by the driver. This value is the number of receive descriptors allocated by the driver.
Increasing this value allows the driver to buffer more incoming packets. Increasing this value allows the driver to buffer more incoming packets.
Each descriptor is 16 bytes. A receive buffer is also allocated for each Each descriptor is 16 bytes. A receive buffer is also allocated for each
descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending descriptor and can be either 2048, 4096, 8192, or 16384 bytes, depending
on the MTU setting. on the MTU setting. The maximum MTU size is 16110.
RxIntDelay RxIntDelay
Valid Range: 0-65535 (0=off) Valid Range: 0-65535 (0=off)
Default Value: 64 Default Value: 64 (82542, 82543, and 82544-based adapters)
128 (82540, 82545, and 82546-based adapters)
This value delays the generation of receive interrupts in units of 1.024 This value delays the generation of receive interrupts in units of 1.024
microseconds. Receive interrupt reduction can improve CPU efficiency if microseconds. Receive interrupt reduction can improve CPU efficiency if
properly tuned for specific network traffic. Increasing this value adds properly tuned for specific network traffic. Increasing this value adds
extra latency to frame reception and can end up decreasing the throughput extra latency to frame reception and can end up decreasing the throughput
of TCP traffic. If the system is reporting dropped receives, this value of TCP traffic. If the system is reporting dropped receives, this value
may be set too high, causing the driver to run out of available receive may be set too high, causing the driver to run out of available receive
descriptors. descriptors.
Speed (Intel PRO/1000 T and PRO/1000 XT server adapters only) Speed (adapters using copper connections only)
Valid Settings: 0, 10, 100, 1000 Valid Settings: 0, 10, 100, 1000
Default Value: 0 (auto-negotiate at all supported speeds) Default Value: 0 (auto-negotiate at all supported speeds)
Speed forces the line speed to the specified value in megabits per second Speed forces the line speed to the specified value in megabits per second
...@@ -138,21 +161,12 @@ Default Value: 0 (auto-negotiate at all supported speeds) ...@@ -138,21 +161,12 @@ Default Value: 0 (auto-negotiate at all supported speeds)
TxDescriptors TxDescriptors
Valid Range: 80-256 for 82542 and 82543-based adapters Valid Range: 80-256 for 82542 and 82543-based adapters
80-4096 for 82544-based adapters 80-4096 for 82540, 82544, 82545, and 82546-based adapters
Default Value: 256 Default Value: 256
This value is the number of transmit descriptors allocated by the driver. This value is the number of transmit descriptors allocated by the driver.
Increasing this value allows the driver to queue more transmits. Each Increasing this value allows the driver to queue more transmits. Each
descriptor is 16 bytes. descriptor is 16 bytes.
TxIntDelay
Valid Range: 0-65535 (0=off)
Default Value: 64
This value delays the generation of transmit interrupts in units of 1.024
microseconds. Transmit interrupt reduction can improve CPU efficiency if
properly tuned for specific network traffic. If the system is reporting
dropped transmits, this value may be set too high causing the driver to
run out of available transmit descriptors.
XsumRX (not available on the PRO/1000 Gigabit Server Adapter) XsumRX (not available on the PRO/1000 Gigabit Server Adapter)
Valid Range: 0-1 Valid Range: 0-1
Default Value: 1 Default Value: 1
...@@ -163,9 +177,8 @@ Default Value: 1 ...@@ -163,9 +177,8 @@ Default Value: 1
Speed and Duplex Configuration Speed and Duplex Configuration
============================== ==============================
Three keywords are used to control the speed and duplex configuration of the Three keywords are used to control the speed and duplex configuration. These
PRO/1000 T and PRO/1000 XT server adapters. These keywords are Speed, Duplex, keywords are Speed, Duplex, and AutoNeg.
and AutoNeg.
If the board uses a fiber interface, these keywords are ignored, and the If the board uses a fiber interface, these keywords are ignored, and the
fiber interface board only links at 1000 Mbps full-duplex. fiber interface board only links at 1000 Mbps full-duplex.
...@@ -199,16 +212,32 @@ set to auto-negotiate. If the link partner is forced speed/duplex, the ...@@ -199,16 +212,32 @@ set to auto-negotiate. If the link partner is forced speed/duplex, the
adapter MUST be forced to the same speed/duplex. adapter MUST be forced to the same speed/duplex.
Additional Configurations
=========================
Jumbo Frames
------------
The driver supports Jumbo Frames for all adapters except 82542-based
adapters. Jumbo Frames support is enabled by changing the MTU to a value
larger than the default of 1500. Use the ifconfig command to increase the
MTU size. For example:
ifconfig ethx mtu 9000 up
Known Issues Known Issues
============ ============
Driver Hangs Under Heavy Traffic Loads Inconsistent Driver Behavior Under Heavy Traffic Loads
-------------------------------------- ------------------------------------------------------
Intel is aware that previously released e1000 drivers may hang under very Adapters based on the Intel 82543 and 82544 LAN controllers may hang (stop
specific types of heavy traffic loads. This version includes a workaround transmitting) under certain network conditions. If this occurs a message
that resets the adapter automatically if a hang condition is detected. This is logged in the system event log. In addition, the controller is
workaround ensures network traffic flow is not affected when a hang occurs. automatically reset, restoring the network connection. To eliminate the
potential for the hang change the RxIntDelay parameter to zero. For details
on the RxIntDelay parameter see the Command Line Parameters section.
Jumbo Frames System Requirement Jumbo Frames System Requirement
------------------------------- -------------------------------
......
...@@ -795,6 +795,11 @@ P: Tigran Aivazian ...@@ -795,6 +795,11 @@ P: Tigran Aivazian
M: tigran@veritas.com M: tigran@veritas.com
S: Maintained S: Maintained
INTEL PRO/100 ETHERNET SUPPORT
P: Scott Feldman
M: scott.feldman@intel.com
S: Supported
INTEL PRO/1000 GIGABIT ETHERNET SUPPORT INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
P: Chris Leech P: Chris Leech
M: christopher.leech@intel.com M: christopher.leech@intel.com
......
...@@ -828,18 +828,23 @@ CONFIG_E1000 ...@@ -828,18 +828,23 @@ CONFIG_E1000
This driver supports Intel(R) PRO/1000 gigabit ethernet family of This driver supports Intel(R) PRO/1000 gigabit ethernet family of
adapters, which includes: adapters, which includes:
Controller Adapter Name Board IDs Controller Adapter Name Board IDs
---------- ------------ --------- ---------- ------------ ---------
82542 PRO/1000 Gigabit Server Adapter 700262-xxx, 82542 PRO/1000 Gigabit Server Adapter 700262-xxx,
717037-xxx 717037-xxx
82543 PRO/1000 F Server Adapter 738640-xxx, 82543 PRO/1000 F Server Adapter 738640-xxx,
A38888-xxx, A38888-xxx
A06512-xxx 82543 PRO/1000 T Server Adapter A19845-xxx,
82543 PRO/1000 T Server Adapter A19845-xxx, A33948-xxx
A33948-xxx 82544 PRO/1000 XT Server Adapter A51580-xxx
82544 PRO/1000 XT Server Adapter A51580-xxx 82544 PRO/1000 XF Server Adapter A50484-xxx
82544 PRO/1000 XF Server Adapter A50484-xxx 82544 PRO/1000 T Desktop Adapter A62947-xxx
82544 PRO/1000 T Desktop Adapter A62947-xxx 82540 PRO/1000 MT Desktop Adapter A78408-xxx
82545 PRO/1000 MT Server Adapter A92165-xxx
82546 PRO/1000 MT Dual Port Server Adapter A92111-xxx
82545 PRO/1000 MF Server Adapter A91622-xxx
82545 PRO/1000 MF Server Adapter(LX) A91624-xxx
82546 PRO/1000 MF Dual Port Server Adapter A91620-xxx
For more information on how to identify your adapter, go to the For more information on how to identify your adapter, go to the
Adapter & Driver ID Guide at: Adapter & Driver ID Guide at:
...@@ -1358,6 +1363,80 @@ CONFIG_EEPRO100 ...@@ -1358,6 +1363,80 @@ CONFIG_EEPRO100
a module, say M here and read <file:Documentation/modules.txt> as a module, say M here and read <file:Documentation/modules.txt> as
well as <file:Documentation/networking/net-modules.txt>. well as <file:Documentation/networking/net-modules.txt>.
CONFIG_E100
This driver supports Intel(R) PRO/100 family of adapters, which
includes:
Controller Adapter Name Board IDs
---------- ------------ ---------
82558 PRO/100+ PCI Adapter 668081-xxx,
689661-xxx
82558 PRO/100+ Management Adapter 691334-xxx,
701738-xxx,
721383-xxx
82558 PRO/100+ Dual Port Server Adapter 714303-xxx,
711269-xxx,
A28276-xxx
82558 PRO/100+ PCI Server Adapter 710550-xxx
82550 PRO/100 S Server Adapter 752438-xxx
82559 A56831-xxx,
A10563-xxx,
A12171-xxx,
A12321-xxx,
A12320-xxx,
A12170-xxx
748568-xxx
748565-xxx
82550 PRO/100 S Desktop Adapter 751767-xxx
82559 748592-xxx,
A12167-xxx,
A12318-xxx,
A12317-xxx,
A12165-xxx,
748569-xxx
82559 PRO/100+ Server Adapter 729757-xxx
82559 PRO/100 S Management Adapter 748566-xxx,
748564-xxx
82550 PRO/100 S Dual Port Server Adapter A56831-xxx
82551 PRO/100 M Desktop Adapter A80897-xxx
PRO/100 S Advanced Management Adapter
747842-xxx,
745171-xxx
CNR PRO/100 VE Desktop Adapter A10386-xxx,
A10725-xxx,
A23801-xxx,
A19716-xxx
PRO/100 VM Desktop Adapter A14323-xxx,
A19725-xxx,
A23801-xxx,
A22220-xxx,
A23796-xxx
To verify that your adapter is supported, find the board ID number
on the adapter. Look for a label that has a barcode and a number
in the format 123456-001 (six digits hyphen three digits). Match
this to the list of numbers above.
For more information on how to identify your adapter, go to the
Adapter & Driver ID Guide at:
http://support.intel.com/support/network/adapter/pro100/21397.htm
For the latest Intel PRO/100 network driver for Linux, see:
http://appsr.intel.com/scripts-df/support_intel.asp
More specific information on configuring the driver is in
<file:Documentation/networking/e100.txt>.
This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called e100.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt> as well
as <file:Documentation/networking/net-modules.txt>.
CONFIG_FEALNX CONFIG_FEALNX
Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet
cards. Specifications and data at cards. Specifications and data at
......
This diff is collapsed.
...@@ -119,13 +119,13 @@ enum dl2x_offsets { ...@@ -119,13 +119,13 @@ enum dl2x_offsets {
McstOctetRcvOk = 0xac, McstOctetRcvOk = 0xac,
BcstOctetRcvOk = 0xb0, BcstOctetRcvOk = 0xb0,
FramesRcvOk = 0xb4, FramesRcvOk = 0xb4,
McstFramesRcvOk = 0xb8, McstFramesRcvdOk = 0xb8,
BcstFramesRcvOk = 0xbe, BcstFramesRcvdOk = 0xbe,
MacControlFramesRcvd = 0xc6, MacControlFramesRcvd = 0xc6,
FrameTooLongErrors = 0xc8, FrameTooLongErrors = 0xc8,
InRangeLengthErrors = 0xca, InRangeLengthErrors = 0xca,
FrameCheckSeqError = 0xcc, FramesCheckSeqErrors = 0xcc,
FrameLostRxError = 0xce, FramesLostRxErrors = 0xce,
OctetXmtOk = 0xd0, OctetXmtOk = 0xd0,
McstOctetXmtOk = 0xd4, McstOctetXmtOk = 0xd4,
BcstOctetXmtOk = 0xd8, BcstOctetXmtOk = 0xd8,
...@@ -264,6 +264,7 @@ enum RFS_bits { ...@@ -264,6 +264,7 @@ enum RFS_bits {
FrameEnd = 0x40000000, FrameEnd = 0x40000000,
RFDDone = 0x80000000, RFDDone = 0x80000000,
TCIShift = 32, TCIShift = 32,
RFS_Errors = 0x003f0000,
}; };
#define MII_RESET_TIME_OUT 10000 #define MII_RESET_TIME_OUT 10000
...@@ -648,7 +649,7 @@ struct netdev_private { ...@@ -648,7 +649,7 @@ struct netdev_private {
dma_addr_t tx_ring_dma; dma_addr_t tx_ring_dma;
dma_addr_t rx_ring_dma; dma_addr_t rx_ring_dma;
struct pci_dev *pdev; struct pci_dev *pdev;
spinlock_t lock; spinlock_t tx_lock;
spinlock_t rx_lock; spinlock_t rx_lock;
struct net_device_stats stats; struct net_device_stats stats;
unsigned int rx_buf_sz; /* Based on MTU+slack. */ unsigned int rx_buf_sz; /* Based on MTU+slack. */
...@@ -657,7 +658,6 @@ struct netdev_private { ...@@ -657,7 +658,6 @@ struct netdev_private {
unsigned int chip_id; /* PCI table chip id */ unsigned int chip_id; /* PCI table chip id */
unsigned int rx_coalesce; /* Maximum frames each RxDMAComplete intr */ unsigned int rx_coalesce; /* Maximum frames each RxDMAComplete intr */
unsigned int rx_timeout; /* Wait time between RxDMAComplete intr */ unsigned int rx_timeout; /* Wait time between RxDMAComplete intr */
unsigned int tx_full:1; /* The Tx queue is full. */
unsigned int full_duplex:1; /* Full-duplex operation requested. */ unsigned int full_duplex:1; /* Full-duplex operation requested. */
unsigned int an_enable:2; /* Auto-Negotiated Enable */ unsigned int an_enable:2; /* Auto-Negotiated Enable */
unsigned int jumbo:1; /* Jumbo frame enable */ unsigned int jumbo:1; /* Jumbo frame enable */
...@@ -665,6 +665,7 @@ struct netdev_private { ...@@ -665,6 +665,7 @@ struct netdev_private {
unsigned int tx_flow:1; /* Tx flow control enable */ unsigned int tx_flow:1; /* Tx flow control enable */
unsigned int rx_flow:1; /* Rx flow control enable */ unsigned int rx_flow:1; /* Rx flow control enable */
unsigned int phy_media:1; /* 1: fiber, 0: copper */ unsigned int phy_media:1; /* 1: fiber, 0: copper */
unsigned int link_status:1; /* Current link status */
unsigned char pci_rev_id; /* PCI revision ID */ unsigned char pci_rev_id; /* PCI revision ID */
struct netdev_desc *last_tx; /* Last Tx descriptor used. */ struct netdev_desc *last_tx; /* Last Tx descriptor used. */
unsigned long cur_rx, old_rx; /* Producer/consumer ring indices */ unsigned long cur_rx, old_rx; /* Producer/consumer ring indices */
...@@ -677,8 +678,6 @@ struct netdev_private { ...@@ -677,8 +678,6 @@ struct netdev_private {
u16 advertising; /* NWay media advertisement */ u16 advertising; /* NWay media advertisement */
u16 negotiate; /* Negotiated media */ u16 negotiate; /* Negotiated media */
int phy_addr; /* PHY addresses. */ int phy_addr; /* PHY addresses. */
int tx_debug;
int rx_debug;
}; };
/* The station address location in the EEPROM. */ /* The station address location in the EEPROM. */
...@@ -707,114 +706,4 @@ MODULE_DEVICE_TABLE (pci, rio_pci_tbl); ...@@ -707,114 +706,4 @@ MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
#define DEFAULT_RXT 750 #define DEFAULT_RXT 750
#define DEFAULT_TXC 1 #define DEFAULT_TXC 1
#define MAX_TXC 8 #define MAX_TXC 8
#ifdef RIO_DEBUG
#define DEBUG_TFD_DUMP(x) debug_tfd_dump(x)
#define DEBUG_RFD_DUMP(x,flag) debug_rfd_dump(x,flag)
#define DEBUG_PKT_DUMP(x,len) debug_pkt_dump(x,len)
#define DEBUG_PRINT printk
static inline void
debug_tfd_dump (struct netdev_private *np)
{
int i;
struct netdev_desc *desc;
if (np->tx_debug == 6) {
printk ("TFDone Dump: ");
for (i = 0; i < TX_RING_SIZE; i++) {
desc = &np->tx_ring[i];
if ((desc->fraginfo & 0xffffffffff) == 0)
printk ("X");
else
printk ("%d", (desc->status & TFDDone) ? 1 : 0);
}
printk ("\n");
}
if (np->tx_debug == 5) {
for (i = 0; i < TX_RING_SIZE; i++) {
desc = &np->tx_ring[i];
printk
("cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x",
(u32) np->tx_ring_dma + i * sizeof (*desc),
(u32) desc->next_desc, (u32) desc->status,
(u32) (desc->fraginfo >> 32),
(u32) desc->fraginfo);
printk ("\n");
}
printk ("\n");
}
}
static inline void
debug_rfd_dump (struct netdev_private *np, int flag)
{
int i;
struct netdev_desc *desc;
int entry = np->cur_rx % RX_RING_SIZE;
if (np->rx_debug == 5) {
for (i = 0; i < RX_RING_SIZE; i++) {
desc = &np->rx_ring[i];
printk
("cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x",
(u32) np->rx_ring_dma + i * sizeof (*desc),
(u32) desc->next_desc, (u32) desc->status,
(u32) (desc->fraginfo >> 32),
(u32) desc->fraginfo);
printk ("\n");
}
printk ("\n");
}
if (np->rx_debug == 6) {
if (flag == 1)
printk ("RFDone Dump: ");
else if (flag == 2)
printk ("Re-Filling: ");
for (i = 0; i < RX_RING_SIZE; i++) {
desc = &np->rx_ring[i];
printk ("%d", (desc->status & RFDDone) ? 1 : 0);
}
printk ("\n");
}
if (np->rx_debug == 7) {
printk (" In rcv_pkt(), entry %d status %4.4x %4.4x.\n",
entry, (u32) (np->rx_ring[entry].status >> 32),
(u32) np->rx_ring[entry].status);
}
}
static inline void
debug_pkt_dump (struct netdev_private *np, int pkt_len)
{
int entry = np->cur_rx % RX_RING_SIZE;
struct netdev_desc *desc = &np->rx_ring[entry];
u64 frame_status = le64_to_cpu (desc->status);
unsigned char *pchar;
unsigned char *phead;
int i;
if (np->rx_debug == 4) {
printk (" rcv_pkt: status was %4.4x %4.4x.\n",
(u32) (frame_status >> 32), (u32) frame_status);
}
if (np->rx_debug == 7) {
#error Please convert me to Documentation/DMA-mapping.txt
phead =
bus_to_virt (le64_to_cpu (desc->fraginfo & 0xffffffffff));
for (pchar = phead, i = 0; i < pkt_len; i++, pchar++) {
printk ("%02x ", *pchar);
if ((i + 1) % 20 == 0)
printk ("\n");
}
}
}
#else
#define DEBUG_TFD_DUMP(x) {}
#define DEBUG_RFD_DUMP(x,flag) {}
#define DEBUG_PKT_DUMP(x,len) {}
#define DEBUG_PRINT() {}
#endif
#endif /* __DL2K_H__ */ #endif /* __DL2K_H__ */
...@@ -503,6 +503,7 @@ enum led_state_e { ...@@ -503,6 +503,7 @@ enum led_state_e {
#define IS_BACHELOR 0x00000010 /* set if 82558 or newer board */ #define IS_BACHELOR 0x00000010 /* set if 82558 or newer board */
#define IS_ICH 0x00000020 #define IS_ICH 0x00000020
#define DF_SPEED_FORCED 0x00000040 /* set if speed is forced */ #define DF_SPEED_FORCED 0x00000040 /* set if speed is forced */
#define LED_IS_ON 0x00000080 /* LED is turned ON by the driver */
typedef struct net_device_stats net_dev_stats_t; typedef struct net_device_stats net_dev_stats_t;
...@@ -909,7 +910,6 @@ struct ethtool_lpbk_data{ ...@@ -909,7 +910,6 @@ struct ethtool_lpbk_data{
}; };
#endif #endif
struct e100_private { struct e100_private {
u32 flags; /* board management flags */ u32 flags; /* board management flags */
u32 tx_per_underrun; /* number of good tx frames per underrun */ u32 tx_per_underrun; /* number of good tx frames per underrun */
...@@ -998,8 +998,11 @@ struct e100_private { ...@@ -998,8 +998,11 @@ struct e100_private {
u32 wolopts; u32 wolopts;
u16 ip_lbytes; u16 ip_lbytes;
#endif #endif
#ifdef ETHTOOL_TEST #ifdef ETHTOOL_TEST
struct ethtool_lpbk_data loopback; struct ethtool_lpbk_data loopback;
#endif
#ifdef ETHTOOL_PHYS_ID
struct timer_list blink_timer; /* led blink timer id */
#endif #endif
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -593,7 +593,6 @@ e100_config_wol(struct e100_private *bdp) ...@@ -593,7 +593,6 @@ e100_config_wol(struct e100_private *bdp)
} }
#endif #endif
#ifdef ETHTOOL_TEST
/** /**
* e100_config_loopback_mode * e100_config_loopback_mode
* @bdp: atapter's private data struct * @bdp: atapter's private data struct
...@@ -690,5 +689,4 @@ e100_config_dynamic_tbd(struct e100_private *bdp, unsigned char enable) ...@@ -690,5 +689,4 @@ e100_config_dynamic_tbd(struct e100_private *bdp, unsigned char enable)
return bc_changed; return bc_changed;
} }
#endif
...@@ -163,6 +163,9 @@ static char *test_strings[] = { ...@@ -163,6 +163,9 @@ static char *test_strings[] = {
"E100_LPBK_PHY_FAIL" "E100_LPBK_PHY_FAIL"
}; };
#endif
#ifdef ETHTOOL_PHYS_ID
static int e100_ethtool_led_blink(struct net_device *, struct ifreq *);
#endif #endif
#endif /*E100_ETHTOOL_IOCTL */ #endif /*E100_ETHTOOL_IOCTL */
...@@ -182,7 +185,7 @@ static void e100_non_tx_background(unsigned long); ...@@ -182,7 +185,7 @@ static void e100_non_tx_background(unsigned long);
/* Global Data structures and variables */ /* Global Data structures and variables */
char e100_copyright[] __devinitdata = "Copyright (c) 2002 Intel Corporation"; char e100_copyright[] __devinitdata = "Copyright (c) 2002 Intel Corporation";
#define E100_VERSION "2.0.27-pre3" #define E100_VERSION "2.0.30-k1"
#define E100_FULL_DRIVER_NAME "Intel(R) PRO/100 Fast Ethernet Adapter - Loadable driver, ver " #define E100_FULL_DRIVER_NAME "Intel(R) PRO/100 Fast Ethernet Adapter - Loadable driver, ver "
...@@ -691,9 +694,10 @@ e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent) ...@@ -691,9 +694,10 @@ e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent)
#ifdef ETHTOOL_GWOL #ifdef ETHTOOL_GWOL
/* Disabling all WOLs as initialization */ /* Disabling all WOLs as initialization */
bdp->wolsupported = bdp->wolopts = 0; bdp->wolsupported = bdp->wolopts = 0;
if (bdp->rev_id >= D101MA_REV_ID) { if (bdp->rev_id >= D101A4_REV_ID) {
bdp->wolsupported = bdp->wolsupported = WAKE_PHY | WAKE_MAGIC;
WAKE_PHY | WAKE_UCAST | WAKE_ARP | WAKE_MAGIC; if (bdp->rev_id >= D101MA_REV_ID)
bdp->wolsupported |= WAKE_UCAST | WAKE_ARP;
bdp->wolopts = WAKE_MAGIC; bdp->wolopts = WAKE_MAGIC;
} }
#endif #endif
...@@ -3334,6 +3338,11 @@ e100_do_ethtool_ioctl(struct net_device *dev, struct ifreq *ifr) ...@@ -3334,6 +3338,11 @@ e100_do_ethtool_ioctl(struct net_device *dev, struct ifreq *ifr)
case ETHTOOL_GSTRINGS: case ETHTOOL_GSTRINGS:
rc = e100_ethtool_gstrings(dev,ifr); rc = e100_ethtool_gstrings(dev,ifr);
break; break;
#endif
#ifdef ETHTOOL_PHYS_ID
case ETHTOOL_PHYS_ID:
rc = e100_ethtool_led_blink(dev,ifr);
break;
#endif #endif
default: default:
break; break;
...@@ -3641,6 +3650,94 @@ e100_ethtool_eeprom(struct net_device *dev, struct ifreq *ifr) ...@@ -3641,6 +3650,94 @@ e100_ethtool_eeprom(struct net_device *dev, struct ifreq *ifr)
} }
#endif #endif
#ifdef ETHTOOL_PHYS_ID
#define E100_BLINK_INTERVAL (HZ/4)
/**
* e100_led_control
* @bdp: atapter's private data struct
* @led_mdi_op: led operation
*
* Software control over adapter's led. The possible operations are:
* TURN LED OFF, TURN LED ON and RETURN LED CONTROL TO HARDWARE.
*/
static void
e100_led_control(struct e100_private *bdp, u16 led_mdi_op)
{
spin_lock_bh(&bdp->mdi_access_lock);
e100_mdi_write(bdp, PHY_82555_LED_SWITCH_CONTROL,
bdp->phy_addr, led_mdi_op);
spin_unlock_bh(&bdp->mdi_access_lock);
}
/**
* e100_led_blink_callback
* @data: pointer to atapter's private data struct
*
* Blink timer callback function. Toggles ON/OFF led status bit and calls
* led hardware access function.
*/
static void
e100_led_blink_callback(unsigned long data)
{
struct e100_private *bdp = (struct e100_private *) data;
if(bdp->flags & LED_IS_ON) {
bdp->flags &= ~LED_IS_ON;
e100_led_control(bdp, PHY_82555_LED_OFF);
} else {
bdp->flags |= LED_IS_ON;
if (bdp->rev_id >= D101MA_REV_ID)
e100_led_control(bdp, PHY_82555_LED_ON_559);
else
e100_led_control(bdp, PHY_82555_LED_ON_PRE_559);
}
mod_timer(&bdp->blink_timer, jiffies + E100_BLINK_INTERVAL);
}
/**
* e100_ethtool_led_blink
* @dev: pointer to atapter's net_device struct
* @ifr: pointer to ioctl request structure
*
* Blink led ioctl handler. Initialtes blink timer and sleeps until
* blink period expires. Than it kills timer and returns. The led control
* is returned back to hardware when blink timer is killed.
*/
static int
e100_ethtool_led_blink(struct net_device *dev, struct ifreq *ifr)
{
struct e100_private *bdp;
struct ethtool_value ecmd;
bdp = dev->priv;
if (copy_from_user(&ecmd, ifr->ifr_data, sizeof (ecmd)))
return -EFAULT;
if(!bdp->blink_timer.function) {
init_timer(&bdp->blink_timer);
bdp->blink_timer.function = e100_led_blink_callback;
bdp->blink_timer.data = (unsigned long) bdp;
}
mod_timer(&bdp->blink_timer, jiffies);
set_current_state(TASK_INTERRUPTIBLE);
if ((!ecmd.data) || (ecmd.data > MAX_SCHEDULE_TIMEOUT / HZ))
ecmd.data = MAX_SCHEDULE_TIMEOUT / HZ;
schedule_timeout(ecmd.data * HZ);
del_timer_sync(&bdp->blink_timer);
e100_led_control(bdp, PHY_82555_LED_NORMAL_CONTROL);
return 0;
}
#endif
static inline int __devinit static inline int __devinit
e100_10BaseT_adapter(struct e100_private *bdp) e100_10BaseT_adapter(struct e100_private *bdp)
{ {
......
...@@ -548,7 +548,7 @@ read_bundle_max_def(char *page, char **start, off_t off, ...@@ -548,7 +548,7 @@ read_bundle_max_def(char *page, char **start, off_t off,
int len; int len;
len = read_int_param(page, "CPU Saver Maximum Bundle", len = read_int_param(page, "CPU Saver Maximum Bundle",
"Sets the value for CPU saver's maximum value", "Sets CPU saver's maximum value",
E100_DEFAULT_CPUSAVER_BUNDLE_MAX, 0x1, 0xFFFF); E100_DEFAULT_CPUSAVER_BUNDLE_MAX, 0x1, 0xFFFF);
return generic_read(page, start, off, count, eof, len); return generic_read(page, start, off, count, eof, len);
......
...@@ -69,6 +69,7 @@ AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR ...@@ -69,6 +69,7 @@ AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/ *******************************************************************************/
#include "e100.h" #include "e100.h"
#include "e100_config.h" #include "e100_config.h"
#ifdef ETHTOOL_TEST #ifdef ETHTOOL_TEST
...@@ -458,10 +459,3 @@ e100_diag_loopback_free (struct e100_private *bdp) ...@@ -458,10 +459,3 @@ e100_diag_loopback_free (struct e100_private *bdp)
#endif #endif
################################################################################
#
# This software program is available to you under a choice of one of two
# licenses. You may choose to be licensed under either the GNU General Public
# License 2.0, June 1991, available at http://www.fsf.org/copyleft/gpl.html,
# or the Intel BSD + Patent License, the text of which follows:
#
# Recipient has requested a license and Intel Corporation ("Intel") is willing
# to grant a license for the software entitled Linux Base Driver for the
# Intel(R) PRO/1000 Family of Adapters (e1000) (the "Software") being provided
# by Intel Corporation. The following definitions apply to this license:
#
# "Licensed Patents" means patent claims licensable by Intel Corporation which
# are necessarily infringed by the use of sale of the Software alone or when
# combined with the operating system referred to below.
#
# "Recipient" means the party to whom Intel delivers this Software.
#
# "Licensee" means Recipient and those third parties that receive a license to
# any operating system available under the GNU General Public License 2.0 or
# later.
#
# Copyright (c) 1999 - 2002 Intel Corporation.
# All rights reserved.
#
# The license is provided to Recipient and Recipient's Licensees under the
# following terms.
#
# Redistribution and use in source and binary forms of the Software, with or
# without modification, are permitted provided that the following conditions
# are met:
#
# Redistributions of source code of the Software may retain the above
# copyright notice, this list of conditions and the following disclaimer.
#
# Redistributions in binary form of the Software may reproduce the above
# copyright notice, this list of conditions and the following disclaimer in
# the documentation and/or materials provided with the distribution.
#
# Neither the name of Intel Corporation nor the names of its contributors
# shall be used to endorse or promote products derived from this Software
# without specific prior written permission.
#
# Intel hereby grants Recipient and Licensees a non-exclusive, worldwide,
# royalty-free patent license under Licensed Patents to make, use, sell, offer
# to sell, import and otherwise transfer the Software, if any, in source code
# and object code form. This license shall include changes to the Software
# that are error corrections or other minor changes to the Software that do
# not add functionality or features when the Software is incorporated in any
# version of an operating system that has been distributed under the GNU
# General Public License 2.0 or later. This patent license shall apply to the
# combination of the Software and any operating system licensed under the GNU
# General Public License 2.0 or later if, at the time Intel provides the
# Software to Recipient, such addition of the Software to the then publicly
# available versions of such operating systems available under the GNU General
# Public License 2.0 or later (whether in gold, beta or alpha form) causes
# such combination to be covered by the Licensed Patents. The patent license
# shall not apply to any other combinations which include the Software. NO
# hardware per se is licensed hereunder.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MECHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR IT CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# ANY LOSS OF USE; DATA, OR PROFITS; OR BUSINESS INTERUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
################################################################################
# #
# Makefile for the Intel(R) PRO/1000 ethernet driver # Makefile for the Intel(R) PRO/1000 ethernet driver
# #
......
...@@ -107,18 +107,21 @@ ...@@ -107,18 +107,21 @@
#include <linux/udp.h> #include <linux/udp.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <linux/list.h> #include <linux/list.h>
#include <asm/uaccess.h> #include <linux/reboot.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#ifdef NETIF_F_HW_VLAN_TX #ifdef NETIF_F_HW_VLAN_TX
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#endif #endif
#define BAR_0 0
#define PCI_DMA_64BIT 0xffffffffffffffffULL
#define PCI_DMA_32BIT 0x00000000ffffffffULL
struct e1000_adapter; struct e1000_adapter;
#include "e1000_hw.h" #include "e1000_hw.h"
#define BAR_0 0
#if DBG #if DBG
#define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args) #define E1000_DBG(args...) printk(KERN_DEBUG "e1000: " args)
#else #else
...@@ -156,6 +159,7 @@ struct e1000_buffer { ...@@ -156,6 +159,7 @@ struct e1000_buffer {
struct sk_buff *skb; struct sk_buff *skb;
uint64_t dma; uint64_t dma;
unsigned long length; unsigned long length;
unsigned long time_stamp;
}; };
struct e1000_desc_ring { struct e1000_desc_ring {
...@@ -204,10 +208,13 @@ struct e1000_adapter { ...@@ -204,10 +208,13 @@ struct e1000_adapter {
spinlock_t stats_lock; spinlock_t stats_lock;
atomic_t irq_sem; atomic_t irq_sem;
#ifdef ETHTOOL_PHYS_ID
struct timer_list blink_timer;
unsigned long led_status;
#endif
/* TX */ /* TX */
struct e1000_desc_ring tx_ring; struct e1000_desc_ring tx_ring;
unsigned long trans_finish;
spinlock_t tx_lock;
uint32_t txd_cmd; uint32_t txd_cmd;
int max_data_per_txd; int max_data_per_txd;
...@@ -228,6 +235,9 @@ struct e1000_adapter { ...@@ -228,6 +235,9 @@ struct e1000_adapter {
struct e1000_hw_stats stats; struct e1000_hw_stats stats;
struct e1000_phy_info phy_info; struct e1000_phy_info phy_info;
struct e1000_phy_stats phy_stats; struct e1000_phy_stats phy_stats;
};
uint32_t pci_state[16];
};
#endif /* _E1000_H_ */ #endif /* _E1000_H_ */
...@@ -75,7 +75,6 @@ ...@@ -75,7 +75,6 @@
#include "e1000.h" #include "e1000.h"
#include <linux/ethtool.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
extern char e1000_driver_name[]; extern char e1000_driver_name[];
...@@ -83,7 +82,6 @@ extern char e1000_driver_version[]; ...@@ -83,7 +82,6 @@ extern char e1000_driver_version[];
extern int e1000_up(struct e1000_adapter *adapter); extern int e1000_up(struct e1000_adapter *adapter);
extern void e1000_down(struct e1000_adapter *adapter); extern void e1000_down(struct e1000_adapter *adapter);
extern void e1000_enable_WOL(struct e1000_adapter *adapter);
static void static void
e1000_ethtool_gset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd) e1000_ethtool_gset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
...@@ -128,7 +126,11 @@ e1000_ethtool_gset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd) ...@@ -128,7 +126,11 @@ e1000_ethtool_gset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
SUPPORTED_Autoneg); SUPPORTED_Autoneg);
ecmd->port = PORT_FIBRE; ecmd->port = PORT_FIBRE;
ecmd->transceiver = XCVR_EXTERNAL;
if(hw->mac_type >= e1000_82545)
ecmd->transceiver = XCVR_INTERNAL;
else
ecmd->transceiver = XCVR_EXTERNAL;
} }
if(netif_carrier_ok(adapter->netdev)) { if(netif_carrier_ok(adapter->netdev)) {
...@@ -211,9 +213,37 @@ e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter, ...@@ -211,9 +213,37 @@ e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter,
strncpy(drvinfo->version, e1000_driver_version, 32); strncpy(drvinfo->version, e1000_driver_version, 32);
strncpy(drvinfo->fw_version, "", 32); strncpy(drvinfo->fw_version, "", 32);
strncpy(drvinfo->bus_info, adapter->pdev->slot_name, 32); strncpy(drvinfo->bus_info, adapter->pdev->slot_name, 32);
#define E1000_REGS_LEN 32
drvinfo->regdump_len = E1000_REGS_LEN * sizeof(uint32_t);
drvinfo->eedump_len = e1000_eeprom_size(&adapter->hw); drvinfo->eedump_len = e1000_eeprom_size(&adapter->hw);
} }
static void
e1000_ethtool_gregs(struct e1000_adapter *adapter,
struct ethtool_regs *regs, uint32_t *regs_buff)
{
struct e1000_hw *hw = &adapter->hw;
regs->version = (1 << 24) | (hw->revision_id << 16) | hw->device_id;
regs_buff[0] = E1000_READ_REG(hw, CTRL);
regs_buff[1] = E1000_READ_REG(hw, STATUS);
regs_buff[2] = E1000_READ_REG(hw, RCTL);
regs_buff[3] = E1000_READ_REG(hw, RDLEN);
regs_buff[4] = E1000_READ_REG(hw, RDH);
regs_buff[5] = E1000_READ_REG(hw, RDT);
regs_buff[6] = E1000_READ_REG(hw, RDTR);
regs_buff[7] = E1000_READ_REG(hw, TCTL);
regs_buff[8] = E1000_READ_REG(hw, TDLEN);
regs_buff[9] = E1000_READ_REG(hw, TDH);
regs_buff[10] = E1000_READ_REG(hw, TDT);
regs_buff[11] = E1000_READ_REG(hw, TIDV);
return;
}
static void static void
e1000_ethtool_geeprom(struct e1000_adapter *adapter, e1000_ethtool_geeprom(struct e1000_adapter *adapter,
struct ethtool_eeprom *eeprom, uint16_t *eeprom_buff) struct ethtool_eeprom *eeprom, uint16_t *eeprom_buff)
...@@ -228,7 +258,7 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter, ...@@ -228,7 +258,7 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter,
if ((eeprom->offset + eeprom->len) > max_len) if ((eeprom->offset + eeprom->len) > max_len)
eeprom->len = (max_len - eeprom->offset); eeprom->len = (max_len - eeprom->offset);
for(i = 0; i < max_len; i++) for(i = 0; i < (max_len >> 1); i++)
e1000_read_eeprom(&adapter->hw, i, &eeprom_buff[i]); e1000_read_eeprom(&adapter->hw, i, &eeprom_buff[i]);
} }
...@@ -236,27 +266,50 @@ static void ...@@ -236,27 +266,50 @@ static void
e1000_ethtool_gwol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol) e1000_ethtool_gwol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if(hw->mac_type < e1000_82544) { switch(adapter->hw.device_id) {
case E1000_DEV_ID_82542:
case E1000_DEV_ID_82543GC_FIBER:
case E1000_DEV_ID_82543GC_COPPER:
case E1000_DEV_ID_82544EI_FIBER:
default:
wol->supported = 0; wol->supported = 0;
wol->wolopts = 0; wol->wolopts = 0;
return; return;
}
wol->supported = WAKE_PHY | WAKE_UCAST | case E1000_DEV_ID_82546EB_FIBER:
WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC; /* Wake events only supported on port A for dual fiber */
if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) {
wol->wolopts = 0; wol->supported = 0;
if(adapter->wol & E1000_WUFC_LNKC) wol->wolopts = 0;
wol->wolopts |= WAKE_PHY; return;
if(adapter->wol & E1000_WUFC_EX) }
wol->wolopts |= WAKE_UCAST; /* Fall Through */
if(adapter->wol & E1000_WUFC_MC)
wol->wolopts |= WAKE_MCAST; case E1000_DEV_ID_82544EI_COPPER:
if(adapter->wol & E1000_WUFC_BC) case E1000_DEV_ID_82544GC_COPPER:
wol->wolopts |= WAKE_BCAST; case E1000_DEV_ID_82544GC_LOM:
if(adapter->wol & E1000_WUFC_MAG) case E1000_DEV_ID_82540EM:
wol->wolopts |= WAKE_MAGIC; case E1000_DEV_ID_82540EM_LOM:
case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82545EM_FIBER:
case E1000_DEV_ID_82546EB_COPPER:
wol->supported = WAKE_PHY | WAKE_UCAST |
WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC;
wol->wolopts = 0;
if(adapter->wol & E1000_WUFC_LNKC)
wol->wolopts |= WAKE_PHY;
if(adapter->wol & E1000_WUFC_EX)
wol->wolopts |= WAKE_UCAST;
if(adapter->wol & E1000_WUFC_MC)
wol->wolopts |= WAKE_MCAST;
if(adapter->wol & E1000_WUFC_BC)
wol->wolopts |= WAKE_BCAST;
if(adapter->wol & E1000_WUFC_MAG)
wol->wolopts |= WAKE_MAGIC;
return;
}
} }
static int static int
...@@ -264,25 +317,95 @@ e1000_ethtool_swol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol) ...@@ -264,25 +317,95 @@ e1000_ethtool_swol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if(hw->mac_type < e1000_82544) switch(adapter->hw.device_id) {
case E1000_DEV_ID_82542:
case E1000_DEV_ID_82543GC_FIBER:
case E1000_DEV_ID_82543GC_COPPER:
case E1000_DEV_ID_82544EI_FIBER:
default:
return wol->wolopts ? -EOPNOTSUPP : 0; return wol->wolopts ? -EOPNOTSUPP : 0;
adapter->wol = 0; case E1000_DEV_ID_82546EB_FIBER:
/* Wake events only supported on port A for dual fiber */
if(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)
return wol->wolopts ? -EOPNOTSUPP : 0;
/* Fall Through */
case E1000_DEV_ID_82544EI_COPPER:
case E1000_DEV_ID_82544GC_COPPER:
case E1000_DEV_ID_82544GC_LOM:
case E1000_DEV_ID_82540EM:
case E1000_DEV_ID_82540EM_LOM:
case E1000_DEV_ID_82545EM_COPPER:
case E1000_DEV_ID_82545EM_FIBER:
case E1000_DEV_ID_82546EB_COPPER:
if(wol->wolopts & WAKE_ARP)
return -EOPNOTSUPP;
adapter->wol = 0;
if(wol->wolopts & WAKE_PHY)
adapter->wol |= E1000_WUFC_LNKC;
if(wol->wolopts & WAKE_UCAST)
adapter->wol |= E1000_WUFC_EX;
if(wol->wolopts & WAKE_MCAST)
adapter->wol |= E1000_WUFC_MC;
if(wol->wolopts & WAKE_BCAST)
adapter->wol |= E1000_WUFC_BC;
if(wol->wolopts & WAKE_MAGIC)
adapter->wol |= E1000_WUFC_MAG;
}
return 0;
}
#ifdef ETHTOOL_PHYS_ID
/* toggle LED 4 times per second = 2 "blinks" per second */
#define E1000_ID_INTERVAL (HZ/4)
/* bit defines for adapter->led_status */
#define E1000_LED_ON 0
static void
e1000_led_blink_callback(unsigned long data)
{
struct e1000_adapter *adapter = (struct e1000_adapter *) data;
if(test_and_change_bit(E1000_LED_ON, &adapter->led_status))
e1000_led_off(&adapter->hw);
else
e1000_led_on(&adapter->hw);
mod_timer(&adapter->blink_timer, jiffies + E1000_ID_INTERVAL);
}
if(wol->wolopts & WAKE_PHY) static int
adapter->wol |= E1000_WUFC_LNKC; e1000_ethtool_led_blink(struct e1000_adapter *adapter, struct ethtool_value *id)
if(wol->wolopts & WAKE_UCAST) {
adapter->wol |= E1000_WUFC_EX; if(!adapter->blink_timer.function) {
if(wol->wolopts & WAKE_MCAST) init_timer(&adapter->blink_timer);
adapter->wol |= E1000_WUFC_MC; adapter->blink_timer.function = e1000_led_blink_callback;
if(wol->wolopts & WAKE_BCAST) adapter->blink_timer.data = (unsigned long) adapter;
adapter->wol |= E1000_WUFC_BC; }
if(wol->wolopts & WAKE_MAGIC)
adapter->wol |= E1000_WUFC_MAG; e1000_setup_led(&adapter->hw);
mod_timer(&adapter->blink_timer, jiffies);
set_current_state(TASK_INTERRUPTIBLE);
if(id->data)
schedule_timeout(id->data * HZ);
else
schedule_timeout(MAX_SCHEDULE_TIMEOUT);
del_timer_sync(&adapter->blink_timer);
e1000_led_off(&adapter->hw);
clear_bit(E1000_LED_ON, &adapter->led_status);
e1000_cleanup_led(&adapter->hw);
e1000_enable_WOL(adapter);
return 0; return 0;
} }
#endif /* ETHTOOL_PHYS_ID */
int int
e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr) e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr)
...@@ -317,6 +440,22 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr) ...@@ -317,6 +440,22 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr)
return -EFAULT; return -EFAULT;
return 0; return 0;
} }
case ETHTOOL_GREGS: {
struct ethtool_regs regs = {ETHTOOL_GREGS};
uint32_t regs_buff[E1000_REGS_LEN];
if(copy_from_user(&regs, addr, sizeof(regs)))
return -EFAULT;
e1000_ethtool_gregs(adapter, &regs, regs_buff);
if(copy_to_user(addr, &regs, sizeof(regs)))
return -EFAULT;
addr += offsetof(struct ethtool_regs, data);
if(copy_to_user(addr, regs_buff, regs.len))
return -EFAULT;
return 0;
}
case ETHTOOL_NWAY_RST: { case ETHTOOL_NWAY_RST: {
if(!capable(CAP_NET_ADMIN)) if(!capable(CAP_NET_ADMIN))
return -EPERM; return -EPERM;
...@@ -324,6 +463,14 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr) ...@@ -324,6 +463,14 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr)
e1000_up(adapter); e1000_up(adapter);
return 0; return 0;
} }
#ifdef ETHTOOL_PHYS_ID
case ETHTOOL_PHYS_ID: {
struct ethtool_value id;
if(copy_from_user(&id, addr, sizeof(id)))
return -EFAULT;
return e1000_ethtool_led_blink(adapter, &id);
}
#endif /* ETHTOOL_PHYS_ID */
case ETHTOOL_GLINK: { case ETHTOOL_GLINK: {
struct ethtool_value link = {ETHTOOL_GLINK}; struct ethtool_value link = {ETHTOOL_GLINK};
link.data = netif_carrier_ok(netdev); link.data = netif_carrier_ok(netdev);
......
This diff is collapsed.
...@@ -92,6 +92,8 @@ typedef enum { ...@@ -92,6 +92,8 @@ typedef enum {
e1000_82543, e1000_82543,
e1000_82544, e1000_82544,
e1000_82540, e1000_82540,
e1000_82545,
e1000_82546,
e1000_num_macs e1000_num_macs
} e1000_mac_type; } e1000_mac_type;
...@@ -260,6 +262,7 @@ void e1000_reset_adaptive(struct e1000_hw *hw); ...@@ -260,6 +262,7 @@ void e1000_reset_adaptive(struct e1000_hw *hw);
void e1000_update_adaptive(struct e1000_hw *hw); void e1000_update_adaptive(struct e1000_hw *hw);
void e1000_tbi_adjust_stats(struct e1000_hw *hw, struct e1000_hw_stats *stats, uint32_t frame_len, uint8_t * mac_addr); void e1000_tbi_adjust_stats(struct e1000_hw *hw, struct e1000_hw_stats *stats, uint32_t frame_len, uint8_t * mac_addr);
void e1000_get_bus_info(struct e1000_hw *hw); void e1000_get_bus_info(struct e1000_hw *hw);
void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
/* PCI Device IDs */ /* PCI Device IDs */
...@@ -272,7 +275,11 @@ void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); ...@@ -272,7 +275,11 @@ void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
#define E1000_DEV_ID_82544GC_LOM 0x100D #define E1000_DEV_ID_82544GC_LOM 0x100D
#define E1000_DEV_ID_82540EM 0x100E #define E1000_DEV_ID_82540EM 0x100E
#define E1000_DEV_ID_82540EM_LOM 0x1015 #define E1000_DEV_ID_82540EM_LOM 0x1015
#define NUM_DEV_IDS 9 #define E1000_DEV_ID_82545EM_COPPER 0x100F
#define E1000_DEV_ID_82545EM_FIBER 0x1011
#define E1000_DEV_ID_82546EB_COPPER 0x1010
#define E1000_DEV_ID_82546EB_FIBER 0x1012
#define NUM_DEV_IDS 13
#define NODE_ADDRESS_SIZE 6 #define NODE_ADDRESS_SIZE 6
#define ETH_LENGTH_OF_ADDRESS 6 #define ETH_LENGTH_OF_ADDRESS 6
...@@ -882,7 +889,9 @@ struct e1000_hw { ...@@ -882,7 +889,9 @@ struct e1000_hw {
uint32_t num_mc_addrs; uint32_t num_mc_addrs;
uint32_t collision_delta; uint32_t collision_delta;
uint32_t tx_packet_delta; uint32_t tx_packet_delta;
uint32_t ledctl; uint32_t ledctl_default;
uint32_t ledctl_mode1;
uint32_t ledctl_mode2;
uint16_t autoneg_advertised; uint16_t autoneg_advertised;
uint16_t pci_cmd_word; uint16_t pci_cmd_word;
uint16_t fc_high_water; uint16_t fc_high_water;
...@@ -1324,10 +1333,28 @@ struct e1000_hw { ...@@ -1324,10 +1333,28 @@ struct e1000_hw {
#define EEPROM_EWDS_OPCODE 0x10 /* EERPOM erast/write disable */ #define EEPROM_EWDS_OPCODE 0x10 /* EERPOM erast/write disable */
/* EEPROM Word Offsets */ /* EEPROM Word Offsets */
#define EEPROM_INIT_CONTROL1_REG 0x000A #define EEPROM_ID_LED_SETTINGS 0x0004
#define EEPROM_INIT_CONTROL2_REG 0x000F #define EEPROM_INIT_CONTROL1_REG 0x000A
#define EEPROM_FLASH_VERSION 0x0032 #define EEPROM_INIT_CONTROL2_REG 0x000F
#define EEPROM_CHECKSUM_REG 0x003F #define EEPROM_FLASH_VERSION 0x0032
#define EEPROM_CHECKSUM_REG 0x003F
/* Word definitions for ID LED Settings */
#define ID_LED_RESERVED_0000 0x0000
#define ID_LED_RESERVED_FFFF 0xFFFF
#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \
(ID_LED_OFF1_OFF2 << 8) | \
(ID_LED_DEF1_DEF2 << 4) | \
(ID_LED_DEF1_DEF2))
#define ID_LED_DEF1_DEF2 0x1
#define ID_LED_DEF1_ON2 0x2
#define ID_LED_DEF1_OFF2 0x3
#define ID_LED_ON1_DEF2 0x4
#define ID_LED_ON1_ON2 0x5
#define ID_LED_ON1_OFF2 0x6
#define ID_LED_OFF1_DEF2 0x7
#define ID_LED_OFF1_ON2 0x8
#define ID_LED_OFF1_OFF2 0x9
/* Mask bits for fields in Word 0x0a of the EEPROM */ /* Mask bits for fields in Word 0x0a of the EEPROM */
#define EEPROM_WORD0A_ILOS 0x0010 #define EEPROM_WORD0A_ILOS 0x0010
...@@ -1414,6 +1441,16 @@ struct e1000_hw { ...@@ -1414,6 +1441,16 @@ struct e1000_hw {
#define FC_DEFAULT_LO_THRESH (0x4000) /* 16KB */ #define FC_DEFAULT_LO_THRESH (0x4000) /* 16KB */
#define FC_DEFAULT_TX_TIMER (0x100) /* ~130 us */ #define FC_DEFAULT_TX_TIMER (0x100) /* ~130 us */
/* PCIX Config space */
#define PCIX_COMMAND_REGISTER 0xE6
#define PCIX_STATUS_REGISTER_LO 0xE8
#define PCIX_STATUS_REGISTER_HI 0xEA
#define PCIX_COMMAND_MMRBC_MASK 0x000C
#define PCIX_COMMAND_MMRBC_SHIFT 0x2
#define PCIX_STATUS_HI_MMRBC_MASK 0x0060
#define PCIX_STATUS_HI_MMRBC_SHIFT 0x5
/* The number of bits that we need to shift right to move the "pause" /* The number of bits that we need to shift right to move the "pause"
* bits from the EEPROM (bits 13:12) to the "pause" (bits 8:7) field * bits from the EEPROM (bits 13:12) to the "pause" (bits 8:7) field
......
This diff is collapsed.
...@@ -86,12 +86,14 @@ ...@@ -86,12 +86,14 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#define usec_delay(x) udelay(x) #define usec_delay(x) udelay(x)
#ifndef msec_delay
#define msec_delay(x) do { if(in_interrupt()) { \ #define msec_delay(x) do { if(in_interrupt()) { \
mdelay(x); \ mdelay(x); \
} else { \ } else { \
set_current_state(TASK_UNINTERRUPTIBLE); \ set_current_state(TASK_UNINTERRUPTIBLE); \
schedule_timeout((x * HZ)/1000); \ schedule_timeout((x * HZ)/1000); \
} } while(0) } } while(0)
#endif
#define PCI_COMMAND_REGISTER PCI_COMMAND #define PCI_COMMAND_REGISTER PCI_COMMAND
#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE #define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE
......
...@@ -524,10 +524,8 @@ static const char is_mii[] = { 0, 1, 1, 0, 1, 1, 0, 1 }; ...@@ -524,10 +524,8 @@ static const char is_mii[] = { 0, 1, 1, 0, 1, 1, 0, 1 };
static int eepro100_init_one(struct pci_dev *pdev, static int eepro100_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent); const struct pci_device_id *ent);
static void eepro100_remove_one (struct pci_dev *pdev); static void eepro100_remove_one (struct pci_dev *pdev);
#ifdef CONFIG_PM
static int eepro100_suspend (struct pci_dev *pdev, u32 state); static int eepro100_suspend (struct pci_dev *pdev, u32 state);
static int eepro100_resume (struct pci_dev *pdev); static int eepro100_resume (struct pci_dev *pdev);
#endif
static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len); static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len);
static int mdio_read(long ioaddr, int phy_id, int location); static int mdio_read(long ioaddr, int phy_id, int location);
......
...@@ -845,8 +845,9 @@ pcnet32_open(struct net_device *dev) ...@@ -845,8 +845,9 @@ pcnet32_open(struct net_device *dev)
if (lp->options == (PCNET32_PORT_FD | PCNET32_PORT_AUI)) if (lp->options == (PCNET32_PORT_FD | PCNET32_PORT_AUI))
val |= 2; val |= 2;
} else if (lp->options & PCNET32_PORT_ASEL) { } else if (lp->options & PCNET32_PORT_ASEL) {
/* workaround for xSeries250 */ /* workaround of xSeries250, turn on for 79C975 only */
val |= 3; i = ((lp->a.read_csr(ioaddr, 88) | (lp->a.read_csr(ioaddr,89) << 16)) >> 12) & 0xffff;
if (i == 0x2627) val |= 3;
} }
lp->a.write_bcr (ioaddr, 9, val); lp->a.write_bcr (ioaddr, 9, val);
} }
......
This diff is collapsed.
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
* Copyright (C) 1998 David S. Miller (davem@redhat.com) * Copyright (C) 1998 David S. Miller (davem@redhat.com)
* Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com> * Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
* Portions Copyright 2001 Sun Microsystems (thockin@sun.com) * Portions Copyright 2001 Sun Microsystems (thockin@sun.com)
* Portions Copyright 2002 Intel (eli.kupermann@intel.com,
* christopher.leech@intel.com,
* scott.feldman@intel.com)
*/ */
#ifndef _LINUX_ETHTOOL_H #ifndef _LINUX_ETHTOOL_H
...@@ -268,6 +271,7 @@ struct ethtool_test { ...@@ -268,6 +271,7 @@ struct ethtool_test {
* (ethtool_value), priv. */ * (ethtool_value), priv. */
#define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */ #define ETHTOOL_TEST 0x0000001a /* execute NIC self-test, priv. */
#define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */ #define ETHTOOL_GSTRINGS 0x0000001b /* get specified string set */
#define ETHTOOL_PHYS_ID 0x0000001c /* identify the NIC */
/* compatibility with older code */ /* compatibility with older code */
#define SPARC_ETH_GSET ETHTOOL_GSET #define SPARC_ETH_GSET ETHTOOL_GSET
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment