Commit 5ae2c9cf authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/davem/sparc-2.5

into home.transmeta.com:/home/torvalds/v2.5/linux
parents 54689d55 3a4ec59d
Linux* Base Driver for the Intel(R) PRO/100 Family of Adapters Linux* Base Driver for the Intel(R) PRO/100 Family of Adapters
============================================================== ==============================================================
September 16, 2002 November 19, 2002
Contents Contents
...@@ -19,7 +19,7 @@ In This Release ...@@ -19,7 +19,7 @@ In This Release
=============== ===============
This file describes the Linux* Base Driver for the Intel(R) PRO/100 Family of This file describes the Linux* Base Driver for the Intel(R) PRO/100 Family of
Adapters, version 2.1.x. This driver includes support for Itanium(TM)-based Adapters, version 2.2.x. This driver includes support for Itanium(TM)-based
systems. systems.
...@@ -94,8 +94,9 @@ For the latest Intel PRO/100 network driver for Linux, see: ...@@ -94,8 +94,9 @@ For the latest Intel PRO/100 network driver for Linux, see:
Command Line Parameters Command Line Parameters
======================= =======================
The following optional parameters are used by entering them on the command If the driver is built as a module, the following optional parameters are
line with the modprobe or insmod command using this syntax: used by entering them on the command line with the modprobe or insmod command
using this syntax:
modprobe e100 [<option>=<VAL1>,<VAL2>,...] modprobe e100 [<option>=<VAL1>,<VAL2>,...]
......
Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters Linux* Base Driver for the Intel(R) PRO/1000 Family of Adapters
=============================================================== ===============================================================
October 12, 2002 January 8, 2003
Contents Contents
...@@ -20,27 +20,11 @@ In This Release ...@@ -20,27 +20,11 @@ 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.4.x. This driver includes support for of Adapters, version 5.0.x. This driver includes support for
Itanium(TM)-based systems. Itanium(TM)-based systems.
This release version includes the following:
- Support for the ethtool 1.6 interface. A third-party application can use
the ethtool interface to get and set driver parameters.
- Zero copy. This feature provides faster data throughput. Enabled by
default in supporting kernels. It is not supported on the Intel(R)
PRO/1000 Gigabit Server Adapter.
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
Native VLANs are now available with supported kernels.
Supported Adapters Supported Adapters
...@@ -65,6 +49,7 @@ release: ...@@ -65,6 +49,7 @@ release:
82544 PRO/1000 T Desktop Adapter A62947-xxx 82544 PRO/1000 T Desktop Adapter A62947-xxx
82540 PRO/1000 MT Desktop Adapter A78408-xxx 82540 PRO/1000 MT Desktop Adapter A78408-xxx
82541 C91016-xxx
82545 PRO/1000 MT Server Adapter A92165-xxx 82545 PRO/1000 MT Server Adapter A92165-xxx
...@@ -77,26 +62,32 @@ release: ...@@ -77,26 +62,32 @@ release:
82546 PRO/1000 MF Dual Port Server Adapter A91620-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
adapter. Look for a label that has a barcode and a number in the format of 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 A12345-001. Match this to the list of numbers above.
numbers above.
For more information on how to identify your adapter, go to the Adapter & For more information on how to identify your adapter, go to the Adapter &
Driver ID Guide at: Driver ID Guide at:
http://support.intel.com/support/network/adapter/pro100/21397.htm http://support.intel.com/support/network/adapter/pro100/21397.htm
For the latest Intel network drivers for Linux, go to: For the latest Intel network drivers for Linux, refer to the following
http://appsr.intel.com/scripts-df/support_intel.asp http://downloadfinder.intel.com/scripts-df/support_intel.asp
Command Line Parameters Command Line Parameters
======================= =======================
If the driver is built as a module, the following optional parameters are If the driver is built as a module, the following optional parameters are
used by entering them on the command line with the modprobe or insmod command. used by entering them on the command line with the modprobe or insmod command
using this syntax:
modprobe e1000 [<option>=<VAL1>,<VAL2>,...]
insmod e1000 [<option>=<VAL1>,<VAL2>,...]
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
...@@ -104,6 +95,9 @@ For example, with two PRO/1000 PCI adapters, entering: ...@@ -104,6 +95,9 @@ For example, with two PRO/1000 PCI adapters, entering:
loads the e1000 driver with 80 TX resources for the first adapter and 128 TX loads the e1000 driver with 80 TX resources for the first adapter and 128 TX
resources for the second adapter. resources for the second adapter.
The default value for each parameter is generally the recommended setting,
unless otherwise noted.
For more information about the AutoNeg, Duplex, and Speed parameters, see the 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.
...@@ -129,6 +123,20 @@ Default: Read flow control settings from the EEPROM ...@@ -129,6 +123,20 @@ Default: Read flow control settings from the EEPROM
This parameter controls the automatic generation(Tx) and response(Rx) to This parameter controls the automatic generation(Tx) and response(Rx) to
Ethernet PAUSE frames. Ethernet PAUSE frames.
InterruptThrottleRate
Valid Range: 100-100000 (0=off, 1=dynamic)
Default Value: 1
This value represents the maximum number of interrupts per second the
controller generates. InterruptThrottleRate is another setting used in
interrupt moderation. Dynamic mode uses a heuristic algorithm to adjust
InterruptThrottleRate based on the current traffic load.
NOTE: InterruptThrottleRate takes precedence over the TxAbsIntDelay and
RxAbsIntDelay parameters. In other words, minimizing the receive
and/or transmit absolute delays does not force the controller to
generate more interrupts than what the Interrupt Throttle Rate
allows.
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 82540, 82544, 82545, and 82546-based adapters 80-4096 for 82540, 82544, 82545, and 82546-based adapters
...@@ -176,7 +184,7 @@ Default Value: 0 (auto-negotiate at all supported speeds) ...@@ -176,7 +184,7 @@ 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
(Mbps). If this parameter is not specified or is set to 0 and the link (Mbps). If this parameter is not specified or is set to 0 and the link
partner is set to auto-negotiate, the board will auto-detect the correct partner is set to auto-negotiate, the board will auto-detect the correct
speed. Duplex must also be set when Speed is set to either 10 or 100. speed. Duplex should also be set when Speed is set to either 10 or 100.
TxDescriptors TxDescriptors
Valid Range: 80-256 for 82542 and 82543-based adapters Valid Range: 80-256 for 82542 and 82543-based adapters
...@@ -205,7 +213,7 @@ Default Value: 64 ...@@ -205,7 +213,7 @@ Default Value: 64
along with TxIntDelay, may improve traffic throughput in specific along with TxIntDelay, may improve traffic throughput in specific
network conditions. network conditions.
XsumRX (not available on the PRO/1000 Gigabit Server Adapter) XsumRX (not available on the 82542-based adapter)
Valid Range: 0-1 Valid Range: 0-1
Default Value: 1 Default Value: 1
A value of '1' indicates that the driver should enable IP checksum A value of '1' indicates that the driver should enable IP checksum
...@@ -230,8 +238,8 @@ For copper-based boards, the keywords interact as follows: ...@@ -230,8 +238,8 @@ For copper-based boards, the keywords interact as follows:
If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps is If Speed = 1000, limited auto-negotiation is enabled and only 1000 Mbps is
advertised (The 1000BaseT spec requires auto-negotiation.) advertised (The 1000BaseT spec requires auto-negotiation.)
If Speed = 10 or 100, then both Speed and Duplex must be set. Auto- If Speed = 10 or 100, then both Speed and Duplex should be set. Auto-
negotiation is disabled, and the AutoNeg parameter is ignored. Partner MUST negotiation is disabled, and the AutoNeg parameter is ignored. Partner SHOULD
also be forced. also be forced.
The AutoNeg parameter is used when more control is required over the auto- The AutoNeg parameter is used when more control is required over the auto-
...@@ -263,6 +271,12 @@ Additional Configurations ...@@ -263,6 +271,12 @@ Additional Configurations
ifconfig ethx mtu 9000 up ifconfig ethx mtu 9000 up
The maximum MTU setting for Jumbo Frames is 16110. This value coincides
with the maximum Jumbo Frames size of 16128.
NOTE: Jumbo Frames are supported at 1000 Mbps only. Using Jumbo Frames at
10 or 100 Mbps may result in poor performance or loss of link.
Known Issues Known Issues
============ ============
...@@ -279,7 +293,7 @@ Known Issues ...@@ -279,7 +293,7 @@ Known Issues
Support Support
======= =======
For general information and support, go to the Intel support website at: For general information, go to the Intel support website at:
http://support.intel.com http://support.intel.com
......
...@@ -923,10 +923,11 @@ M: scott.feldman@intel.com ...@@ -923,10 +923,11 @@ M: scott.feldman@intel.com
S: Supported S: Supported
INTEL PRO/1000 GIGABIT ETHERNET SUPPORT INTEL PRO/1000 GIGABIT ETHERNET SUPPORT
P: Chris Leech P: Jeb Cramer
M: christopher.leech@intel.com M: cramerj@intel.com
P: Scott Feldman P: Scott Feldman
M: scott.feldman@intel.com M: scott.feldman@intel.com
W: http://sourceforge.net/projects/e1000/
S: Supported S: Supported
INTERMEZZO FILE SYSTEM INTERMEZZO FILE SYSTEM
......
...@@ -73,10 +73,10 @@ NT_MASK = 0x00004000 ...@@ -73,10 +73,10 @@ NT_MASK = 0x00004000
VM_MASK = 0x00020000 VM_MASK = 0x00020000
/* /*
* ESP0 is at offset 4. 0x100 is the size of the TSS, and * ESP0 is at offset 4. 0x200 is the size of the TSS, and
* also thus the top-of-stack pointer offset of SYSENTER_ESP * also thus the top-of-stack pointer offset of SYSENTER_ESP
*/ */
TSS_ESP0_OFFSET = (4 - 0x100) TSS_ESP0_OFFSET = (4 - 0x200)
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
#define preempt_stop cli #define preempt_stop cli
...@@ -479,23 +479,32 @@ device_not_available_emulate: ...@@ -479,23 +479,32 @@ device_not_available_emulate:
* by hand onto the new stack - while updating the return eip past * by hand onto the new stack - while updating the return eip past
* the instruction that would have done it for sysenter. * the instruction that would have done it for sysenter.
*/ */
#define CHECK_SYSENTER_EIP \ #define FIX_STACK(offset, ok, label) \
cmpl $sysenter_entry,(%esp); \ cmpw $__KERNEL_CS,4(%esp); \
jne 1f; \ jne ok; \
movl TSS_ESP0_OFFSET+12(%esp),%esp; \ label: \
movl TSS_ESP0_OFFSET+offset(%esp),%esp; \
pushfl; \ pushfl; \
pushl $__KERNEL_CS; \ pushl $__KERNEL_CS; \
pushl $sysenter_past_esp; \ pushl $sysenter_past_esp
1:
ENTRY(debug) ENTRY(debug)
CHECK_SYSENTER_EIP cmpl $sysenter_entry,(%esp)
jne debug_stack_correct
FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn)
debug_stack_correct:
pushl $0 pushl $0
pushl $do_debug pushl $do_debug
jmp error_code jmp error_code
ENTRY(nmi) ENTRY(nmi)
CHECK_SYSENTER_EIP cmpl $sysenter_entry,(%esp)
je nmi_stack_fixup
cmpl $debug - 1,(%esp)
jle nmi_stack_correct
cmpl $debug_esp_fix_insn,(%esp)
jle nmi_debug_stack_fixup
nmi_stack_correct:
pushl %eax pushl %eax
SAVE_ALL SAVE_ALL
movl %esp, %edx movl %esp, %edx
...@@ -505,6 +514,13 @@ ENTRY(nmi) ...@@ -505,6 +514,13 @@ ENTRY(nmi)
addl $8, %esp addl $8, %esp
RESTORE_ALL RESTORE_ALL
nmi_stack_fixup:
FIX_STACK(12,nmi_stack_correct, 1)
jmp nmi_stack_correct
nmi_debug_stack_fixup:
FIX_STACK(24,nmi_stack_correct, 1)
jmp nmi_stack_correct
ENTRY(int3) ENTRY(int3)
pushl $0 pushl $0
pushl $do_int3 pushl $do_int3
......
...@@ -56,6 +56,10 @@ ...@@ -56,6 +56,10 @@
v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org> v1.19b 08Nov2002 Marc Zyngier <maz@wild-wind.fr.eu.org>
- Introduce driver model for EISA cards. - Introduce driver model for EISA cards.
*/ */
/*
FIXES for PC-9800:
Shu Iwanaga: 3c569B(PC-9801 C-bus) support
*/
#define DRV_NAME "3c509" #define DRV_NAME "3c509"
#define DRV_VERSION "1.19b" #define DRV_VERSION "1.19b"
...@@ -257,7 +261,7 @@ static struct mca_driver el3_mca_driver = { ...@@ -257,7 +261,7 @@ static struct mca_driver el3_mca_driver = {
}; };
#endif /* CONFIG_MCA */ #endif /* CONFIG_MCA */
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
static struct isapnp_device_id el3_isapnp_adapters[] __initdata = { static struct isapnp_device_id el3_isapnp_adapters[] __initdata = {
{ ISAPNP_ANY_ID, ISAPNP_ANY_ID, { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5090), ISAPNP_VENDOR('T', 'C', 'M'), ISAPNP_FUNCTION(0x5090),
...@@ -350,7 +354,7 @@ static void el3_common_remove (struct net_device *dev) ...@@ -350,7 +354,7 @@ static void el3_common_remove (struct net_device *dev)
if (lp->pmdev) if (lp->pmdev)
pm_unregister(lp->pmdev); pm_unregister(lp->pmdev);
#endif #endif
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
if (lp->type == EL3_PNP) if (lp->type == EL3_PNP)
pnp_device_detach(to_pnp_dev(lp->dev)); pnp_device_detach(to_pnp_dev(lp->dev));
#endif #endif
...@@ -368,12 +372,12 @@ static int __init el3_probe(int card_idx) ...@@ -368,12 +372,12 @@ static int __init el3_probe(int card_idx)
int ioaddr, irq, if_port; int ioaddr, irq, if_port;
u16 phys_addr[3]; u16 phys_addr[3];
static int current_tag; static int current_tag;
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
static int pnp_cards; static int pnp_cards;
struct pnp_dev *idev = NULL; struct pnp_dev *idev = NULL;
#endif /* __ISAPNP__ */ #endif /* __ISAPNP__ */
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
if (nopnp == 1) if (nopnp == 1)
goto no_pnp; goto no_pnp;
...@@ -421,6 +425,9 @@ static int __init el3_probe(int card_idx) ...@@ -421,6 +425,9 @@ static int __init el3_probe(int card_idx)
no_pnp: no_pnp:
#endif /* __ISAPNP__ */ #endif /* __ISAPNP__ */
#ifdef CONFIG_X86_PC9800
id_port = 0x71d0;
#else
/* Select an open I/O location at 0x1*0 to do contention select. */ /* Select an open I/O location at 0x1*0 to do contention select. */
for ( ; id_port < 0x200; id_port += 0x10) { for ( ; id_port < 0x200; id_port += 0x10) {
if (check_region(id_port, 1)) if (check_region(id_port, 1))
...@@ -435,6 +442,7 @@ static int __init el3_probe(int card_idx) ...@@ -435,6 +442,7 @@ static int __init el3_probe(int card_idx)
printk(" WARNING: No I/O port available for 3c509 activation.\n"); printk(" WARNING: No I/O port available for 3c509 activation.\n");
return -ENODEV; return -ENODEV;
} }
#endif /* CONFIG_X86_PC9800 */
/* Next check for all ISA bus boards by sending the ID sequence to the /* Next check for all ISA bus boards by sending the ID sequence to the
ID_PORT. We find cards past the first by setting the 'current_tag' ID_PORT. We find cards past the first by setting the 'current_tag'
on cards as they are found. Cards with their tag set will not on cards as they are found. Cards with their tag set will not
...@@ -465,7 +473,7 @@ static int __init el3_probe(int card_idx) ...@@ -465,7 +473,7 @@ static int __init el3_probe(int card_idx)
phys_addr[i] = htons(id_read_eeprom(i)); phys_addr[i] = htons(id_read_eeprom(i));
} }
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
if (nopnp == 0) { if (nopnp == 0) {
/* The ISA PnP 3c509 cards respond to the ID sequence. /* The ISA PnP 3c509 cards respond to the ID sequence.
This check is needed in order not to register them twice. */ This check is needed in order not to register them twice. */
...@@ -490,9 +498,19 @@ static int __init el3_probe(int card_idx) ...@@ -490,9 +498,19 @@ static int __init el3_probe(int card_idx)
{ {
unsigned int iobase = id_read_eeprom(8); unsigned int iobase = id_read_eeprom(8);
if_port = iobase >> 14; if_port = iobase >> 14;
#ifdef CONFIG_X86_PC9800
ioaddr = 0x40d0 + ((iobase & 0x1f) << 8);
#else
ioaddr = 0x200 + ((iobase & 0x1f) << 4); ioaddr = 0x200 + ((iobase & 0x1f) << 4);
#endif
} }
irq = id_read_eeprom(9) >> 12; irq = id_read_eeprom(9) >> 12;
#ifdef CONFIG_X86_PC9800
if (irq == 7)
irq = 6;
else if (irq == 15)
irq = 13;
#endif
if (!(dev = init_etherdev(NULL, sizeof(struct el3_private)))) if (!(dev = init_etherdev(NULL, sizeof(struct el3_private))))
return -ENOMEM; return -ENOMEM;
...@@ -522,7 +540,11 @@ static int __init el3_probe(int card_idx) ...@@ -522,7 +540,11 @@ static int __init el3_probe(int card_idx)
outb(0xd0 + ++current_tag, id_port); outb(0xd0 + ++current_tag, id_port);
/* Activate the adaptor at the EEPROM location. */ /* Activate the adaptor at the EEPROM location. */
#ifdef CONFIG_X86_PC9800
outb((ioaddr >> 8) | 0xe0, id_port);
#else
outb((ioaddr >> 4) | 0xe0, id_port); outb((ioaddr >> 4) | 0xe0, id_port);
#endif
EL3WINDOW(0); EL3WINDOW(0);
if (inw(ioaddr) != 0x6d50) { if (inw(ioaddr) != 0x6d50) {
...@@ -534,7 +556,7 @@ static int __init el3_probe(int card_idx) ...@@ -534,7 +556,7 @@ static int __init el3_probe(int card_idx)
/* Free the interrupt so that some other card can use it. */ /* Free the interrupt so that some other card can use it. */
outw(0x0f00, ioaddr + WN0_IRQ); outw(0x0f00, ioaddr + WN0_IRQ);
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
found: /* PNP jumps here... */ found: /* PNP jumps here... */
#endif /* __ISAPNP__ */ #endif /* __ISAPNP__ */
...@@ -543,7 +565,7 @@ static int __init el3_probe(int card_idx) ...@@ -543,7 +565,7 @@ static int __init el3_probe(int card_idx)
dev->irq = irq; dev->irq = irq;
dev->if_port = if_port; dev->if_port = if_port;
lp = dev->priv; lp = dev->priv;
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
lp->dev = &idev->dev; lp->dev = &idev->dev;
#endif #endif
...@@ -1388,6 +1410,12 @@ el3_up(struct net_device *dev) ...@@ -1388,6 +1410,12 @@ el3_up(struct net_device *dev)
outw(0x0001, ioaddr + 4); outw(0x0001, ioaddr + 4);
/* Set the IRQ line. */ /* Set the IRQ line. */
#ifdef CONFIG_X86_PC9800
if (dev->irq == 6)
dev->irq = 7;
else if (dev->irq == 13)
dev->irq = 15;
#endif
outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ); outw((dev->irq << 12) | 0x0f00, ioaddr + WN0_IRQ);
/* Set the station address in window 2 each time opened. */ /* Set the station address in window 2 each time opened. */
...@@ -1550,7 +1578,7 @@ MODULE_PARM_DESC(debug, "debug level (0-6)"); ...@@ -1550,7 +1578,7 @@ MODULE_PARM_DESC(debug, "debug level (0-6)");
MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)"); MODULE_PARM_DESC(irq, "IRQ number(s) (assigned)");
MODULE_PARM_DESC(xcvr,"transceiver(s) (0=internal, 1=external)"); MODULE_PARM_DESC(xcvr,"transceiver(s) (0=internal, 1=external)");
MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt"); MODULE_PARM_DESC(max_interrupt_work, "maximum events handled per interrupt");
#ifdef __ISAPNP__ #if defined(__ISAPNP__) && !defined(CONFIG_X86_PC9800)
MODULE_PARM(nopnp, "i"); MODULE_PARM(nopnp, "i");
MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)"); MODULE_PARM_DESC(nopnp, "disable ISA PnP support (0-1)");
MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters); MODULE_DEVICE_TABLE(isapnp, el3_isapnp_adapters);
......
...@@ -123,7 +123,8 @@ struct ei_device { ...@@ -123,7 +123,8 @@ struct ei_device {
#define inb_p(port) in_8(port) #define inb_p(port) in_8(port)
#define outb_p(val,port) out_8(port,val) #define outb_p(val,port) out_8(port,val)
#elif defined(CONFIG_ARM_ETHERH) || defined(CONFIG_ARM_ETHERH_MODULE) #elif defined(CONFIG_ARM_ETHERH) || defined(CONFIG_ARM_ETHERH_MODULE) || \
defined(CONFIG_NET_CBUS)
#define EI_SHIFT(x) (ei_local->reg_offset[x]) #define EI_SHIFT(x) (ei_local->reg_offset[x])
#else #else
#define EI_SHIFT(x) (x) #define EI_SHIFT(x) (x)
......
...@@ -663,7 +663,7 @@ config EL16 ...@@ -663,7 +663,7 @@ config EL16
as <file:Documentation/networking/net-modules.txt>. as <file:Documentation/networking/net-modules.txt>.
config EL3 config EL3
tristate "3c509/3c529 (MCA)/3c579 \"EtherLink III\" support" tristate "3c509/3c529 (MCA)/3c569B (98)/3c579 \"EtherLink III\" support"
depends on NET_VENDOR_3COM && (ISA || EISA || MCA) depends on NET_VENDOR_3COM && (ISA || EISA || MCA)
---help--- ---help---
If you have a network (Ethernet) card belonging to the 3Com If you have a network (Ethernet) card belonging to the 3Com
...@@ -932,7 +932,7 @@ config NI65 ...@@ -932,7 +932,7 @@ config NI65
source "drivers/net/tulip/Kconfig" source "drivers/net/tulip/Kconfig"
config AT1700 config AT1700
tristate "AT1700/1720 support (EXPERIMENTAL)" tristate "AT1700/1720/RE1000Plus(C-Bus) support (EXPERIMENTAL)"
depends on NET_ETHERNET && (ISA || MCA) && EXPERIMENTAL depends on NET_ETHERNET && (ISA || MCA) && EXPERIMENTAL
---help--- ---help---
If you have a network (Ethernet) card of this type, say Y and read If you have a network (Ethernet) card of this type, say Y and read
...@@ -978,7 +978,7 @@ config HP100 ...@@ -978,7 +978,7 @@ config HP100
config NET_ISA config NET_ISA
bool "Other ISA cards" bool "Other ISA cards"
depends on NET_ETHERNET && ISA depends on NET_ETHERNET && ISA && !X86_PC9800
---help--- ---help---
If your network (Ethernet) card hasn't been mentioned yet and its If your network (Ethernet) card hasn't been mentioned yet and its
bus system (that's the way the cards talks to the other components bus system (that's the way the cards talks to the other components
...@@ -1176,6 +1176,55 @@ config SK_G16 ...@@ -1176,6 +1176,55 @@ config SK_G16
the Ethernet-HOWTO, available from the Ethernet-HOWTO, available from
<http://www.linuxdoc.org/docs.html#howto>. <http://www.linuxdoc.org/docs.html#howto>.
config NET_CBUS
bool "NEC PC-9800 C-bus cards"
depends on NET_ETHERNET && ISA && X86_PC9800
---help---
If your network (Ethernet) card hasn't been mentioned yet and its
bus system (that's the way the cards talks to the other components
of your computer) is NEC PC-9800 C-Bus, say Y.
config NE2K_CBUS
tristate "Most NE2000-based Ethernet support"
depends on NET_CBUS
config NE2K_CBUS_EGY98
bool "Melco EGY-98 support"
depends on NE2K_CBUS
config NE2K_CBUS_LGY98
bool "Melco LGY-98 support"
depends on NE2K_CBUS
config NE2K_CBUS_ICM
bool "ICM IF-27xxET support"
depends on NE2K_CBUS
config NE2K_CBUS_IOLA98
bool "I-O DATA LA-98 support"
depends on NE2K_CBUS
config NE2K_CBUS_CNET98EL
bool "Contec C-NET(98)E/L support"
depends on NE2K_CBUS
config NE2K_CBUS_CNET98EL_IO_BASE
hex "C-NET(98)E/L I/O base address (0xaaed or 0x55ed)"
depends on NE2K_CBUS_CNET98EL
default "0xaaed"
config NE2K_CBUS_ATLA98
bool "Allied Telesis LA-98 Support"
depends on NE2K_CBUS
config NE2K_CBUS_BDN
bool "ELECOM Laneed LD-BDN[123]A Support"
depends on NE2K_CBUS
config NE2K_CBUS_NEC108
bool "NEC PC-9801-108 Support"
depends on NE2K_CBUS
config SKMC config SKMC
tristate "SKnet MCA support" tristate "SKnet MCA support"
depends on NET_ETHERNET && MCA depends on NET_ETHERNET && MCA
...@@ -1904,6 +1953,7 @@ config E1000 ...@@ -1904,6 +1953,7 @@ config E1000
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 82540 PRO/1000 MT Desktop Adapter A78408-xxx
82541 PRO/1000 MT Desktop Adapter C91016-xxx
82545 PRO/1000 MT Server Adapter A92165-xxx 82545 PRO/1000 MT Server Adapter A92165-xxx
82546 PRO/1000 MT Dual Port Server Adapter A92111-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 A91622-xxx
......
...@@ -81,6 +81,7 @@ obj-$(CONFIG_ARM_ETHERH) += 8390.o ...@@ -81,6 +81,7 @@ obj-$(CONFIG_ARM_ETHERH) += 8390.o
obj-$(CONFIG_WD80x3) += wd.o 8390.o obj-$(CONFIG_WD80x3) += wd.o 8390.o
obj-$(CONFIG_EL2) += 3c503.o 8390.o obj-$(CONFIG_EL2) += 3c503.o 8390.o
obj-$(CONFIG_NE2000) += ne.o 8390.o obj-$(CONFIG_NE2000) += ne.o 8390.o
obj-$(CONFIG_NE2K_CBUS) += ne2k_cbus.o 8390.o
obj-$(CONFIG_NE2_MCA) += ne2.o 8390.o obj-$(CONFIG_NE2_MCA) += ne2.o 8390.o
obj-$(CONFIG_HPLAN) += hp.o 8390.o obj-$(CONFIG_HPLAN) += hp.o 8390.o
obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390.o obj-$(CONFIG_HPLAN_PLUS) += hp-plus.o 8390.o
......
...@@ -19,6 +19,7 @@ obj-$(CONFIG_MACE) += crc32.o ...@@ -19,6 +19,7 @@ obj-$(CONFIG_MACE) += crc32.o
obj-$(CONFIG_MACMACE) += crc32.o obj-$(CONFIG_MACMACE) += crc32.o
obj-$(CONFIG_MIPS_AU1000_ENET) += crc32.o obj-$(CONFIG_MIPS_AU1000_ENET) += crc32.o
obj-$(CONFIG_NATSEMI) += crc32.o obj-$(CONFIG_NATSEMI) += crc32.o
obj-$(CONFIG_NE2K_CBUS) += crc32.o
obj-$(CONFIG_PCMCIA_FMVJ18X) += crc32.o obj-$(CONFIG_PCMCIA_FMVJ18X) += crc32.o
obj-$(CONFIG_PCMCIA_SMC91C92) += crc32.o obj-$(CONFIG_PCMCIA_SMC91C92) += crc32.o
obj-$(CONFIG_PCMCIA_XIRTULIP) += crc32.o obj-$(CONFIG_PCMCIA_XIRTULIP) += crc32.o
......
...@@ -233,7 +233,7 @@ static struct devprobe isa_probes[] __initdata = { ...@@ -233,7 +233,7 @@ static struct devprobe isa_probes[] __initdata = {
#ifdef CONFIG_E2100 /* Cabletron E21xx series. */ #ifdef CONFIG_E2100 /* Cabletron E21xx series. */
{e2100_probe, 0}, {e2100_probe, 0},
#endif #endif
#ifdef CONFIG_NE2000 /* ISA (use ne2k-pci for PCI cards) */ #if defined(CONFIG_NE2000) || defined(CONFIG_NE2K_CBUS) /* ISA & PC-9800 CBUS (use ne2k-pci for PCI cards) */
{ne_probe, 0}, {ne_probe, 0},
#endif #endif
#ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */ #ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */
......
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
only is it difficult to detect, it also moves around in I/O space in only is it difficult to detect, it also moves around in I/O space in
response to inb()s from other device probes! response to inb()s from other device probes!
*/ */
/*
99/03/03 Allied Telesis RE1000 Plus support by T.Hagawa
99/12/30 port to 2.3.35 by K.Takai
*/
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -76,10 +80,17 @@ static int fmv18x_probe_list[] __initdata = { ...@@ -76,10 +80,17 @@ static int fmv18x_probe_list[] __initdata = {
* ISA * ISA
*/ */
#ifndef CONFIG_X86_PC9800
static int at1700_probe_list[] __initdata = { static int at1700_probe_list[] __initdata = {
0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0 0x260, 0x280, 0x2a0, 0x240, 0x340, 0x320, 0x380, 0x300, 0
}; };
#else /* CONFIG_X86_PC9800 */
static int at1700_probe_list[] __initdata = {
0x1d6, 0x1d8, 0x1da, 0x1d4, 0xd4, 0xd2, 0xd8, 0xd0, 0
};
#endif /* CONFIG_X86_PC9800 */
/* /*
* MCA * MCA
*/ */
...@@ -122,6 +133,7 @@ struct net_local { ...@@ -122,6 +133,7 @@ struct net_local {
/* Offsets from the base address. */ /* Offsets from the base address. */
#ifndef CONFIG_X86_PC9800
#define STATUS 0 #define STATUS 0
#define TX_STATUS 0 #define TX_STATUS 0
#define RX_STATUS 1 #define RX_STATUS 1
...@@ -136,6 +148,7 @@ struct net_local { ...@@ -136,6 +148,7 @@ struct net_local {
#define TX_START 10 #define TX_START 10
#define COL16CNTL 11 /* Controll Reg for 16 collisions */ #define COL16CNTL 11 /* Controll Reg for 16 collisions */
#define MODE13 13 #define MODE13 13
#define RX_CTRL 14
/* Configuration registers only on the '865A/B chips. */ /* Configuration registers only on the '865A/B chips. */
#define EEPROM_Ctrl 16 #define EEPROM_Ctrl 16
#define EEPROM_Data 17 #define EEPROM_Data 17
...@@ -144,8 +157,39 @@ struct net_local { ...@@ -144,8 +157,39 @@ struct net_local {
#define IOCONFIG 18 /* Either read the jumper, or move the I/O. */ #define IOCONFIG 18 /* Either read the jumper, or move the I/O. */
#define IOCONFIG1 19 #define IOCONFIG1 19
#define SAPROM 20 /* The station address PROM, if no EEPROM. */ #define SAPROM 20 /* The station address PROM, if no EEPROM. */
#define MODE24 24
#define RESET 31 /* Write to reset some parts of the chip. */ #define RESET 31 /* Write to reset some parts of the chip. */
#define AT1700_IO_EXTENT 32 #define AT1700_IO_EXTENT 32
#define PORT_OFFSET(o) (o)
#else /* CONFIG_X86_PC9800 */
#define STATUS (0x0000)
#define TX_STATUS (0x0000)
#define RX_STATUS (0x0001)
#define TX_INTR (0x0200)/* Bit-mapped interrupt enable registers. */
#define RX_INTR (0x0201)
#define TX_MODE (0x0400)
#define RX_MODE (0x0401)
#define CONFIG_0 (0x0600)/* Misc. configuration settings. */
#define CONFIG_1 (0x0601)
/* Run-time register bank 2 definitions. */
#define DATAPORT (0x0800)/* Word-wide DMA or programmed-I/O dataport. */
#define TX_START (0x0a00)
#define COL16CNTL (0x0a01)/* Controll Reg for 16 collisions */
#define MODE13 (0x0c01)
#define RX_CTRL (0x0e00)
/* Configuration registers only on the '865A/B chips. */
#define EEPROM_Ctrl (0x1000)
#define EEPROM_Data (0x1200)
#define CARDSTATUS 16 /* FMV-18x Card Status */
#define CARDSTATUS1 17 /* FMV-18x Card Status */
#define IOCONFIG (0x1400)/* Either read the jumper, or move the I/O. */
#define IOCONFIG1 (0x1600)
#define SAPROM 20 /* The station address PROM, if no EEPROM. */
#define MODE24 (0x1800)/* The station address PROM, if no EEPROM. */
#define RESET (0x1e01)/* Write to reset some parts of the chip. */
#define PORT_OFFSET(o) ({ int _o_ = (o); (_o_ & ~1) * 0x100 + (_o_ & 1); })
#endif /* CONFIG_X86_PC9800 */
#define TX_TIMEOUT 10 #define TX_TIMEOUT 10
...@@ -225,8 +269,20 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr) ...@@ -225,8 +269,20 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
int slot, ret = -ENODEV; int slot, ret = -ENODEV;
struct net_local *lp; struct net_local *lp;
#ifndef CONFIG_X86_PC9800
if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name)) if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name))
return -EBUSY; return -EBUSY;
#else
for (i = 0; i < 0x2000; i += 0x0200) {
if (!request_region(ioaddr + i, 2, dev->name)) {
while (i > 0) {
i -= 0x0200;
release_region(ioaddr + i, 2);
}
return -EBUSY;
}
}
#endif
/* Resetting the chip doesn't reset the ISA interface, so don't bother. /* Resetting the chip doesn't reset the ISA interface, so don't bother.
That means we have to be careful with the register values we probe for. That means we have to be careful with the register values we probe for.
...@@ -317,10 +373,17 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr) ...@@ -317,10 +373,17 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
/* Reset the internal state machines. */ /* Reset the internal state machines. */
outb(0, ioaddr + RESET); outb(0, ioaddr + RESET);
if (is_at1700) if (is_at1700) {
#ifndef CONFIG_X86_PC9800
irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04) irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
| (read_eeprom(ioaddr, 0)>>14)]; | (read_eeprom(ioaddr, 0)>>14)];
else { #else
{
char re1000plus_irqmap[4] = {3, 5, 6, 12};
irq = re1000plus_irqmap[inb(ioaddr + IOCONFIG1) >> 6];
}
#endif
} else {
/* Check PnP mode for FMV-183/184/183A/184A. */ /* Check PnP mode for FMV-183/184/183A/184A. */
/* This PnP routine is very poor. IO and IRQ should be known. */ /* This PnP routine is very poor. IO and IRQ should be known. */
if (inb(ioaddr + CARDSTATUS1) & 0x20) { if (inb(ioaddr + CARDSTATUS1) & 0x20) {
...@@ -392,18 +455,22 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr) ...@@ -392,18 +455,22 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
/* Set the station address in bank zero. */ /* Set the station address in bank zero. */
outb(0x00, ioaddr + CONFIG_1); outb(0x00, ioaddr + CONFIG_1);
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
outb(dev->dev_addr[i], ioaddr + 8 + i); outb(dev->dev_addr[i], ioaddr + PORT_OFFSET(8 + i));
/* Switch to bank 1 and set the multicast table to accept none. */ /* Switch to bank 1 and set the multicast table to accept none. */
outb(0x04, ioaddr + CONFIG_1); outb(0x04, ioaddr + CONFIG_1);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
outb(0x00, ioaddr + 8 + i); outb(0x00, ioaddr + PORT_OFFSET(8 + i));
/* Switch to bank 2 */ /* Switch to bank 2 */
/* Lock our I/O address, and set manual processing mode for 16 collisions. */ /* Lock our I/O address, and set manual processing mode for 16 collisions. */
outb(0x08, ioaddr + CONFIG_1); outb(0x08, ioaddr + CONFIG_1);
#ifndef CONFIG_X86_PC9800
outb(dev->if_port, ioaddr + MODE13); outb(dev->if_port, ioaddr + MODE13);
#else
outb(0, ioaddr + MODE13);
#endif
outb(0x00, ioaddr + COL16CNTL); outb(0x00, ioaddr + COL16CNTL);
if (net_debug) if (net_debug)
...@@ -447,7 +514,12 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr) ...@@ -447,7 +514,12 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
kfree(dev->priv); kfree(dev->priv);
dev->priv = NULL; dev->priv = NULL;
err_out: err_out:
#ifndef CONFIG_X86_PC9800
release_region(ioaddr, AT1700_IO_EXTENT); release_region(ioaddr, AT1700_IO_EXTENT);
#else
for (i = 0; i < 0x2000; i += 0x0200)
release_region(ioaddr + i, 2);
#endif
return ret; return ret;
} }
...@@ -459,7 +531,11 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr) ...@@ -459,7 +531,11 @@ static int __init at1700_probe1(struct net_device *dev, int ioaddr)
#define EE_DATA_READ 0x80 /* EEPROM chip data out, in reg. 17. */ #define EE_DATA_READ 0x80 /* EEPROM chip data out, in reg. 17. */
/* Delay between EEPROM clock transitions. */ /* Delay between EEPROM clock transitions. */
#ifndef CONFIG_X86_PC9800
#define eeprom_delay() do { } while (0) #define eeprom_delay() do { } while (0)
#else
#define eeprom_delay() __asm__ ("out%B0 %%al,%0" :: "N"(0x5f))
#endif
/* The EEPROM commands include the alway-set leading bit. */ /* The EEPROM commands include the alway-set leading bit. */
#define EE_WRITE_CMD (5 << 6) #define EE_WRITE_CMD (5 << 6)
...@@ -542,12 +618,12 @@ static void net_tx_timeout (struct net_device *dev) ...@@ -542,12 +618,12 @@ static void net_tx_timeout (struct net_device *dev)
inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80 inw (ioaddr + STATUS), inb (ioaddr + TX_STATUS) & 0x80
? "IRQ conflict" : "network cable problem"); ? "IRQ conflict" : "network cable problem");
printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n", printk ("%s: timeout registers: %04x %04x %04x %04x %04x %04x %04x %04x.\n",
dev->name, inw (ioaddr + 0), inw (ioaddr + 2), inw (ioaddr + 4), dev->name, inw(ioaddr + TX_STATUS), inw(ioaddr + TX_INTR), inw(ioaddr + TX_MODE),
inw (ioaddr + 6), inw (ioaddr + 8), inw (ioaddr + 10), inw(ioaddr + CONFIG_0), inw(ioaddr + DATAPORT), inw(ioaddr + TX_START),
inw (ioaddr + 12), inw (ioaddr + 14)); inw(ioaddr + MODE13 - 1), inw(ioaddr + RX_CTRL));
lp->stats.tx_errors++; lp->stats.tx_errors++;
/* ToDo: We should try to restart the adaptor... */ /* ToDo: We should try to restart the adaptor... */
outw (0xffff, ioaddr + 24); outw(0xffff, ioaddr + MODE24);
outw (0xffff, ioaddr + TX_STATUS); outw (0xffff, ioaddr + TX_STATUS);
outb (0x5a, ioaddr + CONFIG_0); outb (0x5a, ioaddr + CONFIG_0);
outb (0xe8, ioaddr + CONFIG_1); outb (0xe8, ioaddr + CONFIG_1);
...@@ -704,7 +780,7 @@ net_rx(struct net_device *dev) ...@@ -704,7 +780,7 @@ net_rx(struct net_device *dev)
dev->name, inb(ioaddr + RX_MODE), status); dev->name, inb(ioaddr + RX_MODE), status);
#ifndef final_version #ifndef final_version
if (status == 0) { if (status == 0) {
outb(0x05, ioaddr + 14); outb(0x05, ioaddr + RX_CTRL);
break; break;
} }
#endif #endif
...@@ -724,7 +800,7 @@ net_rx(struct net_device *dev) ...@@ -724,7 +800,7 @@ net_rx(struct net_device *dev)
dev->name, pkt_len); dev->name, pkt_len);
/* Prime the FIFO and then flush the packet. */ /* Prime the FIFO and then flush the packet. */
inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
outb(0x05, ioaddr + 14); outb(0x05, ioaddr + RX_CTRL);
lp->stats.rx_errors++; lp->stats.rx_errors++;
break; break;
} }
...@@ -734,7 +810,7 @@ net_rx(struct net_device *dev) ...@@ -734,7 +810,7 @@ net_rx(struct net_device *dev)
dev->name, pkt_len); dev->name, pkt_len);
/* Prime the FIFO and then flush the packet. */ /* Prime the FIFO and then flush the packet. */
inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT); inw(ioaddr + DATAPORT);
outb(0x05, ioaddr + 14); outb(0x05, ioaddr + RX_CTRL);
lp->stats.rx_dropped++; lp->stats.rx_dropped++;
break; break;
} }
...@@ -761,7 +837,7 @@ net_rx(struct net_device *dev) ...@@ -761,7 +837,7 @@ net_rx(struct net_device *dev)
if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40) if ((inb(ioaddr + RX_MODE) & 0x40) == 0x40)
break; break;
inw(ioaddr + DATAPORT); /* dummy status read */ inw(ioaddr + DATAPORT); /* dummy status read */
outb(0x05, ioaddr + 14); outb(0x05, ioaddr + RX_CTRL);
} }
if (net_debug > 5) if (net_debug > 5)
...@@ -844,24 +920,28 @@ set_rx_mode(struct net_device *dev) ...@@ -844,24 +920,28 @@ set_rx_mode(struct net_device *dev)
outb(0x02, ioaddr + RX_MODE); /* Use normal mode. */ outb(0x02, ioaddr + RX_MODE); /* Use normal mode. */
} }
save_flags(flags); spin_lock_irqsave (&lp->lock, flags);
cli();
if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) { if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) {
int saved_bank = inw(ioaddr + CONFIG_0); int saved_bank = inw(ioaddr + CONFIG_0);
/* Switch to bank 1 and set the multicast table. */ /* Switch to bank 1 and set the multicast table. */
outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0); outw((saved_bank & ~0x0C00) | 0x0480, ioaddr + CONFIG_0);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
outb(mc_filter[i], ioaddr + 8 + i); outb(mc_filter[i], ioaddr + PORT_OFFSET(8 + i));
memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter)); memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter));
outw(saved_bank, ioaddr + CONFIG_0); outw(saved_bank, ioaddr + CONFIG_0);
} }
restore_flags(flags); spin_unlock_irqrestore (&lp->lock, flags);
return; return;
} }
#ifdef MODULE #ifdef MODULE
static struct net_device dev_at1700; static struct net_device dev_at1700;
#ifndef CONFIG_X86_PC9800
static int io = 0x260; static int io = 0x260;
#else
static int io = 0xd0;
#endif
static int irq; static int irq;
MODULE_PARM(io, "i"); MODULE_PARM(io, "i");
...@@ -901,7 +981,15 @@ cleanup_module(void) ...@@ -901,7 +981,15 @@ cleanup_module(void)
/* If we don't do this, we can't re-insmod it later. */ /* If we don't do this, we can't re-insmod it later. */
free_irq(dev_at1700.irq, NULL); free_irq(dev_at1700.irq, NULL);
#ifndef CONFIG_X86_PC9800
release_region(dev_at1700.base_addr, AT1700_IO_EXTENT); release_region(dev_at1700.base_addr, AT1700_IO_EXTENT);
#else
{
int i;
for (i = 0; i < 0x2000; i += 0x200)
release_region(dev_at1700.base_addr + i, 2);
}
#endif
} }
#endif /* MODULE */ #endif /* MODULE */
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -57,6 +57,8 @@ ...@@ -57,6 +57,8 @@
#include <linux/if.h> #include <linux/if.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <linux/if_vlan.h>
#include <linux/mii.h>
#define E100_REGS_LEN 1 #define E100_REGS_LEN 1
/* /*
...@@ -301,6 +303,9 @@ struct driver_stats { ...@@ -301,6 +303,9 @@ struct driver_stats {
/* EEPROM bit definitions */ /* EEPROM bit definitions */
/*- EEPROM control register bits */ /*- EEPROM control register bits */
#define EEPROM_FLAG_ASF 0x8000
#define EEPROM_FLAG_GCL 0x4000
#define EN_TRNF 0x10 /* Enable turnoff */ #define EN_TRNF 0x10 /* Enable turnoff */
#define EEDO 0x08 /* EEPROM data out */ #define EEDO 0x08 /* EEPROM data out */
#define EEDI 0x04 /* EEPROM data in (set for writing data) */ #define EEDI 0x04 /* EEPROM data in (set for writing data) */
...@@ -319,6 +324,8 @@ struct driver_stats { ...@@ -319,6 +324,8 @@ struct driver_stats {
#define EEPROM_COMPATIBILITY_WORD 3 #define EEPROM_COMPATIBILITY_WORD 3
#define EEPROM_PWA_NO 8 #define EEPROM_PWA_NO 8
#define EEPROM_ID_WORD 0x0A #define EEPROM_ID_WORD 0x0A
#define EEPROM_CONFIG_ASF 0x0D
#define EEPROM_SMBUS_ADDR 0x90
#define EEPROM_SUM 0xbaba #define EEPROM_SUM 0xbaba
...@@ -358,7 +365,7 @@ struct driver_stats { ...@@ -358,7 +365,7 @@ struct driver_stats {
#define CB_STATUS_MASK BIT_12_15 /* CB Status Mask (4-bits) */ #define CB_STATUS_MASK BIT_12_15 /* CB Status Mask (4-bits) */
#define CB_STATUS_COMPLETE BIT_15 /* CB Complete Bit */ #define CB_STATUS_COMPLETE BIT_15 /* CB Complete Bit */
#define CB_STATUS_OK BIT_13 /* CB OK Bit */ #define CB_STATUS_OK BIT_13 /* CB OK Bit */
#define CB_STATUS_UNDERRUN BIT_12 /* CB A Bit */ #define CB_STATUS_VLAN BIT_12 /* CB Valn detected Bit */
#define CB_STATUS_FAIL BIT_11 /* CB Fail (F) Bit */ #define CB_STATUS_FAIL BIT_11 /* CB Fail (F) Bit */
/*misc command bits */ /*misc command bits */
...@@ -851,6 +858,7 @@ struct ethtool_lpbk_data{ ...@@ -851,6 +858,7 @@ struct ethtool_lpbk_data{
}; };
struct e100_private { struct e100_private {
struct vlan_group *vlgrp;
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 */
unsigned int tx_count; /* count of tx frames, so we can request an interrupt */ unsigned int tx_count; /* count of tx frames, so we can request an interrupt */
...@@ -886,7 +894,6 @@ struct e100_private { ...@@ -886,7 +894,6 @@ struct e100_private {
struct driver_stats drv_stats; struct driver_stats drv_stats;
u8 rev_id; /* adapter PCI revision ID */ u8 rev_id; /* adapter PCI revision ID */
unsigned long device_type; /* device type from e100_vendor.h */
unsigned int phy_addr; /* address of PHY component */ unsigned int phy_addr; /* address of PHY component */
unsigned int PhyId; /* ID of PHY component */ unsigned int PhyId; /* ID of PHY component */
...@@ -923,8 +930,6 @@ struct e100_private { ...@@ -923,8 +930,6 @@ struct e100_private {
struct cfg_params params; /* adapter's command line parameters */ struct cfg_params params; /* adapter's command line parameters */
char *id_string;
u32 speed_duplex_caps; /* adapter's speed/duplex capabilities */ u32 speed_duplex_caps; /* adapter's speed/duplex capabilities */
/* WOL params for ethtool */ /* WOL params for ethtool */
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -521,6 +521,25 @@ e100_config_wol(struct e100_private *bdp) ...@@ -521,6 +521,25 @@ e100_config_wol(struct e100_private *bdp)
spin_unlock_bh(&(bdp->config_lock)); spin_unlock_bh(&(bdp->config_lock));
} }
void
e100_config_vlan_drop(struct e100_private *bdp, unsigned char enable)
{
spin_lock_bh(&(bdp->config_lock));
if (enable) {
if (!(bdp->config[22] & CB_CFIG_VLAN_DROP_ENABLE)) {
bdp->config[22] |= CB_CFIG_VLAN_DROP_ENABLE;
E100_CONFIG(bdp, 22);
}
} else {
if ((bdp->config[22] & CB_CFIG_VLAN_DROP_ENABLE)) {
bdp->config[22] &= ~CB_CFIG_VLAN_DROP_ENABLE;
E100_CONFIG(bdp, 22);
}
}
spin_unlock_bh(&(bdp->config_lock));
}
/** /**
* e100_config_loopback_mode * e100_config_loopback_mode
* @bdp: atapter's private data struct * @bdp: atapter's private data struct
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -163,5 +163,5 @@ extern void e100_config_force_dplx(struct e100_private *bdp); ...@@ -163,5 +163,5 @@ extern void e100_config_force_dplx(struct e100_private *bdp);
extern u8 e100_config_loopback_mode(struct e100_private *bdp, u8 mode); extern u8 e100_config_loopback_mode(struct e100_private *bdp, u8 mode);
extern u8 e100_config_dynamic_tbd(struct e100_private *bdp, u8 enable); extern u8 e100_config_dynamic_tbd(struct e100_private *bdp, u8 enable);
extern u8 e100_config_tcb_ext_enable(struct e100_private *bdp, u8 enable); extern u8 e100_config_tcb_ext_enable(struct e100_private *bdp, u8 enable);
extern void e100_config_vlan_drop(struct e100_private *bdp, unsigned char enable);
#endif /* _E100_CONFIG_INC_ */ #endif /* _E100_CONFIG_INC_ */
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
......
This diff is collapsed.
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -636,7 +636,6 @@ e100_force_speed_duplex(struct e100_private *bdp) ...@@ -636,7 +636,6 @@ e100_force_speed_duplex(struct e100_private *bdp)
control &= ~BMCR_ANENABLE; control &= ~BMCR_ANENABLE;
control &= ~BMCR_LOOPBACK; control &= ~BMCR_LOOPBACK;
/* Check e100.c values */
switch (bdp->params.e100_speed_duplex) { switch (bdp->params.e100_speed_duplex) {
case E100_SPEED_10_HALF: case E100_SPEED_10_HALF:
control &= ~BMCR_SPEED100; control &= ~BMCR_SPEED100;
...@@ -682,6 +681,41 @@ e100_force_speed_duplex(struct e100_private *bdp) ...@@ -682,6 +681,41 @@ e100_force_speed_duplex(struct e100_private *bdp)
} while (true); } while (true);
} }
void
e100_force_speed_duplex_to_phy(struct e100_private *bdp)
{
u16 control;
e100_mdi_read(bdp, MII_BMCR, bdp->phy_addr, &control);
control &= ~BMCR_ANENABLE;
control &= ~BMCR_LOOPBACK;
switch (bdp->params.e100_speed_duplex) {
case E100_SPEED_10_HALF:
control &= ~BMCR_SPEED100;
control &= ~BMCR_FULLDPLX;
break;
case E100_SPEED_10_FULL:
control &= ~BMCR_SPEED100;
control |= BMCR_FULLDPLX;
break;
case E100_SPEED_100_HALF:
control |= BMCR_SPEED100;
control &= ~BMCR_FULLDPLX;
break;
case E100_SPEED_100_FULL:
control |= BMCR_SPEED100;
control |= BMCR_FULLDPLX;
break;
}
/* Send speed/duplex command to PHY layer. */
e100_mdi_write(bdp, MII_BMCR, bdp->phy_addr, control);
}
/* /*
* Procedure: e100_set_fc * Procedure: e100_set_fc
* *
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
#include "e100.h" #include "e100.h"
#include <linux/mii.h>
/* /*
* Auto-polarity enable/disable * Auto-polarity enable/disable
* e100_autopolarity = 0 => disable auto-polarity * e100_autopolarity = 0 => disable auto-polarity
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -242,6 +242,9 @@ e100_diag_config_loopback(struct e100_private* bdp, ...@@ -242,6 +242,9 @@ e100_diag_config_loopback(struct e100_private* bdp,
*dynamic_tbd = e100_config_dynamic_tbd(bdp,*dynamic_tbd); *dynamic_tbd = e100_config_dynamic_tbd(bdp,*dynamic_tbd);
if (set_loopback) { if (set_loopback) {
/* ICH PHY loopback is broken */
if (bdp->flags & IS_ICH && loopback_mode == PHY_LOOPBACK)
loopback_mode = MAC_LOOPBACK;
/* Configure loopback on MAC */ /* Configure loopback on MAC */
e100_config_loopback_mode(bdp,loopback_mode); e100_config_loopback_mode(bdp,loopback_mode);
} else { } else {
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
......
This diff is collapsed.
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
#include <linux/reboot.h> #include <linux/reboot.h>
#include <net/checksum.h> #include <net/checksum.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/mii.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
...@@ -95,6 +96,15 @@ struct e1000_adapter; ...@@ -95,6 +96,15 @@ struct e1000_adapter;
#define E1000_RXBUFFER_8192 8192 #define E1000_RXBUFFER_8192 8192
#define E1000_RXBUFFER_16384 16384 #define E1000_RXBUFFER_16384 16384
/* SmartSpeed delimiters */
#define E1000_SMARTSPEED_DOWNSHIFT 3
#define E1000_SMARTSPEED_MAX 15
/* Packet Buffer allocations */
#define E1000_TX_FIFO_SIZE_SHIFT 0xA
#define E1000_TX_HEAD_ADDR_SHIFT 7
#define E1000_PBA_TX_MASK 0xFFFF0000
/* Flow Control High-Watermark: 43464 bytes */ /* Flow Control High-Watermark: 43464 bytes */
#define E1000_FC_HIGH_THRESH 0xA9C8 #define E1000_FC_HIGH_THRESH 0xA9C8
...@@ -107,10 +117,7 @@ struct e1000_adapter; ...@@ -107,10 +117,7 @@ struct e1000_adapter;
/* How many Tx Descriptors do we need to call netif_wake_queue ? */ /* How many Tx Descriptors do we need to call netif_wake_queue ? */
#define E1000_TX_QUEUE_WAKE 16 #define E1000_TX_QUEUE_WAKE 16
/* How many Rx Buffers do we bundle into one write to the hardware ? */ /* How many Rx Buffers do we bundle into one write to the hardware ? */
#define E1000_RX_BUFFER_WRITE 16 #define E1000_RX_BUFFER_WRITE 16 /* Must be power of 2 */
#define E1000_JUMBO_PBA 0x00000028
#define E1000_DEFAULT_PBA 0x00000030
#define AUTO_ALL_MODES 0 #define AUTO_ALL_MODES 0
#define E1000_EEPROM_APME 4 #define E1000_EEPROM_APME 4
...@@ -145,7 +152,8 @@ struct e1000_desc_ring { ...@@ -145,7 +152,8 @@ struct e1000_desc_ring {
}; };
#define E1000_DESC_UNUSED(R) \ #define E1000_DESC_UNUSED(R) \
((((R)->next_to_clean + (R)->count) - ((R)->next_to_use + 1)) % ((R)->count)) ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
(R)->next_to_clean - (R)->next_to_use - 1)
#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i])) #define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
#define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc) #define E1000_RX_DESC(R, i) E1000_GET_DESC(R, i, e1000_rx_desc)
...@@ -155,6 +163,7 @@ struct e1000_desc_ring { ...@@ -155,6 +163,7 @@ struct e1000_desc_ring {
/* board specific private data structure */ /* board specific private data structure */
struct e1000_adapter { struct e1000_adapter {
struct timer_list tx_fifo_stall_timer;
struct timer_list watchdog_timer; struct timer_list watchdog_timer;
struct timer_list phy_info_timer; struct timer_list phy_info_timer;
struct vlan_group *vlgrp; struct vlan_group *vlgrp;
...@@ -163,6 +172,7 @@ struct e1000_adapter { ...@@ -163,6 +172,7 @@ struct e1000_adapter {
uint32_t rx_buffer_len; uint32_t rx_buffer_len;
uint32_t part_num; uint32_t part_num;
uint32_t wol; uint32_t wol;
uint32_t smartspeed;
uint16_t link_speed; uint16_t link_speed;
uint16_t link_duplex; uint16_t link_duplex;
spinlock_t stats_lock; spinlock_t stats_lock;
...@@ -177,7 +187,11 @@ struct e1000_adapter { ...@@ -177,7 +187,11 @@ struct e1000_adapter {
uint32_t txd_cmd; uint32_t txd_cmd;
uint32_t tx_int_delay; uint32_t tx_int_delay;
uint32_t tx_abs_int_delay; uint32_t tx_abs_int_delay;
int max_data_per_txd; uint32_t gotcl;
uint32_t tx_fifo_head;
uint32_t tx_head_addr;
uint32_t tx_fifo_size;
atomic_t tx_fifo_stall;
/* RX */ /* RX */
struct e1000_desc_ring rx_ring; struct e1000_desc_ring rx_ring;
...@@ -186,6 +200,10 @@ struct e1000_adapter { ...@@ -186,6 +200,10 @@ struct e1000_adapter {
uint32_t rx_int_delay; uint32_t rx_int_delay;
uint32_t rx_abs_int_delay; uint32_t rx_abs_int_delay;
boolean_t rx_csum; boolean_t rx_csum;
uint32_t gorcl;
/* Interrupt Throttle Rate */
uint32_t itr;
/* OS defined structs */ /* OS defined structs */
struct net_device *netdev; struct net_device *netdev;
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -38,6 +38,7 @@ extern char e1000_driver_version[]; ...@@ -38,6 +38,7 @@ 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_reset(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);
static char e1000_gstrings_stats[][ETH_GSTRING_LEN] = { static char e1000_gstrings_stats[][ETH_GSTRING_LEN] = {
"rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors",
...@@ -129,30 +130,9 @@ e1000_ethtool_sset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd) ...@@ -129,30 +130,9 @@ e1000_ethtool_sset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
hw->autoneg = 1; hw->autoneg = 1;
hw->autoneg_advertised = 0x002F; hw->autoneg_advertised = 0x002F;
ecmd->advertising = 0x002F; ecmd->advertising = 0x002F;
} else { } else
hw->autoneg = 0; if(e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex))
switch(ecmd->speed + ecmd->duplex) {
case SPEED_10 + DUPLEX_HALF:
hw->forced_speed_duplex = e1000_10_half;
break;
case SPEED_10 + DUPLEX_FULL:
hw->forced_speed_duplex = e1000_10_full;
break;
case SPEED_100 + DUPLEX_HALF:
hw->forced_speed_duplex = e1000_100_half;
break;
case SPEED_100 + DUPLEX_FULL:
hw->forced_speed_duplex = e1000_100_full;
break;
case SPEED_1000 + DUPLEX_FULL:
hw->autoneg = 1;
hw->autoneg_advertised = ADVERTISE_1000_FULL;
break;
case SPEED_1000 + DUPLEX_HALF: /* not supported */
default:
return -EINVAL; return -EINVAL;
}
}
/* reset the link */ /* reset the link */
...@@ -165,16 +145,6 @@ e1000_ethtool_sset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd) ...@@ -165,16 +145,6 @@ e1000_ethtool_sset(struct e1000_adapter *adapter, struct ethtool_cmd *ecmd)
return 0; return 0;
} }
static inline int
e1000_eeprom_size(struct e1000_hw *hw)
{
if((hw->mac_type > e1000_82544) &&
(E1000_READ_REG(hw, EECD) & E1000_EECD_SIZE))
return 512;
else
return 128;
}
static void static void
e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter, e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter,
struct ethtool_drvinfo *drvinfo) struct ethtool_drvinfo *drvinfo)
...@@ -186,7 +156,7 @@ e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter, ...@@ -186,7 +156,7 @@ e1000_ethtool_gdrvinfo(struct e1000_adapter *adapter,
drvinfo->n_stats = E1000_STATS_LEN; drvinfo->n_stats = E1000_STATS_LEN;
#define E1000_REGS_LEN 32 #define E1000_REGS_LEN 32
drvinfo->regdump_len = E1000_REGS_LEN * sizeof(uint32_t); drvinfo->regdump_len = E1000_REGS_LEN * sizeof(uint32_t);
drvinfo->eedump_len = e1000_eeprom_size(&adapter->hw); drvinfo->eedump_len = adapter->hw.eeprom.word_size * 2;
} }
static void static void
...@@ -220,9 +190,8 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter, ...@@ -220,9 +190,8 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter,
struct ethtool_eeprom *eeprom, uint16_t *eeprom_buff) struct ethtool_eeprom *eeprom, uint16_t *eeprom_buff)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
int max_len, first_word, last_word; int first_word, last_word;
int ret_val = 0; int ret_val = 0;
int i;
if(eeprom->len == 0) { if(eeprom->len == 0) {
ret_val = -EINVAL; ret_val = -EINVAL;
...@@ -231,22 +200,28 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter, ...@@ -231,22 +200,28 @@ e1000_ethtool_geeprom(struct e1000_adapter *adapter,
eeprom->magic = hw->vendor_id | (hw->device_id << 16); eeprom->magic = hw->vendor_id | (hw->device_id << 16);
max_len = e1000_eeprom_size(hw);
if(eeprom->offset > eeprom->offset + eeprom->len) { if(eeprom->offset > eeprom->offset + eeprom->len) {
ret_val = -EINVAL; ret_val = -EINVAL;
goto geeprom_error; goto geeprom_error;
} }
if((eeprom->offset + eeprom->len) > max_len) if((eeprom->offset + eeprom->len) > (hw->eeprom.word_size * 2))
eeprom->len = (max_len - eeprom->offset); eeprom->len = ((hw->eeprom.word_size * 2) - eeprom->offset);
first_word = eeprom->offset >> 1; first_word = eeprom->offset >> 1;
last_word = (eeprom->offset + eeprom->len - 1) >> 1; last_word = (eeprom->offset + eeprom->len - 1) >> 1;
for(i = 0; i <= (last_word - first_word); i++) if(hw->eeprom.type == e1000_eeprom_spi)
e1000_read_eeprom(hw, first_word + i, &eeprom_buff[i]); ret_val = e1000_read_eeprom(hw, first_word,
last_word - first_word + 1,
eeprom_buff);
else {
uint16_t i;
for (i = 0; i < last_word - first_word + 1; i++)
if((ret_val = e1000_read_eeprom(hw, first_word + i, 1,
&eeprom_buff[i])))
break;
}
geeprom_error: geeprom_error:
return ret_val; return ret_val;
} }
...@@ -257,9 +232,8 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter, ...@@ -257,9 +232,8 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter,
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
uint16_t *eeprom_buff; uint16_t *eeprom_buff;
int max_len, first_word, last_word;
void *ptr; void *ptr;
int i; int max_len, first_word, last_word, ret_val = 0;
if(eeprom->len == 0) if(eeprom->len == 0)
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -267,7 +241,7 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter, ...@@ -267,7 +241,7 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter,
if(eeprom->magic != (hw->vendor_id | (hw->device_id << 16))) if(eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
return -EFAULT; return -EFAULT;
max_len = e1000_eeprom_size(hw); max_len = hw->eeprom.word_size * 2;
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);
...@@ -283,30 +257,31 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter, ...@@ -283,30 +257,31 @@ e1000_ethtool_seeprom(struct e1000_adapter *adapter,
if(eeprom->offset & 1) { if(eeprom->offset & 1) {
/* need read/modify/write of first changed EEPROM word */ /* need read/modify/write of first changed EEPROM word */
/* only the second byte of the word is being modified */ /* only the second byte of the word is being modified */
e1000_read_eeprom(hw, first_word, &eeprom_buff[0]); ret_val = e1000_read_eeprom(hw, first_word, 1,
&eeprom_buff[0]);
ptr++; ptr++;
} }
if((eeprom->offset + eeprom->len) & 1) { if(((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) {
/* need read/modify/write of last changed EEPROM word */ /* need read/modify/write of last changed EEPROM word */
/* only the first byte of the word is being modified */ /* only the first byte of the word is being modified */
e1000_read_eeprom(hw, last_word, ret_val = e1000_read_eeprom(hw, last_word, 1,
&eeprom_buff[last_word - first_word]); &eeprom_buff[last_word - first_word]);
} }
if(copy_from_user(ptr, user_data, eeprom->len)) { if((ret_val != 0) || copy_from_user(ptr, user_data, eeprom->len)) {
kfree(eeprom_buff); ret_val = -EFAULT;
return -EFAULT; goto seeprom_error;
} }
for(i = 0; i <= (last_word - first_word); i++) ret_val = e1000_write_eeprom(hw, first_word,
e1000_write_eeprom(hw, first_word + i, eeprom_buff[i]); last_word - first_word + 1, eeprom_buff);
/* Update the checksum over the first part of the EEPROM if needed */ /* Update the checksum over the first part of the EEPROM if needed */
if(first_word <= EEPROM_CHECKSUM_REG) if((ret_val == 0) && first_word <= EEPROM_CHECKSUM_REG)
e1000_update_eeprom_checksum(hw); e1000_update_eeprom_checksum(hw);
seeprom_error:
kfree(eeprom_buff); kfree(eeprom_buff);
return ret_val;
return 0;
} }
static void static void
...@@ -333,8 +308,8 @@ e1000_ethtool_gwol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol) ...@@ -333,8 +308,8 @@ e1000_ethtool_gwol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
/* Fall Through */ /* Fall Through */
default: default:
wol->supported = WAKE_UCAST | WAKE_MCAST wol->supported = WAKE_UCAST | WAKE_MCAST |
| WAKE_BCAST | WAKE_MAGIC; WAKE_BCAST | WAKE_MAGIC;
wol->wolopts = 0; wol->wolopts = 0;
if(adapter->wol & E1000_WUFC_EX) if(adapter->wol & E1000_WUFC_EX)
...@@ -368,7 +343,7 @@ e1000_ethtool_swol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol) ...@@ -368,7 +343,7 @@ e1000_ethtool_swol(struct e1000_adapter *adapter, struct ethtool_wolinfo *wol)
/* Fall Through */ /* Fall Through */
default: default:
if(wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | WAKE_PHY)) if(wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
return -EOPNOTSUPP; return -EOPNOTSUPP;
adapter->wol = 0; adapter->wol = 0;
...@@ -542,13 +517,12 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr) ...@@ -542,13 +517,12 @@ e1000_ethtool_ioctl(struct net_device *netdev, struct ifreq *ifr)
} }
case ETHTOOL_GEEPROM: { case ETHTOOL_GEEPROM: {
struct ethtool_eeprom eeprom = {ETHTOOL_GEEPROM}; struct ethtool_eeprom eeprom = {ETHTOOL_GEEPROM};
struct e1000_hw *hw = &adapter->hw;
uint16_t *eeprom_buff; uint16_t *eeprom_buff;
void *ptr; void *ptr;
int max_len, err = 0; int err = 0;
max_len = e1000_eeprom_size(&adapter->hw);
eeprom_buff = kmalloc(max_len, GFP_KERNEL); eeprom_buff = kmalloc(hw->eeprom.word_size * 2, GFP_KERNEL);
if(eeprom_buff == NULL) if(eeprom_buff == NULL)
return -ENOMEM; return -ENOMEM;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -77,24 +77,22 @@ typedef enum { ...@@ -77,24 +77,22 @@ typedef enum {
#define E1000_WRITE_REG(a, reg, value) ( \ #define E1000_WRITE_REG(a, reg, value) ( \
((a)->mac_type >= e1000_82543) ? \ writel((value), ((a)->hw_addr + \
(writel((value), ((a)->hw_addr + E1000_##reg))) : \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg))))
(writel((value), ((a)->hw_addr + E1000_82542_##reg))))
#define E1000_READ_REG(a, reg) ( \ #define E1000_READ_REG(a, reg) ( \
((a)->mac_type >= e1000_82543) ? \ readl((a)->hw_addr + \
readl((a)->hw_addr + E1000_##reg) : \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg)))
readl((a)->hw_addr + E1000_82542_##reg))
#define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \ #define E1000_WRITE_REG_ARRAY(a, reg, offset, value) ( \
((a)->mac_type >= e1000_82543) ? \ writel((value), ((a)->hw_addr + \
writel((value), ((a)->hw_addr + E1000_##reg + ((offset) << 2))) : \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
writel((value), ((a)->hw_addr + E1000_82542_##reg + ((offset) << 2)))) ((offset) << 2))))
#define E1000_READ_REG_ARRAY(a, reg, offset) ( \ #define E1000_READ_REG_ARRAY(a, reg, offset) ( \
((a)->mac_type >= e1000_82543) ? \ readl((a)->hw_addr + \
readl((a)->hw_addr + E1000_##reg + ((offset) << 2)) : \ (((a)->mac_type >= e1000_82543) ? E1000_##reg : E1000_82542_##reg) + \
readl((a)->hw_addr + E1000_82542_##reg + ((offset) << 2))) ((offset) << 2)))
#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS) #define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)
......
/******************************************************************************* /*******************************************************************************
Copyright(c) 1999 - 2002 Intel Corporation. All rights reserved. Copyright(c) 1999 - 2003 Intel Corporation. All rights reserved.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free under the terms of the GNU General Public License as published by the Free
...@@ -169,7 +169,7 @@ E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay"); ...@@ -169,7 +169,7 @@ E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");
* *
* Valid Range: 0-65535 * Valid Range: 0-65535
* *
* Default Value: 0/128 * Default Value: 0
*/ */
E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
...@@ -183,6 +183,15 @@ E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); ...@@ -183,6 +183,15 @@ E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");
E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
/* Interrupt Throttle Rate (interrupts/sec)
*
* Valid Range: 100-100000 (0=off, 1=dynamic)
*
* Default Value: 1
*/
E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
#define AUTONEG_ADV_DEFAULT 0x2F #define AUTONEG_ADV_DEFAULT 0x2F
#define AUTONEG_ADV_MASK 0x2F #define AUTONEG_ADV_MASK 0x2F
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
...@@ -213,6 +222,10 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); ...@@ -213,6 +222,10 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
#define MAX_TXABSDELAY 0xFFFF #define MAX_TXABSDELAY 0xFFFF
#define MIN_TXABSDELAY 0 #define MIN_TXABSDELAY 0
#define DEFAULT_ITR 1
#define MAX_ITR 100000
#define MIN_ITR 100
struct e1000_option { struct e1000_option {
enum { enable_option, range_option, list_option } type; enum { enable_option, range_option, list_option } type;
char *name; char *name;
...@@ -309,7 +322,7 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -309,7 +322,7 @@ e1000_check_options(struct e1000_adapter *adapter)
.name = "Transmit Descriptors", .name = "Transmit Descriptors",
.err = "using default of " __MODULE_STRING(DEFAULT_TXD), .err = "using default of " __MODULE_STRING(DEFAULT_TXD),
.def = DEFAULT_TXD, .def = DEFAULT_TXD,
.arg = { .r = { .min = MIN_TXD }} .arg = { .r { .min = MIN_TXD }}
}; };
struct e1000_desc_ring *tx_ring = &adapter->tx_ring; struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
e1000_mac_type mac_type = adapter->hw.mac_type; e1000_mac_type mac_type = adapter->hw.mac_type;
...@@ -362,7 +375,8 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -362,7 +375,8 @@ e1000_check_options(struct e1000_adapter *adapter)
.name = "Flow Control", .name = "Flow Control",
.err = "reading default settings from EEPROM", .err = "reading default settings from EEPROM",
.def = e1000_fc_default, .def = e1000_fc_default,
.arg = { .l = { .nr = ARRAY_SIZE(fc_list), .p = fc_list }} .arg = { .l = { .nr = ARRAY_SIZE(fc_list),
.p = fc_list }}
}; };
int fc = FlowControl[bd]; int fc = FlowControl[bd];
...@@ -370,57 +384,77 @@ e1000_check_options(struct e1000_adapter *adapter) ...@@ -370,57 +384,77 @@ e1000_check_options(struct e1000_adapter *adapter)
adapter->hw.fc = adapter->hw.original_fc = fc; adapter->hw.fc = adapter->hw.original_fc = fc;
} }
{ /* Transmit Interrupt Delay */ { /* Transmit Interrupt Delay */
char *tidv = "using default of " __MODULE_STRING(DEFAULT_TIDV);
struct e1000_option opt = { struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Transmit Interrupt Delay", .name = "Transmit Interrupt Delay",
.arg = { .r = { .min = MIN_TXDELAY, .max = MAX_TXDELAY }} .err = "using default of " __MODULE_STRING(DEFAULT_TIDV),
.def = DEFAULT_TIDV,
.arg = { .r = { .min = MIN_TXDELAY,
.max = MAX_TXDELAY }}
}; };
opt.def = DEFAULT_TIDV;
opt.err = tidv;
adapter->tx_int_delay = TxIntDelay[bd]; adapter->tx_int_delay = TxIntDelay[bd];
e1000_validate_option(&adapter->tx_int_delay, &opt); e1000_validate_option(&adapter->tx_int_delay, &opt);
} }
{ /* Transmit Absolute Interrupt Delay */ { /* Transmit Absolute Interrupt Delay */
char *tadv = "using default of " __MODULE_STRING(DEFAULT_TADV);
struct e1000_option opt = { struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Transmit Absolute Interrupt Delay", .name = "Transmit Absolute Interrupt Delay",
.arg = { .r = { .min = MIN_TXABSDELAY, .max = MAX_TXABSDELAY }} .err = "using default of " __MODULE_STRING(DEFAULT_TADV),
.def = DEFAULT_TADV,
.arg = { .r = { .min = MIN_TXABSDELAY,
.max = MAX_TXABSDELAY }}
}; };
opt.def = DEFAULT_TADV;
opt.err = tadv;
adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; adapter->tx_abs_int_delay = TxAbsIntDelay[bd];
e1000_validate_option(&adapter->tx_abs_int_delay, &opt); e1000_validate_option(&adapter->tx_abs_int_delay, &opt);
} }
{ /* Receive Interrupt Delay */ { /* Receive Interrupt Delay */
char *rdtr = "using default of " __MODULE_STRING(DEFAULT_RDTR);
struct e1000_option opt = { struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Receive Interrupt Delay", .name = "Receive Interrupt Delay",
.arg = { .r = { .min = MIN_RXDELAY, .max = MAX_RXDELAY }} .err = "using default of " __MODULE_STRING(DEFAULT_RDTR),
.def = DEFAULT_RDTR,
.arg = { .r = { .min = MIN_RXDELAY,
.max = MAX_RXDELAY }}
}; };
opt.def = DEFAULT_RDTR;
opt.err = rdtr;
adapter->rx_int_delay = RxIntDelay[bd]; adapter->rx_int_delay = RxIntDelay[bd];
e1000_validate_option(&adapter->rx_int_delay, &opt); e1000_validate_option(&adapter->rx_int_delay, &opt);
} }
{ /* Receive Absolute Interrupt Delay */ { /* Receive Absolute Interrupt Delay */
char *radv = "using default of " __MODULE_STRING(DEFAULT_RADV);
struct e1000_option opt = { struct e1000_option opt = {
.type = range_option, .type = range_option,
.name = "Receive Absolute Interrupt Delay", .name = "Receive Absolute Interrupt Delay",
.arg = { .r = { .min = MIN_RXABSDELAY, .max = MAX_RXABSDELAY }} .err = "using default of " __MODULE_STRING(DEFAULT_RADV),
.def = DEFAULT_RADV,
.arg = { .r = { .min = MIN_RXABSDELAY,
.max = MAX_RXABSDELAY }}
}; };
opt.def = DEFAULT_RADV;
opt.err = radv;
adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; adapter->rx_abs_int_delay = RxAbsIntDelay[bd];
e1000_validate_option(&adapter->rx_abs_int_delay, &opt); e1000_validate_option(&adapter->rx_abs_int_delay, &opt);
} }
{ /* Interrupt Throttling Rate */
struct e1000_option opt = {
.type = range_option,
.name = "Interrupt Throttling Rate (ints/sec)",
.err = "using default of " __MODULE_STRING(DEFAULT_ITR),
.def = DEFAULT_ITR,
.arg = { .r = { .min = MIN_ITR,
.max = MAX_ITR }}
};
adapter->itr = InterruptThrottleRate[bd];
if(adapter->itr == 0) {
printk(KERN_INFO "%s turned off\n", opt.name);
} else if(adapter->itr == 1 || adapter->itr == -1) {
/* Dynamic mode */
adapter->itr = 1;
} else {
e1000_validate_option(&adapter->itr, &opt);
}
}
switch(adapter->hw.media_type) { switch(adapter->hw.media_type) {
case e1000_media_type_fiber: case e1000_media_type_fiber:
...@@ -486,7 +520,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -486,7 +520,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.name = "Speed", .name = "Speed",
.err = "parameter ignored", .err = "parameter ignored",
.def = 0, .def = 0,
.arg = { .l = { .nr = ARRAY_SIZE(speed_list), .p = speed_list }} .arg = { .l = { .nr = ARRAY_SIZE(speed_list),
.p = speed_list }}
}; };
speed = Speed[bd]; speed = Speed[bd];
...@@ -502,7 +537,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -502,7 +537,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.name = "Duplex", .name = "Duplex",
.err = "parameter ignored", .err = "parameter ignored",
.def = 0, .def = 0,
.arg = { .l = { .nr = ARRAY_SIZE(dplx_list), .p = dplx_list }} .arg = { .l = { .nr = ARRAY_SIZE(dplx_list),
.p = dplx_list }}
}; };
dplx = Duplex[bd]; dplx = Duplex[bd];
...@@ -554,7 +590,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter) ...@@ -554,7 +590,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.name = "AutoNeg", .name = "AutoNeg",
.err = "parameter ignored", .err = "parameter ignored",
.def = AUTONEG_ADV_DEFAULT, .def = AUTONEG_ADV_DEFAULT,
.arg = { .l = { .nr = ARRAY_SIZE(an_list), .p = an_list }} .arg = { .l = { .nr = ARRAY_SIZE(an_list),
.p = an_list }}
}; };
int an = AutoNeg[bd]; int an = AutoNeg[bd];
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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