^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) Written 1992-94 by Donald Becker.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) Copyright 1993 United States Government as represented by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) Director, National Security Agency.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) This software may be used and distributed according to the terms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) of the GNU General Public License, incorporated herein by reference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) The author may be reached as becker@scyld.com, or C/O
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) Scyld Computing Corporation, 410 Severn Ave., Suite 210, Annapolis MD 21403
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) This driver should work with many programmed-I/O 8390-based ethernet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) boards. Currently it supports the NE1000, NE2000, many clones,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) and some Cabletron products.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) Changelog:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) Paul Gortmaker : use ENISR_RDC to monitor Tx PIO uploads, made
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) sanity checks and bad clone support optional.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) Paul Gortmaker : new reset code, reset card after probe at boot.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) Paul Gortmaker : multiple card support for module users.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) Paul Gortmaker : Support for PCI ne2k clones, similar to lance.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) Paul Gortmaker : Allow users with bad cards to avoid full probe.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) Paul Gortmaker : PCI probe changes, more PCI cards supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) rjohnson@analogic.com : Changed init order so an interrupt will only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) occur after memory is allocated for dev->priv. Deallocated memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) last in cleanup_modue()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) Richard Guenther : Added support for ISAPnP cards
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) Paul Gortmaker : Discontinued PCI support - use ne2k-pci.c instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) Hayato Fujiwara : Add m32r support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* Routines for the NatSemi-based designs (NE[12]000). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static const char version1[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) "ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static const char version2[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) "Last modified Nov 1, 2000 by Paul Gortmaker\n";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include <linux/isapnp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #include "8390.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define DRV_NAME "ne"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* Some defines that people can play with if so inclined. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* Do we support clones that don't adhere to 14,15 of the SAprom ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define SUPPORT_NE_BAD_CLONES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* 0xbad = bad sig or no reset ack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define BAD 0xbad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define MAX_NE_CARDS 4 /* Max number of NE cards per module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static struct platform_device *pdev_ne[MAX_NE_CARDS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static int io[MAX_NE_CARDS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) static int irq[MAX_NE_CARDS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static int bad[MAX_NE_CARDS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static u32 ne_msg_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #ifdef MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) module_param_hw_array(io, int, ioport, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) module_param_hw_array(irq, int, irq, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) module_param_array(bad, int, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) module_param_named(msg_enable, ne_msg_enable, uint, 0444);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) MODULE_PARM_DESC(io, "I/O base address(es),required");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) MODULE_PARM_DESC(irq, "IRQ number(s)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) MODULE_PARM_DESC(bad, "Accept card(s) with bad signatures");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) MODULE_PARM_DESC(msg_enable, "Debug message level (see linux/netdevice.h for bitmap)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) MODULE_DESCRIPTION("NE1000/NE2000 ISA/PnP Ethernet driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #endif /* MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /* Do we perform extra sanity checks on stuff ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* #define NE_SANITY_CHECK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* Do we implement the read before write bugfix ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* #define NE_RW_BUGFIX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* Do we have a non std. amount of memory? (in units of 256 byte pages) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* #define PACKETBUF_MEMSIZE 0x40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* This is set up so that no ISA autoprobe takes place. We can't guarantee
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) that the ne2k probe is the last 8390 based probe to take place (as it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) is at boot) and so the probe will get confused by any other 8390 cards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ISA device autoprobes on a running machine are not recommended anyway. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #if !defined(MODULE) && defined(CONFIG_ISA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* Do we need a portlist for the ISA auto-probe ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define NEEDS_PORTLIST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* A zero-terminated list of I/O addresses to be probed at boot. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #ifdef NEEDS_PORTLIST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static unsigned int netcard_portlist[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 0x300, 0x280, 0x320, 0x340, 0x360, 0x380, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static struct isapnp_device_id isapnp_clone_list[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) { ISAPNP_CARD_ID('A','X','E',0x2011),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ISAPNP_VENDOR('A','X','E'), ISAPNP_FUNCTION(0x2011),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) (long) "NetGear EA201" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ISAPNP_VENDOR('E','D','I'), ISAPNP_FUNCTION(0x0216),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (long) "NN NE2000" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) ISAPNP_VENDOR('P','N','P'), ISAPNP_FUNCTION(0x80d6),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) (long) "Generic PNP" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { } /* terminate list */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) MODULE_DEVICE_TABLE(isapnp, isapnp_clone_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #ifdef SUPPORT_NE_BAD_CLONES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* A list of bad clones that we none-the-less recognize. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static struct { const char *name8, *name16; unsigned char SAprefix[4];}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) bad_clone_list[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) {"DE100", "DE200", {0x00, 0xDE, 0x01,}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {"DE120", "DE220", {0x00, 0x80, 0xc8,}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {"NN1000", "NN2000", {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}}, /* Outlaw 4-Dimension cards. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {"Con-Intl_8", "Con-Intl_16", {0x00, 0x00, 0x24}}, /* Connect Int'nl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {"ET-100","ET-200", {0x00, 0x45, 0x54}}, /* YANG and YA clone */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {"COMPEX","COMPEX16",{0x00,0x80,0x48}}, /* Broken ISA Compex cards */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {"E-LAN100", "E-LAN200", {0x00, 0x00, 0x5d}}, /* Broken ne1000 clones */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}}, /* Broken Advantech MoBo */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}}, /* no-name with Realtek chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) #ifdef CONFIG_MACH_TX49XX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {"RBHMA4X00-RTL8019", "RBHMA4X00-RTL8019", {0x00, 0x60, 0x0a}}, /* Toshiba built-in */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}}, /* ShinyNet (SET) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {NULL,}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) /* ---- No user-serviceable parts below ---- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define NE_BASE (dev->base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define NE_CMD 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define NE_DATAPORT 0x10 /* NatSemi-defined port window offset. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define NE_RESET 0x1f /* Issue a read to reset, a write to clear. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #define NE_IO_EXTENT 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define NE1SM_START_PG 0x20 /* First page of TX buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #define NE1SM_STOP_PG 0x40 /* Last page +1 of RX ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #define NESM_START_PG 0x40 /* First page of TX buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #if defined(CONFIG_MACH_TX49XX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) # define DCR_VAL 0x48 /* 8-bit mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #elif defined(CONFIG_ATARI) /* 8-bit mode on Atari, normal on Q40 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) # define DCR_VAL (MACH_IS_ATARI ? 0x48 : 0x49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) # define DCR_VAL 0x49
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static int ne_probe1(struct net_device *dev, unsigned long ioaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static int ne_probe_isapnp(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) static void ne_reset_8390(struct net_device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) int ring_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static void ne_block_input(struct net_device *dev, int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) struct sk_buff *skb, int ring_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) static void ne_block_output(struct net_device *dev, const int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) const unsigned char *buf, const int start_page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* Probe for various non-shared-memory ethercards.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) NEx000-clone boards have a Station Address PROM (SAPROM) in the packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) buffer memory space. NE2000 clones have 0x57,0x57 in bytes 0x0e,0x0f of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) the SAPROM, while other supposed NE2000 clones must be detected by their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) SA prefix.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) Reading the SAPROM from a word-wide card with the 8390 set in byte-wide
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) mode results in doubled values, which can be detected and compensated for.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) The probe is also responsible for initializing the card and filling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) in the 'dev' and 'ei_status' structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) We use the minimum memory size for some ethercard product lines, iff we can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) distinguish models. You can increase the packet buffer size by setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) PACKETBUF_MEMSIZE. Reported Cabletron packet buffer locations are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) E1010 starts at 0x100 and ends at 0x2000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) E1010-x starts at 0x100 and ends at 0x8000. ("-x" means "more memory")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) E2010 starts at 0x100 and ends at 0x4000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) E2010-x starts at 0x100 and ends at 0xffff. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static int __init do_ne_probe(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) unsigned long base_addr = dev->base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) #ifdef NEEDS_PORTLIST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) int orig_irq = dev->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) /* First check any supplied i/o locations. User knows best. <cough> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (base_addr > 0x1ff) { /* Check a single specified location. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) int ret = ne_probe1(dev, base_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) netdev_warn(dev, "ne.c: No NE*000 card found at "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) "i/o = %#lx\n", base_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) else if (base_addr != 0) /* Don't probe at all. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* Then look for any installed ISAPnP clones */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #ifdef NEEDS_PORTLIST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) /* Last resort. The semi-risky ISA auto-probe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int ioaddr = netcard_portlist[base_addr];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) dev->irq = orig_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if (ne_probe1(dev, ioaddr) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) static int __init ne_probe_isapnp(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) for (i = 0; isapnp_clone_list[i].vendor != 0; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct pnp_dev *idev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) while ((idev = pnp_find_dev(NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) isapnp_clone_list[i].vendor,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) isapnp_clone_list[i].function,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) idev))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Avoid already found cards from previous calls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (pnp_device_attach(idev) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (pnp_activate_dev(idev) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) pnp_device_detach(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /* if no io and irq, search for next */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) if (!pnp_port_valid(idev, 0) || !pnp_irq_valid(idev, 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) pnp_device_detach(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) /* found it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) dev->base_addr = pnp_port_start(idev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) dev->irq = pnp_irq(idev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) netdev_info(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) "ne.c: ISAPnP reports %s at i/o %#lx, irq %d.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) (char *) isapnp_clone_list[i].driver_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) dev->base_addr, dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (ne_probe1(dev, dev->base_addr) != 0) { /* Shouldn't happen. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) netdev_err(dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) "ne.c: Probe of ISAPnP card at %#lx failed.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) dev->base_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) pnp_device_detach(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) ei_status.priv = (unsigned long)idev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) if (!idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) static int __init ne_probe1(struct net_device *dev, unsigned long ioaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) unsigned char SA_prom[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) int wordlength = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) const char *name = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) int start_page, stop_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) int neX000, ctron, copam, bad_card;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int reg0, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) static unsigned version_printed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct ei_device *ei_local = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (!request_region(ioaddr, NE_IO_EXTENT, DRV_NAME))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) reg0 = inb_p(ioaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (reg0 == 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) /* Do a preliminary verification that we have a 8390. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) int regd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) regd = inb_p(ioaddr + 0x0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) outb_p(0xff, ioaddr + 0x0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) outb_p(reg0, ioaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) if ((ne_msg_enable & NETIF_MSG_DRV) && (version_printed++ == 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) netdev_info(dev, "%s%s", version1, version2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) netdev_info(dev, "NE*000 ethercard probe at %#3lx:", ioaddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* A user with a poor card that fails to ack the reset, or that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) does not have a valid 0x57,0x57 signature can still use this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) without having to recompile. Specifying an i/o address along
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) with an otherwise unused dev->mem_end value of "0xBAD" will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) cause the driver to skip these parts of the probe. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) bad_card = ((dev->base_addr != 0) && (dev->mem_end == BAD));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) /* Reset card. Who knows what dain-bramaged state it was left in. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) unsigned long reset_start_time = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (bad_card) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) pr_cont(" (warning: no reset ack)");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) pr_cont(" not found (no reset ack).\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) outb_p(0xff, ioaddr + EN0_ISR); /* Ack all intr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* Read the 16 bytes of station address PROM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) We must first initialize registers, similar to NS8390p_init(eifdev, 0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) We can't reliably read the SAPROM address without this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) (I learned the hard way!). */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct {unsigned char value, offset; } program_seq[] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {0x00, EN0_RCNTLO}, /* Clear the count regs. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {0x00, EN0_RCNTHI},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) {0x00, EN0_IMR}, /* Mask completion irq. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) {0xFF, EN0_ISR},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {32, EN0_RCNTLO},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) {0x00, EN0_RCNTHI},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {0x00, EN0_RSARHI},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {E8390_RREAD+E8390_START, E8390_CMD},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) for (i = 0; i < ARRAY_SIZE(program_seq); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) SA_prom[i] = inb(ioaddr + NE_DATAPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) if (SA_prom[i] != SA_prom[i+1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) wordlength = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) if (wordlength == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) for (i = 0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) SA_prom[i] = SA_prom[i+i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) /* We must set the 8390 for word mode. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) outb_p(DCR_VAL, ioaddr + EN0_DCFG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) start_page = NESM_START_PG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) * Realtek RTL8019AS datasheet says that the PSTOP register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) * shouldn't exceed 0x60 in 8-bit mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) * This chip can be identified by reading the signature from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) * the remote byte count registers (otherwise write-only)...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if ((DCR_VAL & 0x01) == 0 && /* 8-bit mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) inb(ioaddr + EN0_RCNTLO) == 0x50 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) inb(ioaddr + EN0_RCNTHI) == 0x70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) stop_page = 0x60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) stop_page = NESM_STOP_PG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) start_page = NE1SM_START_PG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) stop_page = NE1SM_STOP_PG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) neX000 = (SA_prom[14] == 0x57 && SA_prom[15] == 0x57);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) ctron = (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) copam = (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /* Set up the rest of the parameters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (neX000 || bad_card || copam) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) name = (wordlength == 2) ? "NE2000" : "NE1000";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) else if (ctron)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) start_page = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) stop_page = (wordlength == 2) ? 0x40 : 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) #ifdef SUPPORT_NE_BAD_CLONES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) /* Ack! Well, there might be a *bad* NE*000 clone there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) Check for total bogus addresses. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) for (i = 0; bad_clone_list[i].name8; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) SA_prom[2] == bad_clone_list[i].SAprefix[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) if (wordlength == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) name = bad_clone_list[i].name16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) name = bad_clone_list[i].name8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (bad_clone_list[i].name8 == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) pr_cont(" not found (invalid signature %2.2x %2.2x).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) SA_prom[14], SA_prom[15]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) pr_cont(" not found.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) ret = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if (dev->irq < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) unsigned long cookie = probe_irq_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) outb_p(0x00, ioaddr + EN0_RCNTLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) outb_p(0x00, ioaddr + EN0_RCNTHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) mdelay(10); /* wait 10ms for interrupt to propagate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) dev->irq = probe_irq_off(cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (ne_msg_enable & NETIF_MSG_PROBE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) pr_cont(" autoirq is %d", dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) } else if (dev->irq == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) or don't know which one to set. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) dev->irq = 9;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (! dev->irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) pr_cont(" failed to detect IRQ line.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) ret = -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) /* Snarf the interrupt now. There's no point in waiting since we cannot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) share and the board will usually be enabled. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) ret = request_irq(dev->irq, eip_interrupt, 0, name, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) pr_cont(" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) goto err_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) dev->base_addr = ioaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) for (i = 0; i < ETH_ALEN; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) dev->dev_addr[i] = SA_prom[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) pr_cont("%pM\n", dev->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) ei_status.name = name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) ei_status.tx_start_page = start_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) ei_status.stop_page = stop_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) /* Use 16-bit mode only if this wasn't overridden by DCR_VAL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) ei_status.word16 = (wordlength == 2 && (DCR_VAL & 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) ei_status.rx_start_page = start_page + TX_PAGES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) #ifdef PACKETBUF_MEMSIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /* Allow the packet buffer size to be overridden by know-it-alls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) ei_status.reset_8390 = &ne_reset_8390;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) ei_status.block_input = &ne_block_input;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) ei_status.block_output = &ne_block_output;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) ei_status.get_8390_hdr = &ne_get_8390_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) ei_status.priv = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) dev->netdev_ops = &eip_netdev_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) NS8390p_init(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) ei_local->msg_enable = ne_msg_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) ret = register_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) goto out_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) netdev_info(dev, "%s found at %#lx, using IRQ %d.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) name, ioaddr, dev->irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) out_irq:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) free_irq(dev->irq, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) err_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) release_region(ioaddr, NE_IO_EXTENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) /* Hard reset the card. This used to pause for the same period that a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 8390 reset command required, but that shouldn't be necessary. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) static void ne_reset_8390(struct net_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) unsigned long reset_start_time = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) struct ei_device *ei_local = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) netif_dbg(ei_local, hw, dev, "resetting the 8390 t=%ld...\n", jiffies);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) ei_status.txing = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) ei_status.dmaing = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) /* This check _should_not_ be necessary, omit eventually. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) if (time_after(jiffies, reset_start_time + 2*HZ/100)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) netdev_err(dev, "ne_reset_8390() did not complete.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) outb_p(ENISR_RESET, NE_BASE + EN0_ISR); /* Ack intr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) /* Grab the 8390 specific header. Similar to the block_input routine, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) we don't need to be concerned with ring wrap as the header will be at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) the start of a page, so we optimize accordingly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) int nic_base = dev->base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /* This *shouldn't* happen. If it does, it's the last thing you'll see */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) if (ei_status.dmaing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) netdev_err(dev, "DMAing conflict in ne_get_8390_hdr "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) "[DMAstat:%d][irqlock:%d].\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) ei_status.dmaing, ei_status.irqlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) ei_status.dmaing |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) outb_p(0, nic_base + EN0_RCNTHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) outb_p(ring_page, nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) if (ei_status.word16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) ei_status.dmaing &= ~0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) le16_to_cpus(&hdr->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) /* Block input and output, similar to the Crynwr packet driver. If you
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) are porting to a new ethercard, look at the packet driver source for hints.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) The NEx000 doesn't share the on-board packet memory -- you have to put
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) the packet out through the "remote DMA" dataport using outb. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) static void ne_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) int xfer_count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) struct ei_device *ei_local = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) int nic_base = dev->base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) char *buf = skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) /* This *shouldn't* happen. If it does, it's the last thing you'll see */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (ei_status.dmaing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) netdev_err(dev, "DMAing conflict in ne_block_input "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) "[DMAstat:%d][irqlock:%d].\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) ei_status.dmaing, ei_status.irqlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) ei_status.dmaing |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) outb_p(count & 0xff, nic_base + EN0_RCNTLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) outb_p(count >> 8, nic_base + EN0_RCNTHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if (ei_status.word16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) insw(NE_BASE + NE_DATAPORT,buf,count>>1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) if (count & 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) buf[count-1] = inb(NE_BASE + NE_DATAPORT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) xfer_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) insb(NE_BASE + NE_DATAPORT, buf, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /* This was for the ALPHA version only, but enough people have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) been encountering problems so it is still here. If you see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) this message you either 1) have a slightly incompatible clone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) or 2) have noise/speed problems with your bus. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (netif_msg_rx_status(ei_local))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) /* DMA termination address check... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) int addr, tries = 20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) -- it's broken for Rx on some cards! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) int high = inb_p(nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) int low = inb_p(nic_base + EN0_RSARLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) addr = (high << 8) + low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) if (((ring_offset + xfer_count) & 0xff) == low)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) } while (--tries > 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) if (tries <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) netdev_warn(dev, "RX transfer address mismatch,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) "%#4.4x (expected) vs. %#4.4x (actual).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) ring_offset + xfer_count, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) ei_status.dmaing &= ~0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) static void ne_block_output(struct net_device *dev, int count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) const unsigned char *buf, const int start_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) int nic_base = NE_BASE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) unsigned long dma_start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int retries = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) struct ei_device *ei_local = netdev_priv(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) /* Round the count up for word writes. Do we need to do this?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) What effect will an odd byte count have on the 8390?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) I should check someday. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) if (ei_status.word16 && (count & 0x01))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) /* This *shouldn't* happen. If it does, it's the last thing you'll see */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) if (ei_status.dmaing)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) netdev_err(dev, "DMAing conflict in ne_block_output."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) "[DMAstat:%d][irqlock:%d]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) ei_status.dmaing, ei_status.irqlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) ei_status.dmaing |= 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) /* We should already be in page 0, but to be safe... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) retry:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) #ifdef NE8390_RW_BUGFIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) /* Handle the read-before-write bug the same way as the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) Crynwr packet driver -- the NatSemi method doesn't work.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) Actually this doesn't always work either, but if you have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) problems with your NEx000 this is better than nothing! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) outb_p(0x42, nic_base + EN0_RCNTLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) outb_p(0x00, nic_base + EN0_RCNTHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) outb_p(0x42, nic_base + EN0_RSARLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) outb_p(0x00, nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) /* Make certain that the dummy read has occurred. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) udelay(6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) outb_p(ENISR_RDC, nic_base + EN0_ISR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) /* Now the normal output. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) outb_p(count & 0xff, nic_base + EN0_RCNTLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) outb_p(count >> 8, nic_base + EN0_RCNTHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) outb_p(0x00, nic_base + EN0_RSARLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) outb_p(start_page, nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) if (ei_status.word16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) outsb(NE_BASE + NE_DATAPORT, buf, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) dma_start = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) #ifdef NE_SANITY_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) /* This was for the ALPHA version only, but enough people have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) been encountering problems so it is still here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) if (netif_msg_tx_queued(ei_local))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /* DMA termination address check... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) int addr, tries = 20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) int high = inb_p(nic_base + EN0_RSARHI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) int low = inb_p(nic_base + EN0_RSARLO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) addr = (high << 8) + low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if ((start_page << 8) + count == addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) } while (--tries > 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) if (tries <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) netdev_warn(dev, "Tx packet transfer address mismatch,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) "%#4.4x (expected) vs. %#4.4x (actual).\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) (start_page << 8) + count, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (retries++ == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) goto retry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) netdev_warn(dev, "timeout waiting for Tx RDC.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) ne_reset_8390(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) NS8390p_init(dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) ei_status.dmaing &= ~0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) static int __init ne_drv_probe(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) int err, this_dev = pdev->id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) struct resource *res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) dev = alloc_eip_netdev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) /* ne.c doesn't populate resources in platform_device, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) * rbtx4927_ne_init and rbtx4938_ne_init do register devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) * with resources.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) res = platform_get_resource(pdev, IORESOURCE_IO, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) dev->base_addr = res->start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) dev->irq = platform_get_irq(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) if (this_dev < 0 || this_dev >= MAX_NE_CARDS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) dev->base_addr = io[this_dev];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) dev->irq = irq[this_dev];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) dev->mem_end = bad[this_dev];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) SET_NETDEV_DEV(dev, &pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) err = do_ne_probe(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) platform_set_drvdata(pdev, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) /* Update with any values found by probing, don't update if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) * resources were specified.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (!res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) io[this_dev] = dev->base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) irq[this_dev] = dev->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) static int ne_drv_remove(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) struct net_device *dev = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) if (dev) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) netif_device_detach(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) unregister_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) if (idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) pnp_device_detach(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) /* Careful ne_drv_remove can be called twice, once from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) * the platform_driver.remove and again when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) * platform_device is being removed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) ei_status.priv = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) free_irq(dev->irq, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) release_region(dev->base_addr, NE_IO_EXTENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) /* Remove unused devices or all if true. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) static void ne_loop_rm_unreg(int all)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) int this_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) pdev = pdev_ne[this_dev];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) /* No network device == unused */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (pdev && (!platform_get_drvdata(pdev) || all)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) ne_drv_remove(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) platform_device_unregister(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) pdev_ne[this_dev] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) static int ne_drv_suspend(struct platform_device *pdev, pm_message_t state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) struct net_device *dev = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) if (netif_running(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) netif_device_detach(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) if (idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) pnp_stop_dev(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) static int ne_drv_resume(struct platform_device *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) struct net_device *dev = platform_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) if (netif_running(dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) if (idev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) pnp_start_dev(idev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) ne_reset_8390(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) NS8390p_init(dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) netif_device_attach(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) #define ne_drv_suspend NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) #define ne_drv_resume NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) static struct platform_driver ne_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) .remove = ne_drv_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) .suspend = ne_drv_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) .resume = ne_drv_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) .name = DRV_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) static void __init ne_add_devices(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) int this_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) if (pdev_ne[this_dev])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) pdev = platform_device_register_simple(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) DRV_NAME, this_dev, NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) if (IS_ERR(pdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) pdev_ne[this_dev] = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) #ifdef MODULE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) int __init init_module(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) ne_add_devices();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) retval = platform_driver_probe(&ne_driver, ne_drv_probe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) if (io[0] == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) pr_notice("ne.c: You must supply \"io=0xNNN\""
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) " value(s) for ISA cards.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) ne_loop_rm_unreg(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) /* Unregister unused platform_devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) ne_loop_rm_unreg(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) #else /* MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) static int __init ne_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) int retval = platform_driver_probe(&ne_driver, ne_drv_probe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* Unregister unused platform_devices. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) ne_loop_rm_unreg(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) module_init(ne_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) struct net_device * __init ne_probe(int unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) int this_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) /* Find an empty slot, that is no net_device and zero io port. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) this_dev = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) while ((pdev_ne[this_dev] && platform_get_drvdata(pdev_ne[this_dev])) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) io[this_dev]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) if (++this_dev == MAX_NE_CARDS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) /* Get irq, io from kernel command line */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) dev = alloc_eip_netdev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) sprintf(dev->name, "eth%d", unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) netdev_boot_setup_check(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) io[this_dev] = dev->base_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) irq[this_dev] = dev->irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) bad[this_dev] = dev->mem_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) free_netdev(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) ne_add_devices();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) /* return the first device found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) for (this_dev = 0; this_dev < MAX_NE_CARDS; this_dev++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (pdev_ne[this_dev]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) dev = platform_get_drvdata(pdev_ne[this_dev]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) if (dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) #endif /* MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) static void __exit ne_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) platform_driver_unregister(&ne_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) ne_loop_rm_unreg(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) module_exit(ne_exit);