patch-2.2.19 linux/drivers/net/ne2k-pci.c
Next file: linux/drivers/net/sis900.c
Previous file: linux/drivers/net/lp486e.c
Back to the patch index
Back to the overall index
- Lines: 195
- Date:
Sun Mar 25 11:37:34 2001
- Orig file:
v2.2.18/drivers/net/ne2k-pci.c
- Orig date:
Sun Mar 25 11:12:52 2001
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.18/drivers/net/ne2k-pci.c linux/drivers/net/ne2k-pci.c
@@ -12,19 +12,30 @@
This software may be used and distributed according to the terms
of the GNU Public License, incorporated herein by reference.
- The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
- Center of Excellence in Space Data and Information Sciences
- Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
+ Drivers based on or derived from this code fall under the GPL and must
+ retain the authorship, copyright and license notice. This file is not
+ a complete program and may only be used when the entire operating
+ system is licensed under the GPL.
+
+ The author may be reached as becker@scyld.com, or C/O
+ Scyld Computing Corporation
+ 410 Severn Ave., Suite 210
+ Annapolis MD 21403
+ Issues remaining:
People are making PCI ne2000 clones! Oh the horror, the horror...
+ Limited full-duplex support.
- Issues remaining:
- No full-duplex support.
+ ChangeLog:
+
+ 12/15/2000 Merged Scyld v1.02 into 2.2.18
+ J.A. Magallon <jamagallon@able.es>
*/
-/* Our copyright info must remain in the binary. */
-static const char *version =
-"ne2k-pci.c:vpre-1.00e 5/27/99 D. Becker/P. Gortmaker http://cesdis.gsfc.nasa.gov/linux/drivers/ne2k-pci.html\n";
+/* These identify the driver base version and may not be removed. */
+static const char* version =
+"ne2k-pci.c: v1.02 for Linux 2.2, 10/19/2000, D. Becker/P. Gortmaker,"
+" http://www.scyld.com/network/ne2k-pci.html";
#include <linux/module.h>
#include <linux/kernel.h>
@@ -49,7 +60,18 @@
#endif
/* Set statically or when loading the driver module. */
-static int debug = 1;
+static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */
+/* More are supported, limit only on options */
+#define MAX_UNITS 6
+/* Used to pass the full-duplex flag, etc. */
+static int full_duplex[MAX_UNITS] = {0, };
+static int options[MAX_UNITS] = {0, };
+
+MODULE_AUTHOR("Donald Becker / Paul Gortmaker");
+MODULE_DESCRIPTION("PCI NE2000 clone driver");
+MODULE_PARM(debug, "i");
+MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
/* Some defines that people can play with if so inclined. */
@@ -62,12 +84,13 @@
/* Do we have a non std. amount of memory? (in units of 256 byte pages) */
/* #define PACKETBUF_MEMSIZE 0x40 */
-#define ne2k_flags reg0 /* Rename an existing field to store flags! */
-
-/* Only the low 8 bits are usable for non-init-time flags! */
+/* Flags. We rename an existing ei_status field to store flags! */
+/* Thus only the low 8 bits are usable for non-init-time flags. */
+#define ne2k_flags reg0
enum {
- HOLTEK_FDX=1, /* Full duplex -> set 0x80 at offset 0x20. */
- ONLY_16BIT_IO=2, ONLY_32BIT_IO=4, /* Chip can do only 16/32-bit xfers. */
+ ONLY_16BIT_IO=8, ONLY_32BIT_IO=4, /* Chip can do only 16/32-bit xfers. */
+ FORCE_FDX=0x20, /* User override. */
+ REALTEK_FDX=0x40, HOLTEK_FDX=0x80,
STOP_PG_0x60=0x100,
};
@@ -79,18 +102,17 @@
int flags;
}
pci_clone_list[] __initdata = {
- {0x10ec, 0x8029, "RealTek RTL-8029", 0},
- {0x1050, 0x0940, "Winbond 89C940", 0},
- {0x11f6, 0x1401, "Compex RL2000", 0},
- {0x8e2e, 0x3000, "KTI ET32P2", 0},
- {0x4a14, 0x5000, "NetVin NV5000SC", 0},
- {0x1106, 0x0926, "Via 86C926", ONLY_16BIT_IO},
- {0x10bd, 0x0e34, "SureCom NE34", 0},
- {0x1050, 0x5a5a, "Winbond", 0},
- {0x12c3, 0x0058, "Holtek HT80232", ONLY_16BIT_IO | HOLTEK_FDX},
- {0x12c3, 0x5598, "Holtek HT80229",
- ONLY_32BIT_IO | HOLTEK_FDX | STOP_PG_0x60 },
- {0,}
+{0x10ec, 0x8029, "RealTek RTL-8029", REALTEK_FDX},
+{0x1050, 0x0940, "Winbond 89C940", 0},
+{0x1050, 0x5a5a, "Winbond w89c940", 0},
+{0x8e2e, 0x3000, "KTI ET32P2", 0},
+{0x4a14, 0x5000, "NetVin NV5000SC", 0},
+{0x1106, 0x0926, "Via 86C926", ONLY_16BIT_IO},
+{0x10bd, 0x0e34, "SureCom NE34", 0},
+{0x12c3, 0x0058, "Holtek HT80232", ONLY_16BIT_IO|HOLTEK_FDX},
+{0x12c3, 0x5598, "Holtek HT80229", ONLY_32BIT_IO|HOLTEK_FDX|STOP_PG_0x60 },
+{0x11f6, 0x1401, "Compex RL2000", 0},
+{0,}
};
/* ---- No user-serviceable parts below ---- */
@@ -119,7 +141,7 @@
static void ne2k_pci_block_output(struct device *dev, const int count,
const unsigned char *buf, const int start_page);
-
+
/* No room in the standard 8390 structure for extra info we need. */
struct ne2k_pci_card {
@@ -136,8 +158,7 @@
init_module(void)
{
/* We must emit version information. */
- if (debug)
- printk(KERN_INFO "%s", version);
+ printk(KERN_INFO "%s\n", version);
if (ne2k_pci_probe(0)) {
printk(KERN_NOTICE "ne2k-pci.c: No useable cards found, driver NOT installed.\n");
@@ -220,7 +241,7 @@
{
static unsigned version_printed = 0;
if (version_printed++ == 0)
- printk(KERN_INFO "%s", version);
+ printk(KERN_INFO "%s\n", version);
}
#endif
@@ -263,8 +284,8 @@
return cards_found ? 0 : -ENODEV;
}
-__initfunc (static struct device *ne2k_pci_probe1(struct device *dev, long ioaddr, int irq,
- int chip_idx))
+__initfunc (static struct device *ne2k_pci_probe1(struct device *dev,
+ long ioaddr, int irq, int chip_idx))
{
int i;
unsigned char SA_prom[32];
@@ -291,6 +312,8 @@
dev = init_etherdev(dev, 0);
+ if (!dev) return 0;
+
/* Reset card. Who knows what dain-bramaged state it was left in. */
{
unsigned long reset_start_time = jiffies;
@@ -342,7 +365,7 @@
/* Note: all PCI cards have at least 16 bit access, so we don't have
to check for 8 bit cards. Most cards permit 32 bit access. */
if (pci_clone_list[chip_idx].flags & ONLY_32BIT_IO) {
- for (i = 0; i < 4 ; i++)
+ for (i = 0; i < 8 ; i++)
((u32 *)SA_prom)[i] = le32_to_cpu(inl(ioaddr + NE_DATAPORT));
} else
for(i = 0; i < 32 /*sizeof(SA_prom)*/; i++)
@@ -379,6 +402,10 @@
ei_status.stop_page = stop_page;
ei_status.word16 = 1;
ei_status.ne2k_flags = pci_clone_list[chip_idx].flags;
+ if (chip_idx < MAX_UNITS) {
+ if (full_duplex[chip_idx] || (options[chip_idx] & FORCE_FDX))
+ ei_status.ne2k_flags |= FORCE_FDX;
+ }
ei_status.rx_start_page = start_page + TX_PAGES;
#ifdef PACKETBUF_MEMSIZE
@@ -401,8 +428,17 @@
{
if (request_irq(dev->irq, ei_interrupt, SA_SHIRQ, dev->name, dev))
return -EAGAIN;
- ei_open(dev);
MOD_INC_USE_COUNT;
+ /* Set full duplex for the chips that we know about. */
+ if (ei_status.ne2k_flags & FORCE_FDX) {
+ long ioaddr = dev->base_addr;
+ if (ei_status.ne2k_flags & REALTEK_FDX) {
+ outb(0xC0 + E8390_NODMA, ioaddr + NE_CMD); /* Page 3 */
+ outb(inb(ioaddr + 0x20) | 0x80, ioaddr + 0x20);
+ } else if (ei_status.ne2k_flags & HOLTEK_FDX)
+ outb(inb(ioaddr + 0x20) | 0x80, ioaddr + 0x20);
+ }
+ ei_open(dev);
return 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)