1 /*======================================================================
 
   3     A PCMCIA ethernet driver for SMC91c92-based cards.
 
   5     This driver supports Megahertz PCMCIA ethernet cards; and
 
   6     Megahertz, Motorola, Ositech, and Psion Dacom ethernet/modem
 
   9     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
 
  11     smc91c92_cs.c 1.122 2002/10/25 06:26:39
 
  13     This driver contains code written by Donald Becker
 
  14     (becker@scyld.com), Rowan Hughes (x-csrdh@jcu.edu.au),
 
  15     David Hinds (dahinds@users.sourceforge.net), and Erik Stahlman
 
  16     (erik@vt.edu).  Donald wrote the SMC 91c92 code using parts of
 
  17     Erik's SMC 91c94 driver.  Rowan wrote a similar driver, and I've
 
  18     incorporated some parts of his driver here.  I (Dave) wrote most
 
  19     of the PCMCIA glue code, and the Ositech support code.  Kelly
 
  20     Stephens (kstephen@holli.com) added support for the Motorola
 
  21     Mariner, with help from Allen Brost.
 
  23     This software may be used and distributed according to the terms of
 
  24     the GNU General Public License, incorporated herein by reference.
 
  26 ======================================================================*/
 
  28 #include <linux/module.h>
 
  29 #include <linux/kernel.h>
 
  30 #include <linux/init.h>
 
  31 #include <linux/slab.h>
 
  32 #include <linux/string.h>
 
  33 #include <linux/timer.h>
 
  34 #include <linux/interrupt.h>
 
  35 #include <linux/delay.h>
 
  36 #include <linux/crc32.h>
 
  37 #include <linux/netdevice.h>
 
  38 #include <linux/etherdevice.h>
 
  39 #include <linux/skbuff.h>
 
  40 #include <linux/if_arp.h>
 
  41 #include <linux/ioport.h>
 
  42 #include <linux/ethtool.h>
 
  43 #include <linux/mii.h>
 
  44 #include <linux/jiffies.h>
 
  46 #include <pcmcia/cs_types.h>
 
  47 #include <pcmcia/cs.h>
 
  48 #include <pcmcia/cistpl.h>
 
  49 #include <pcmcia/cisreg.h>
 
  50 #include <pcmcia/ciscode.h>
 
  51 #include <pcmcia/ds.h>
 
  52 #include <pcmcia/ss.h>
 
  55 #include <asm/system.h>
 
  56 #include <asm/uaccess.h>
 
  58 /* Ositech Seven of Diamonds firmware */
 
  61 /*====================================================================*/
 
  63 static const char *if_names[] = { "auto", "10baseT", "10base2"};
 
  65 /* Module parameters */
 
  67 MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
 
  68 MODULE_LICENSE("GPL");
 
  70 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
 
  73   Transceiver/media type.
 
  75    1 = 10baseT (and autoselect if #define AUTOSELECT),
 
  78 INT_MODULE_PARM(if_port, 0);
 
  81 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
 
  82 static const char *version =
 
  83 "smc91c92_cs.c 1.123 2006/11/09 Donald Becker, becker@scyld.com.\n";
 
  84 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 
  86 #define DEBUG(n, args...)
 
  89 #define DRV_NAME        "smc91c92_cs"
 
  90 #define DRV_VERSION     "1.123"
 
  92 /*====================================================================*/
 
  94 /* Operational parameter that usually are not changed. */
 
  96 /* Time in jiffies before concluding Tx hung */
 
  97 #define TX_TIMEOUT              ((400*HZ)/1000)
 
  99 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
 
 102 /* Times to check the check the chip before concluding that it doesn't
 
 103    currently have room for another Tx packet. */
 
 104 #define MEMORY_WAIT_TIME        8
 
 107         struct pcmcia_device    *p_dev;
 
 111     struct net_device_stats     stats;
 
 113     struct sk_buff              *saved_skb;
 
 117     struct timer_list           media;
 
 118     int                         watchdog, tx_err;
 
 119     u_short                     media_status;
 
 122     struct mii_if_info          mii_if;
 
 133 /* Special definitions for Megahertz multifunction cards */
 
 134 #define MEGAHERTZ_ISR           0x0380
 
 136 /* Special function registers for Motorola Mariner */
 
 137 #define MOT_LAN                 0x0000
 
 138 #define MOT_UART                0x0020
 
 139 #define MOT_EEPROM              0x20
 
 142 (COR_LEVEL_REQ | COR_FUNC_ENA | COR_ADDR_DECODE | COR_IREQ_ENA)
 
 144 /* Special function registers for Ositech cards */
 
 145 #define OSITECH_AUI_CTL         0x0c
 
 146 #define OSITECH_PWRDOWN         0x0d
 
 147 #define OSITECH_RESET           0x0e
 
 148 #define OSITECH_ISR             0x0f
 
 149 #define OSITECH_AUI_PWR         0x0c
 
 150 #define OSITECH_RESET_ISR       0x0e
 
 152 #define OSI_AUI_PWR             0x40
 
 153 #define OSI_LAN_PWRDOWN         0x02
 
 154 #define OSI_MODEM_PWRDOWN       0x01
 
 155 #define OSI_LAN_RESET           0x02
 
 156 #define OSI_MODEM_RESET         0x01
 
 158 /* Symbolic constants for the SMC91c9* series chips, from Erik Stahlman. */
 
 159 #define BANK_SELECT             14              /* Window select register. */
 
 160 #define SMC_SELECT_BANK(x)  { outw(x, ioaddr + BANK_SELECT); }
 
 162 /* Bank 0 registers. */
 
 163 #define TCR             0       /* transmit control register */
 
 164 #define  TCR_CLEAR      0       /* do NOTHING */
 
 165 #define  TCR_ENABLE     0x0001  /* if this is 1, we can transmit */
 
 166 #define  TCR_PAD_EN     0x0080  /* pads short packets to 64 bytes */
 
 167 #define  TCR_MONCSN     0x0400  /* Monitor Carrier. */
 
 168 #define  TCR_FDUPLX     0x0800  /* Full duplex mode. */
 
 169 #define  TCR_NORMAL TCR_ENABLE | TCR_PAD_EN
 
 171 #define EPH             2       /* Ethernet Protocol Handler report. */
 
 172 #define  EPH_TX_SUC     0x0001
 
 173 #define  EPH_SNGLCOL    0x0002
 
 174 #define  EPH_MULCOL     0x0004
 
 175 #define  EPH_LTX_MULT   0x0008
 
 176 #define  EPH_16COL      0x0010
 
 177 #define  EPH_SQET       0x0020
 
 178 #define  EPH_LTX_BRD    0x0040
 
 179 #define  EPH_TX_DEFR    0x0080
 
 180 #define  EPH_LAT_COL    0x0200
 
 181 #define  EPH_LOST_CAR   0x0400
 
 182 #define  EPH_EXC_DEF    0x0800
 
 183 #define  EPH_CTR_ROL    0x1000
 
 184 #define  EPH_RX_OVRN    0x2000
 
 185 #define  EPH_LINK_OK    0x4000
 
 186 #define  EPH_TX_UNRN    0x8000
 
 187 #define MEMINFO         8       /* Memory Information Register */
 
 188 #define MEMCFG          10      /* Memory Configuration Register */
 
 190 /* Bank 1 registers. */
 
 192 #define  CFG_MII_SELECT         0x8000  /* 91C100 only */
 
 193 #define  CFG_NO_WAIT            0x1000
 
 194 #define  CFG_FULL_STEP          0x0400
 
 195 #define  CFG_SET_SQLCH          0x0200
 
 196 #define  CFG_AUI_SELECT         0x0100
 
 197 #define  CFG_16BIT              0x0080
 
 198 #define  CFG_DIS_LINK           0x0040
 
 199 #define  CFG_STATIC             0x0030
 
 200 #define  CFG_IRQ_SEL_1          0x0004
 
 201 #define  CFG_IRQ_SEL_0          0x0002
 
 206 #define  CTL_STORE              0x0001
 
 207 #define  CTL_RELOAD             0x0002
 
 208 #define  CTL_EE_SELECT          0x0004
 
 209 #define  CTL_TE_ENABLE          0x0020
 
 210 #define  CTL_CR_ENABLE          0x0040
 
 211 #define  CTL_LE_ENABLE          0x0080
 
 212 #define  CTL_AUTO_RELEASE       0x0800
 
 213 #define  CTL_POWERDOWN          0x2000
 
 215 /* Bank 2 registers. */
 
 217 #define  MC_ALLOC       0x20    /* or with number of 256 byte packets */
 
 218 #define  MC_RESET       0x40
 
 219 #define  MC_RELEASE     0x80    /* remove and release the current rx packet */
 
 220 #define  MC_FREEPKT     0xA0    /* Release packet in PNR register */
 
 221 #define  MC_ENQUEUE     0xC0    /* Enqueue the packet for transmit */
 
 224 #define  FP_RXEMPTY     0x8000
 
 226 #define  PTR_AUTO_INC   0x0040
 
 227 #define  PTR_READ       0x2000
 
 228 #define  PTR_AUTOINC    0x4000
 
 229 #define  PTR_RCV        0x8000
 
 232 #define  IM_RCV_INT             0x1
 
 233 #define  IM_TX_INT              0x2
 
 234 #define  IM_TX_EMPTY_INT        0x4
 
 235 #define  IM_ALLOC_INT           0x8
 
 236 #define  IM_RX_OVRN_INT         0x10
 
 237 #define  IM_EPH_INT             0x20
 
 240 enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002,
 
 241              RxEnable = 0x0100, RxStripCRC = 0x0200};
 
 242 #define  RCR_SOFTRESET  0x8000  /* resets the chip */
 
 243 #define  RCR_STRIP_CRC  0x200   /* strips CRC */
 
 244 #define  RCR_ENABLE     0x100   /* IFF this is set, we can receive packets */
 
 245 #define  RCR_ALMUL      0x4     /* receive all multicast packets */
 
 246 #define  RCR_PROMISC    0x2     /* enable promiscuous mode */
 
 248 /* the normal settings for the RCR register : */
 
 249 #define  RCR_NORMAL     (RCR_STRIP_CRC | RCR_ENABLE)
 
 250 #define  RCR_CLEAR      0x0             /* set it to a base state */
 
 253 /* BANK 3 -- not the same values as in smc9194! */
 
 259 #define REVISION        0x0a
 
 261 /* Transmit status bits. */
 
 262 #define TS_SUCCESS 0x0001
 
 263 #define TS_16COL   0x0010
 
 264 #define TS_LATCOL  0x0200
 
 265 #define TS_LOSTCAR 0x0400
 
 267 /* Receive status bits. */
 
 268 #define RS_ALGNERR      0x8000
 
 269 #define RS_BADCRC       0x2000
 
 270 #define RS_ODDFRAME     0x1000
 
 271 #define RS_TOOLONG      0x0800
 
 272 #define RS_TOOSHORT     0x0400
 
 273 #define RS_MULTICAST    0x0001
 
 274 #define RS_ERRORS       (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
 
 276 #define set_bits(v, p) outw(inw(p)|(v), (p))
 
 277 #define mask_bits(v, p) outw(inw(p)&(v), (p))
 
 279 /*====================================================================*/
 
 281 static void smc91c92_detach(struct pcmcia_device *p_dev);
 
 282 static int smc91c92_config(struct pcmcia_device *link);
 
 283 static void smc91c92_release(struct pcmcia_device *link);
 
 285 static int smc_open(struct net_device *dev);
 
 286 static int smc_close(struct net_device *dev);
 
 287 static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 
 288 static void smc_tx_timeout(struct net_device *dev);
 
 289 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
 
 290 static irqreturn_t smc_interrupt(int irq, void *dev_id);
 
 291 static void smc_rx(struct net_device *dev);
 
 292 static struct net_device_stats *smc_get_stats(struct net_device *dev);
 
 293 static void set_rx_mode(struct net_device *dev);
 
 294 static int s9k_config(struct net_device *dev, struct ifmap *map);
 
 295 static void smc_set_xcvr(struct net_device *dev, int if_port);
 
 296 static void smc_reset(struct net_device *dev);
 
 297 static void media_check(u_long arg);
 
 298 static void mdio_sync(unsigned int addr);
 
 299 static int mdio_read(struct net_device *dev, int phy_id, int loc);
 
 300 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value);
 
 301 static int smc_link_ok(struct net_device *dev);
 
 302 static const struct ethtool_ops ethtool_ops;
 
 304 /*======================================================================
 
 306   smc91c92_attach() creates an "instance" of the driver, allocating
 
 307   local data structures for one device.  The device is registered
 
 310 ======================================================================*/
 
 312 static int smc91c92_probe(struct pcmcia_device *link)
 
 314     struct smc_private *smc;
 
 315     struct net_device *dev;
 
 317     DEBUG(0, "smc91c92_attach()\n");
 
 319     /* Create new ethernet device */
 
 320     dev = alloc_etherdev(sizeof(struct smc_private));
 
 323     smc = netdev_priv(dev);
 
 327     spin_lock_init(&smc->lock);
 
 328     link->io.NumPorts1 = 16;
 
 329     link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
 
 330     link->io.IOAddrLines = 4;
 
 331     link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
 
 332     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
 
 333     link->irq.Handler = &smc_interrupt;
 
 334     link->irq.Instance = dev;
 
 335     link->conf.Attributes = CONF_ENABLE_IRQ;
 
 336     link->conf.IntType = INT_MEMORY_AND_IO;
 
 338     /* The SMC91c92-specific entries in the device structure. */
 
 339     dev->hard_start_xmit = &smc_start_xmit;
 
 340     dev->get_stats = &smc_get_stats;
 
 341     dev->set_config = &s9k_config;
 
 342     dev->set_multicast_list = &set_rx_mode;
 
 343     dev->open = &smc_open;
 
 344     dev->stop = &smc_close;
 
 345     dev->do_ioctl = &smc_ioctl;
 
 346     SET_ETHTOOL_OPS(dev, ðtool_ops);
 
 347 #ifdef HAVE_TX_TIMEOUT
 
 348     dev->tx_timeout = smc_tx_timeout;
 
 349     dev->watchdog_timeo = TX_TIMEOUT;
 
 352     smc->mii_if.dev = dev;
 
 353     smc->mii_if.mdio_read = mdio_read;
 
 354     smc->mii_if.mdio_write = mdio_write;
 
 355     smc->mii_if.phy_id_mask = 0x1f;
 
 356     smc->mii_if.reg_num_mask = 0x1f;
 
 358     return smc91c92_config(link);
 
 359 } /* smc91c92_attach */
 
 361 /*======================================================================
 
 363     This deletes a driver "instance".  The device is de-registered
 
 364     with Card Services.  If it has been released, all local data
 
 365     structures are freed.  Otherwise, the structures will be freed
 
 366     when the device is released.
 
 368 ======================================================================*/
 
 370 static void smc91c92_detach(struct pcmcia_device *link)
 
 372     struct net_device *dev = link->priv;
 
 374     DEBUG(0, "smc91c92_detach(0x%p)\n", link);
 
 377         unregister_netdev(dev);
 
 379     smc91c92_release(link);
 
 382 } /* smc91c92_detach */
 
 384 /*====================================================================*/
 
 386 static int cvt_ascii_address(struct net_device *dev, char *s)
 
 392     for (i = 0; i < 6; i++) {
 
 394         for (j = 0; j < 2; j++) {
 
 397             da += ((c >= '0') && (c <= '9')) ?
 
 398                 (c - '0') : ((c & 0x0f) + 9);
 
 400         dev->dev_addr[i] = da;
 
 405 /*====================================================================*/
 
 407 static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
 
 412         i = pcmcia_get_first_tuple(handle, tuple);
 
 415         i = pcmcia_get_tuple_data(handle, tuple);
 
 418         return pcmcia_parse_tuple(tuple, parse);
 
 421 static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
 
 426         if ((i = pcmcia_get_next_tuple(handle, tuple)) != 0 ||
 
 427                         (i = pcmcia_get_tuple_data(handle, tuple)) != 0)
 
 429         return pcmcia_parse_tuple(tuple, parse);
 
 432 /*======================================================================
 
 434     Configuration stuff for Megahertz cards
 
 436     mhz_3288_power() is used to power up a 3288's ethernet chip.
 
 437     mhz_mfc_config() handles socket setup for multifunction (1144
 
 438     and 3288) cards.  mhz_setup() gets a card's hardware ethernet
 
 441 ======================================================================*/
 
 443 static int mhz_3288_power(struct pcmcia_device *link)
 
 445     struct net_device *dev = link->priv;
 
 446     struct smc_private *smc = netdev_priv(dev);
 
 449     /* Read the ISR twice... */
 
 450     readb(smc->base+MEGAHERTZ_ISR);
 
 452     readb(smc->base+MEGAHERTZ_ISR);
 
 457     /* Now read and write the COR... */
 
 458     tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
 
 460     writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
 
 465 static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
 
 466                                 cistpl_cftable_entry_t *cf,
 
 467                                 cistpl_cftable_entry_t *dflt,
 
 472         p_dev->io.BasePort2 = cf->io.win[0].base;
 
 473         for (k = 0; k < 0x400; k += 0x10) {
 
 476                 p_dev->io.BasePort1 = k ^ 0x300;
 
 477                 if (!pcmcia_request_io(p_dev, &p_dev->io))
 
 483 static int mhz_mfc_config(struct pcmcia_device *link)
 
 485     struct net_device *dev = link->priv;
 
 486     struct smc_private *smc = netdev_priv(dev);
 
 487     struct smc_cfg_mem *cfg_mem;
 
 492     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
 
 496     link->conf.Attributes |= CONF_ENABLE_SPKR;
 
 497     link->conf.Status = CCSR_AUDIO_ENA;
 
 498     link->irq.Attributes =
 
 499         IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
 
 500     link->io.IOAddrLines = 16;
 
 501     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
 
 502     link->io.NumPorts2 = 8;
 
 504     /* The Megahertz combo cards have modem-like CIS entries, so
 
 505        we have to explicitly try a bunch of port combinations. */
 
 506     if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL))
 
 508     dev->base_addr = link->io.BasePort1;
 
 510     /* Allocate a memory window, for accessing the ISR */
 
 511     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
 
 512     req.Base = req.Size = 0;
 
 514     i = pcmcia_request_window(&link, &req, &link->win);
 
 517     smc->base = ioremap(req.Base, req.Size);
 
 518     mem.CardOffset = mem.Page = 0;
 
 519     if (smc->manfid == MANFID_MOTOROLA)
 
 520         mem.CardOffset = link->conf.ConfigBase;
 
 521     i = pcmcia_map_mem_page(link->win, &mem);
 
 524         && (smc->manfid == MANFID_MEGAHERTZ)
 
 525         && (smc->cardid == PRODID_MEGAHERTZ_EM3288))
 
 526         mhz_3288_power(link);
 
 533 static int mhz_setup(struct pcmcia_device *link)
 
 535     struct net_device *dev = link->priv;
 
 536     struct smc_cfg_mem *cfg_mem;
 
 539     u_char *buf, *station_addr;
 
 542     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
 
 546     tuple = &cfg_mem->tuple;
 
 547     parse = &cfg_mem->parse;
 
 550     tuple->Attributes = tuple->TupleOffset = 0;
 
 551     tuple->TupleData = (cisdata_t *)buf;
 
 552     tuple->TupleDataMax = 255;
 
 554     /* Read the station address from the CIS.  It is stored as the last
 
 555        (fourth) string in the Version 1 Version/ID tuple. */
 
 556     tuple->DesiredTuple = CISTPL_VERS_1;
 
 557     if (first_tuple(link, tuple, parse) != 0) {
 
 561     /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */
 
 562     if (next_tuple(link, tuple, parse) != 0)
 
 563         first_tuple(link, tuple, parse);
 
 564     if (parse->version_1.ns > 3) {
 
 565         station_addr = parse->version_1.str + parse->version_1.ofs[3];
 
 566         if (cvt_ascii_address(dev, station_addr) == 0) {
 
 572     /* Another possibility: for the EM3288, in a special tuple */
 
 573     tuple->DesiredTuple = 0x81;
 
 574     if (pcmcia_get_first_tuple(link, tuple) != 0) {
 
 578     if (pcmcia_get_tuple_data(link, tuple) != 0) {
 
 583     if (cvt_ascii_address(dev, buf) == 0) {
 
 593 /*======================================================================
 
 595     Configuration stuff for the Motorola Mariner
 
 597     mot_config() writes directly to the Mariner configuration
 
 598     registers because the CIS is just bogus.
 
 600 ======================================================================*/
 
 602 static void mot_config(struct pcmcia_device *link)
 
 604     struct net_device *dev = link->priv;
 
 605     struct smc_private *smc = netdev_priv(dev);
 
 606     unsigned int ioaddr = dev->base_addr;
 
 607     unsigned int iouart = link->io.BasePort2;
 
 609     /* Set UART base address and force map with COR bit 1 */
 
 610     writeb(iouart & 0xff,        smc->base + MOT_UART + CISREG_IOBASE_0);
 
 611     writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1);
 
 612     writeb(MOT_NORMAL,           smc->base + MOT_UART + CISREG_COR);
 
 614     /* Set SMC base address and force map with COR bit 1 */
 
 615     writeb(ioaddr & 0xff,        smc->base + MOT_LAN + CISREG_IOBASE_0);
 
 616     writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1);
 
 617     writeb(MOT_NORMAL,           smc->base + MOT_LAN + CISREG_COR);
 
 619     /* Wait for things to settle down */
 
 623 static int mot_setup(struct pcmcia_device *link)
 
 625     struct net_device *dev = link->priv;
 
 626     unsigned int ioaddr = dev->base_addr;
 
 630     /* Read Ethernet address from Serial EEPROM */
 
 632     for (i = 0; i < 3; i++) {
 
 634         outw(MOT_EEPROM + i, ioaddr + POINTER);
 
 636         outw((CTL_RELOAD | CTL_EE_SELECT), ioaddr + CONTROL);
 
 638         for (loop = wait = 0; loop < 200; loop++) {
 
 640             wait = ((CTL_RELOAD | CTL_STORE) & inw(ioaddr + CONTROL));
 
 641             if (wait == 0) break;
 
 647         addr = inw(ioaddr + GENERAL);
 
 648         dev->dev_addr[2*i]   = addr & 0xff;
 
 649         dev->dev_addr[2*i+1] = (addr >> 8) & 0xff;
 
 655 /*====================================================================*/
 
 657 static int smc_configcheck(struct pcmcia_device *p_dev,
 
 658                            cistpl_cftable_entry_t *cf,
 
 659                            cistpl_cftable_entry_t *dflt,
 
 663         p_dev->io.BasePort1 = cf->io.win[0].base;
 
 664         p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
 
 665         return pcmcia_request_io(p_dev, &p_dev->io);
 
 668 static int smc_config(struct pcmcia_device *link)
 
 670     struct net_device *dev = link->priv;
 
 673     link->io.NumPorts1 = 16;
 
 674     i = pcmcia_loop_config(link, smc_configcheck, NULL);
 
 676             dev->base_addr = link->io.BasePort1;
 
 681 static int smc_setup(struct pcmcia_device *link)
 
 683     struct net_device *dev = link->priv;
 
 684     struct smc_cfg_mem *cfg_mem;
 
 687     cistpl_lan_node_id_t *node_id;
 
 688     u_char *buf, *station_addr;
 
 691     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
 
 695     tuple = &cfg_mem->tuple;
 
 696     parse = &cfg_mem->parse;
 
 699     tuple->Attributes = tuple->TupleOffset = 0;
 
 700     tuple->TupleData = (cisdata_t *)buf;
 
 701     tuple->TupleDataMax = 255;
 
 703     /* Check for a LAN function extension tuple */
 
 704     tuple->DesiredTuple = CISTPL_FUNCE;
 
 705     i = first_tuple(link, tuple, parse);
 
 707         if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID)
 
 709         i = next_tuple(link, tuple, parse);
 
 712         node_id = (cistpl_lan_node_id_t *)parse->funce.data;
 
 713         if (node_id->nb == 6) {
 
 714             for (i = 0; i < 6; i++)
 
 715                 dev->dev_addr[i] = node_id->id[i];
 
 720     /* Try the third string in the Version 1 Version/ID tuple. */
 
 721     if (link->prod_id[2]) {
 
 722         station_addr = link->prod_id[2];
 
 723         if (cvt_ascii_address(dev, station_addr) == 0) {
 
 735 /*====================================================================*/
 
 737 static int osi_config(struct pcmcia_device *link)
 
 739     struct net_device *dev = link->priv;
 
 740     static const unsigned int com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
 
 743     link->conf.Attributes |= CONF_ENABLE_SPKR;
 
 744     link->conf.Status = CCSR_AUDIO_ENA;
 
 745     link->irq.Attributes =
 
 746         IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
 
 747     link->io.NumPorts1 = 64;
 
 748     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
 
 749     link->io.NumPorts2 = 8;
 
 750     link->io.IOAddrLines = 16;
 
 752     /* Enable Hard Decode, LAN, Modem */
 
 753     link->conf.ConfigIndex = 0x23;
 
 755     for (i = j = 0; j < 4; j++) {
 
 756         link->io.BasePort2 = com[j];
 
 757         i = pcmcia_request_io(link, &link->io);
 
 762         /* Fallback: turn off hard decode */
 
 763         link->conf.ConfigIndex = 0x03;
 
 764         link->io.NumPorts2 = 0;
 
 765         i = pcmcia_request_io(link, &link->io);
 
 767     dev->base_addr = link->io.BasePort1 + 0x10;
 
 771 static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
 
 773     struct net_device *dev = link->priv;
 
 774     struct smc_cfg_mem *cfg_mem;
 
 779     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
 
 783     tuple = &cfg_mem->tuple;
 
 786     tuple->Attributes = TUPLE_RETURN_COMMON;
 
 787     tuple->TupleData = (cisdata_t *)buf;
 
 788     tuple->TupleDataMax = 255;
 
 789     tuple->TupleOffset = 0;
 
 791     /* Read the station address from tuple 0x90, subtuple 0x04 */
 
 792     tuple->DesiredTuple = 0x90;
 
 793     i = pcmcia_get_first_tuple(link, tuple);
 
 795         i = pcmcia_get_tuple_data(link, tuple);
 
 796         if ((i != 0) || (buf[0] == 0x04))
 
 798         i = pcmcia_get_next_tuple(link, tuple);
 
 804     for (i = 0; i < 6; i++)
 
 805         dev->dev_addr[i] = buf[i+2];
 
 807     if (((manfid == MANFID_OSITECH) &&
 
 808          (cardid == PRODID_OSITECH_SEVEN)) ||
 
 809         ((manfid == MANFID_PSION) &&
 
 810          (cardid == PRODID_PSION_NET100))) {
 
 811         /* Download the Seven of Diamonds firmware */
 
 812         for (i = 0; i < sizeof(__Xilinx7OD); i++) {
 
 813             outb(__Xilinx7OD[i], link->io.BasePort1+2);
 
 816     } else if (manfid == MANFID_OSITECH) {
 
 817         /* Make sure both functions are powered up */
 
 818         set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
 
 819         /* Now, turn on the interrupt for both card functions */
 
 820         set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
 
 821         DEBUG(2, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
 
 822               inw(link->io.BasePort1 + OSITECH_AUI_PWR),
 
 823               inw(link->io.BasePort1 + OSITECH_RESET_ISR));
 
 831 static int smc91c92_suspend(struct pcmcia_device *link)
 
 833         struct net_device *dev = link->priv;
 
 836                 netif_device_detach(dev);
 
 841 static int smc91c92_resume(struct pcmcia_device *link)
 
 843         struct net_device *dev = link->priv;
 
 844         struct smc_private *smc = netdev_priv(dev);
 
 847         if ((smc->manfid == MANFID_MEGAHERTZ) &&
 
 848             (smc->cardid == PRODID_MEGAHERTZ_EM3288))
 
 849                 mhz_3288_power(link);
 
 850         if (smc->manfid == MANFID_MOTOROLA)
 
 852         if ((smc->manfid == MANFID_OSITECH) &&
 
 853             (smc->cardid != PRODID_OSITECH_SEVEN)) {
 
 854                 /* Power up the card and enable interrupts */
 
 855                 set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
 
 856                 set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
 
 858         if (((smc->manfid == MANFID_OSITECH) &&
 
 859              (smc->cardid == PRODID_OSITECH_SEVEN)) ||
 
 860             ((smc->manfid == MANFID_PSION) &&
 
 861              (smc->cardid == PRODID_PSION_NET100))) {
 
 862                 /* Download the Seven of Diamonds firmware */
 
 863                 for (i = 0; i < sizeof(__Xilinx7OD); i++) {
 
 864                         outb(__Xilinx7OD[i], link->io.BasePort1+2);
 
 870                 netif_device_attach(dev);
 
 877 /*======================================================================
 
 879     This verifies that the chip is some SMC91cXX variant, and returns
 
 880     the revision code if successful.  Otherwise, it returns -ENODEV.
 
 882 ======================================================================*/
 
 884 static int check_sig(struct pcmcia_device *link)
 
 886     struct net_device *dev = link->priv;
 
 887     unsigned int ioaddr = dev->base_addr;
 
 892     if (inw(ioaddr + BANK_SELECT) >> 8 != 0x33) {
 
 893         /* Try powering up the chip */
 
 894         outw(0, ioaddr + CONTROL);
 
 898     /* Try setting bus width */
 
 899     width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
 
 900     s = inb(ioaddr + CONFIG);
 
 905     outb(s, ioaddr + CONFIG);
 
 907     /* Check Base Address Register to make sure bus width is OK */
 
 908     s = inw(ioaddr + BASE_ADDR);
 
 909     if ((inw(ioaddr + BANK_SELECT) >> 8 == 0x33) &&
 
 910         ((s >> 8) != (s & 0xff))) {
 
 912         s = inw(ioaddr + REVISION);
 
 918                     .Attributes = CONF_IO_CHANGE_WIDTH,
 
 920             printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
 
 922             smc91c92_suspend(link);
 
 923             pcmcia_modify_configuration(link, &mod);
 
 924             smc91c92_resume(link);
 
 925             return check_sig(link);
 
 930 /*======================================================================
 
 932     smc91c92_config() is scheduled to run after a CARD_INSERTION event
 
 933     is received, to configure the PCMCIA socket, and to make the
 
 934     ethernet device available to the system.
 
 936 ======================================================================*/
 
 938 #define CS_EXIT_TEST(ret, svc, label)   \
 
 940         cs_error(link, svc, ret);       \
 
 944 static int smc91c92_config(struct pcmcia_device *link)
 
 946     struct net_device *dev = link->priv;
 
 947     struct smc_private *smc = netdev_priv(dev);
 
 952     DECLARE_MAC_BUF(mac);
 
 954     DEBUG(0, "smc91c92_config(0x%p)\n", link);
 
 956     smc->manfid = link->manf_id;
 
 957     smc->cardid = link->card_id;
 
 959     if ((smc->manfid == MANFID_OSITECH) &&
 
 960         (smc->cardid != PRODID_OSITECH_SEVEN)) {
 
 961         i = osi_config(link);
 
 962     } else if ((smc->manfid == MANFID_MOTOROLA) ||
 
 963                ((smc->manfid == MANFID_MEGAHERTZ) &&
 
 964                 ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) ||
 
 965                  (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) {
 
 966         i = mhz_mfc_config(link);
 
 968         i = smc_config(link);
 
 970     CS_EXIT_TEST(i, RequestIO, config_failed);
 
 972     i = pcmcia_request_irq(link, &link->irq);
 
 973     CS_EXIT_TEST(i, RequestIRQ, config_failed);
 
 974     i = pcmcia_request_configuration(link, &link->conf);
 
 975     CS_EXIT_TEST(i, RequestConfiguration, config_failed);
 
 977     if (smc->manfid == MANFID_MOTOROLA)
 
 980     dev->irq = link->irq.AssignedIRQ;
 
 982     if ((if_port >= 0) && (if_port <= 2))
 
 983         dev->if_port = if_port;
 
 985         printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
 
 987     switch (smc->manfid) {
 
 990         i = osi_setup(link, smc->manfid, smc->cardid); break;
 
 992     case MANFID_NEW_MEDIA:
 
 993         i = smc_setup(link); break;
 
 994     case 0x128: /* For broken Megahertz cards */
 
 995     case MANFID_MEGAHERTZ:
 
 996         i = mhz_setup(link); break;
 
 997     case MANFID_MOTOROLA:
 
 998     default: /* get the hw address from EEPROM */
 
 999         i = mot_setup(link); break;
 
1003         printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
 
1010     rev = check_sig(link);
 
1014         case 3: name = "92"; break;
 
1015         case 4: name = ((rev & 15) >= 6) ? "96" : "94"; break;
 
1016         case 5: name = "95"; break;
 
1017         case 7: name = "100"; break;
 
1018         case 8: name = "100-FD"; break;
 
1019         case 9: name = "110"; break;
 
1022     ioaddr = dev->base_addr;
 
1026         mir = inw(ioaddr + MEMINFO) & 0xff;
 
1027         if (mir == 0xff) mir++;
 
1028         /* Get scale factor for memory size */
 
1029         mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200;
 
1030         mir *= 128 * (1<<((mcr >> 9) & 7));
 
1032         smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT;
 
1033         smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC;
 
1034         if (smc->manfid == MANFID_OSITECH)
 
1035             smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0;
 
1036         if ((rev >> 4) >= 7)
 
1037             smc->cfg |= CFG_MII_SELECT;
 
1041     if (smc->cfg & CFG_MII_SELECT) {
 
1044         for (i = 0; i < 32; i++) {
 
1045             j = mdio_read(dev, i, 1);
 
1046             if ((j != 0) && (j != 0xffff)) break;
 
1048         smc->mii_if.phy_id = (i < 32) ? i : -1;
 
1053     link->dev_node = &smc->node;
 
1054     SET_NETDEV_DEV(dev, &handle_to_dev(link));
 
1056     if (register_netdev(dev) != 0) {
 
1057         printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
 
1058         link->dev_node = NULL;
 
1062     strcpy(smc->node.dev_name, dev->name);
 
1064     printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
 
1066            dev->name, name, (rev & 0x0f), dev->base_addr, dev->irq,
 
1067            print_mac(mac, dev->dev_addr));
 
1071             printk(KERN_INFO "  %lu byte", mir);
 
1073             printk(KERN_INFO "  %lu kb", mir>>10);
 
1074         printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
 
1075                "MII" : if_names[dev->if_port]);
 
1078     if (smc->cfg & CFG_MII_SELECT) {
 
1079         if (smc->mii_if.phy_id != -1) {
 
1080             DEBUG(0, "  MII transceiver at index %d, status %x.\n",
 
1081                   smc->mii_if.phy_id, j);
 
1083             printk(KERN_NOTICE "  No MII transceivers found!\n");
 
1089     unregister_netdev(dev);
 
1090 config_failed:                  /* CS_EXIT_TEST() calls jump to here... */
 
1091     smc91c92_release(link);
 
1093 } /* smc91c92_config */
 
1095 /*======================================================================
 
1097     After a card is removed, smc91c92_release() will unregister the net
 
1098     device, and release the PCMCIA configuration.  If the device is
 
1099     still open, this will be postponed until it is closed.
 
1101 ======================================================================*/
 
1103 static void smc91c92_release(struct pcmcia_device *link)
 
1105         DEBUG(0, "smc91c92_release(0x%p)\n", link);
 
1107                 struct net_device *dev = link->priv;
 
1108                 struct smc_private *smc = netdev_priv(dev);
 
1111         pcmcia_disable_device(link);
 
1114 /*======================================================================
 
1116     MII interface support for SMC91cXX based cards
 
1117 ======================================================================*/
 
1119 #define MDIO_SHIFT_CLK          0x04
 
1120 #define MDIO_DATA_OUT           0x01
 
1121 #define MDIO_DIR_WRITE          0x08
 
1122 #define MDIO_DATA_WRITE0        (MDIO_DIR_WRITE)
 
1123 #define MDIO_DATA_WRITE1        (MDIO_DIR_WRITE | MDIO_DATA_OUT)
 
1124 #define MDIO_DATA_READ          0x02
 
1126 static void mdio_sync(unsigned int addr)
 
1129     for (bits = 0; bits < 32; bits++) {
 
1130         outb(MDIO_DATA_WRITE1, addr);
 
1131         outb(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
 
1135 static int mdio_read(struct net_device *dev, int phy_id, int loc)
 
1137     unsigned int addr = dev->base_addr + MGMT;
 
1138     u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
 
1142     for (i = 13; i >= 0; i--) {
 
1143         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
 
1145         outb(dat | MDIO_SHIFT_CLK, addr);
 
1147     for (i = 19; i > 0; i--) {
 
1149         retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
 
1150         outb(MDIO_SHIFT_CLK, addr);
 
1152     return (retval>>1) & 0xffff;
 
1155 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
 
1157     unsigned int addr = dev->base_addr + MGMT;
 
1158     u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
 
1162     for (i = 31; i >= 0; i--) {
 
1163         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
 
1165         outb(dat | MDIO_SHIFT_CLK, addr);
 
1167     for (i = 1; i >= 0; i--) {
 
1169         outb(MDIO_SHIFT_CLK, addr);
 
1173 /*======================================================================
 
1175     The driver core code, most of which should be common with a
 
1176     non-PCMCIA implementation.
 
1178 ======================================================================*/
 
1181 static void smc_dump(struct net_device *dev)
 
1183     unsigned int ioaddr = dev->base_addr;
 
1185     save = inw(ioaddr + BANK_SELECT);
 
1186     for (w = 0; w < 4; w++) {
 
1188         printk(KERN_DEBUG "bank %d: ", w);
 
1189         for (i = 0; i < 14; i += 2)
 
1190             printk(" %04x", inw(ioaddr + i));
 
1193     outw(save, ioaddr + BANK_SELECT);
 
1197 static int smc_open(struct net_device *dev)
 
1199     struct smc_private *smc = netdev_priv(dev);
 
1200     struct pcmcia_device *link = smc->p_dev;
 
1203     DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n",
 
1204           dev->name, dev, inw(dev->base_addr + BANK_SELECT));
 
1205     if (pc_debug > 1) smc_dump(dev);
 
1208     /* Check that the PCMCIA card is still here. */
 
1209     if (!pcmcia_dev_present(link))
 
1211     /* Physical device present signature. */
 
1212     if (check_sig(link) < 0) {
 
1213         printk("smc91c92_cs: Yikes!  Bad chip signature!\n");
 
1218     netif_start_queue(dev);
 
1219     smc->saved_skb = NULL;
 
1220     smc->packets_waiting = 0;
 
1223     init_timer(&smc->media);
 
1224     smc->media.function = &media_check;
 
1225     smc->media.data = (u_long) dev;
 
1226     smc->media.expires = jiffies + HZ;
 
1227     add_timer(&smc->media);
 
1232 /*====================================================================*/
 
1234 static int smc_close(struct net_device *dev)
 
1236     struct smc_private *smc = netdev_priv(dev);
 
1237     struct pcmcia_device *link = smc->p_dev;
 
1238     unsigned int ioaddr = dev->base_addr;
 
1240     DEBUG(0, "%s: smc_close(), status %4.4x.\n",
 
1241           dev->name, inw(ioaddr + BANK_SELECT));
 
1243     netif_stop_queue(dev);
 
1245     /* Shut off all interrupts, and turn off the Tx and Rx sections.
 
1246        Don't bother to check for chip present. */
 
1247     SMC_SELECT_BANK(2); /* Nominally paranoia, but do no assume... */
 
1248     outw(0, ioaddr + INTERRUPT);
 
1250     mask_bits(0xff00, ioaddr + RCR);
 
1251     mask_bits(0xff00, ioaddr + TCR);
 
1253     /* Put the chip into power-down mode. */
 
1255     outw(CTL_POWERDOWN, ioaddr + CONTROL );
 
1258     del_timer_sync(&smc->media);
 
1263 /*======================================================================
 
1265    Transfer a packet to the hardware and trigger the packet send.
 
1266    This may be called at either from either the Tx queue code
 
1267    or the interrupt handler.
 
1269 ======================================================================*/
 
1271 static void smc_hardware_send_packet(struct net_device * dev)
 
1273     struct smc_private *smc = netdev_priv(dev);
 
1274     struct sk_buff *skb = smc->saved_skb;
 
1275     unsigned int ioaddr = dev->base_addr;
 
1279         printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
 
1283     /* There should be a packet slot waiting. */
 
1284     packet_no = inw(ioaddr + PNR_ARR) >> 8;
 
1285     if (packet_no & 0x80) {
 
1286         /* If not, there is a hardware problem!  Likely an ejected card. */
 
1287         printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
 
1288                " failed, status %#2.2x.\n", dev->name, packet_no);
 
1289         dev_kfree_skb_irq(skb);
 
1290         smc->saved_skb = NULL;
 
1291         netif_start_queue(dev);
 
1295     smc->stats.tx_bytes += skb->len;
 
1296     /* The card should use the just-allocated buffer. */
 
1297     outw(packet_no, ioaddr + PNR_ARR);
 
1298     /* point to the beginning of the packet */
 
1299     outw(PTR_AUTOINC , ioaddr + POINTER);
 
1301     /* Send the packet length (+6 for status, length and ctl byte)
 
1302        and the status word (set to zeros). */
 
1304         u_char *buf = skb->data;
 
1305         u_int length = skb->len; /* The chip will pad to ethernet min. */
 
1307         DEBUG(2, "%s: Trying to xmit packet of length %d.\n",
 
1310         /* send the packet length: +6 for status word, length, and ctl */
 
1311         outw(0, ioaddr + DATA_1);
 
1312         outw(length + 6, ioaddr + DATA_1);
 
1313         outsw(ioaddr + DATA_1, buf, length >> 1);
 
1315         /* The odd last byte, if there is one, goes in the control word. */
 
1316         outw((length & 1) ? 0x2000 | buf[length-1] : 0, ioaddr + DATA_1);
 
1319     /* Enable the Tx interrupts, both Tx (TxErr) and TxEmpty. */
 
1320     outw(((IM_TX_INT|IM_TX_EMPTY_INT)<<8) |
 
1321          (inw(ioaddr + INTERRUPT) & 0xff00),
 
1322          ioaddr + INTERRUPT);
 
1324     /* The chip does the rest of the work. */
 
1325     outw(MC_ENQUEUE , ioaddr + MMU_CMD);
 
1327     smc->saved_skb = NULL;
 
1328     dev_kfree_skb_irq(skb);
 
1329     dev->trans_start = jiffies;
 
1330     netif_start_queue(dev);
 
1334 /*====================================================================*/
 
1336 static void smc_tx_timeout(struct net_device *dev)
 
1338     struct smc_private *smc = netdev_priv(dev);
 
1339     unsigned int ioaddr = dev->base_addr;
 
1341     printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
 
1342            "Tx_status %2.2x status %4.4x.\n",
 
1343            dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
 
1344     smc->stats.tx_errors++;
 
1346     dev->trans_start = jiffies;
 
1347     smc->saved_skb = NULL;
 
1348     netif_wake_queue(dev);
 
1351 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
1353     struct smc_private *smc = netdev_priv(dev);
 
1354     unsigned int ioaddr = dev->base_addr;
 
1357     unsigned long flags;
 
1359     netif_stop_queue(dev);
 
1361     DEBUG(2, "%s: smc_start_xmit(length = %d) called,"
 
1362           " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
 
1364     if (smc->saved_skb) {
 
1365         /* THIS SHOULD NEVER HAPPEN. */
 
1366         smc->stats.tx_aborted_errors++;
 
1367         printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
 
1371     smc->saved_skb = skb;
 
1373     num_pages = skb->len >> 8;
 
1375     if (num_pages > 7) {
 
1376         printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
 
1377         dev_kfree_skb (skb);
 
1378         smc->saved_skb = NULL;
 
1379         smc->stats.tx_dropped++;
 
1380         return 0;               /* Do not re-queue this packet. */
 
1382     /* A packet is now waiting. */
 
1383     smc->packets_waiting++;
 
1385     spin_lock_irqsave(&smc->lock, flags);
 
1386     SMC_SELECT_BANK(2); /* Paranoia, we should always be in window 2 */
 
1388     /* need MC_RESET to keep the memory consistent. errata? */
 
1390         outw(MC_RESET, ioaddr + MMU_CMD);
 
1394     /* Allocate the memory; send the packet now if we win. */
 
1395     outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);
 
1396     for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {
 
1397         ir = inw(ioaddr+INTERRUPT);
 
1398         if (ir & IM_ALLOC_INT) {
 
1399             /* Acknowledge the interrupt, send the packet. */
 
1400             outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);
 
1401             smc_hardware_send_packet(dev);      /* Send the packet now.. */
 
1402             spin_unlock_irqrestore(&smc->lock, flags);
 
1407     /* Otherwise defer until the Tx-space-allocated interrupt. */
 
1408     DEBUG(2, "%s: memory allocation deferred.\n", dev->name);
 
1409     outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);
 
1410     spin_unlock_irqrestore(&smc->lock, flags);
 
1415 /*======================================================================
 
1417     Handle a Tx anomolous event.  Entered while in Window 2.
 
1419 ======================================================================*/
 
1421 static void smc_tx_err(struct net_device * dev)
 
1423     struct smc_private *smc = netdev_priv(dev);
 
1424     unsigned int ioaddr = dev->base_addr;
 
1425     int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;
 
1426     int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;
 
1429     /* select this as the packet to read from */
 
1430     outw(packet_no, ioaddr + PNR_ARR);
 
1432     /* read the first word from this packet */
 
1433     outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);
 
1435     tx_status = inw(ioaddr + DATA_1);
 
1437     smc->stats.tx_errors++;
 
1438     if (tx_status & TS_LOSTCAR) smc->stats.tx_carrier_errors++;
 
1439     if (tx_status & TS_LATCOL)  smc->stats.tx_window_errors++;
 
1440     if (tx_status & TS_16COL) {
 
1441         smc->stats.tx_aborted_errors++;
 
1445     if (tx_status & TS_SUCCESS) {
 
1446         printk(KERN_NOTICE "%s: Successful packet caused error "
 
1447                "interrupt?\n", dev->name);
 
1449     /* re-enable transmit */
 
1451     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
 
1454     outw(MC_FREEPKT, ioaddr + MMU_CMD);         /* Free the packet memory. */
 
1456     /* one less packet waiting for me */
 
1457     smc->packets_waiting--;
 
1459     outw(saved_packet, ioaddr + PNR_ARR);
 
1463 /*====================================================================*/
 
1465 static void smc_eph_irq(struct net_device *dev)
 
1467     struct smc_private *smc = netdev_priv(dev);
 
1468     unsigned int ioaddr = dev->base_addr;
 
1469     u_short card_stats, ephs;
 
1472     ephs = inw(ioaddr + EPH);
 
1473     DEBUG(2, "%s: Ethernet protocol handler interrupt, status"
 
1474           " %4.4x.\n", dev->name, ephs);
 
1475     /* Could be a counter roll-over warning: update stats. */
 
1476     card_stats = inw(ioaddr + COUNTER);
 
1477     /* single collisions */
 
1478     smc->stats.collisions += card_stats & 0xF;
 
1480     /* multiple collisions */
 
1481     smc->stats.collisions += card_stats & 0xF;
 
1482 #if 0           /* These are for when linux supports these statistics */
 
1483     card_stats >>= 4;                   /* deferred */
 
1484     card_stats >>= 4;                   /* excess deferred */
 
1486     /* If we had a transmit error we must re-enable the transmitter. */
 
1487     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
 
1489     /* Clear a link error interrupt. */
 
1491     outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);
 
1492     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
 
1497 /*====================================================================*/
 
1499 static irqreturn_t smc_interrupt(int irq, void *dev_id)
 
1501     struct net_device *dev = dev_id;
 
1502     struct smc_private *smc = netdev_priv(dev);
 
1503     unsigned int ioaddr;
 
1504     u_short saved_bank, saved_pointer, mask, status;
 
1505     unsigned int handled = 1;
 
1506     char bogus_cnt = INTR_WORK;         /* Work we are willing to do. */
 
1508     if (!netif_device_present(dev))
 
1511     ioaddr = dev->base_addr;
 
1513     DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
 
1516     spin_lock(&smc->lock);
 
1518     saved_bank = inw(ioaddr + BANK_SELECT);
 
1519     if ((saved_bank & 0xff00) != 0x3300) {
 
1520         /* The device does not exist -- the card could be off-line, or
 
1521            maybe it has been ejected. */
 
1522         DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
 
1523               "/ejected device.\n", dev->name, irq);
 
1529     saved_pointer = inw(ioaddr + POINTER);
 
1530     mask = inw(ioaddr + INTERRUPT) >> 8;
 
1531     /* clear all interrupts */
 
1532     outw(0, ioaddr + INTERRUPT);
 
1534     do { /* read the status flag, and mask it */
 
1535         status = inw(ioaddr + INTERRUPT) & 0xff;
 
1536         DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
 
1538         if ((status & mask) == 0) {
 
1539             if (bogus_cnt == INTR_WORK)
 
1543         if (status & IM_RCV_INT) {
 
1544             /* Got a packet(s). */
 
1547         if (status & IM_TX_INT) {
 
1549             outw(IM_TX_INT, ioaddr + INTERRUPT);
 
1552         if (status & IM_TX_EMPTY_INT) {
 
1553             outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);
 
1554             mask &= ~IM_TX_EMPTY_INT;
 
1555             smc->stats.tx_packets += smc->packets_waiting;
 
1556             smc->packets_waiting = 0;
 
1558         if (status & IM_ALLOC_INT) {
 
1559             /* Clear this interrupt so it doesn't happen again */
 
1560             mask &= ~IM_ALLOC_INT;
 
1562             smc_hardware_send_packet(dev);
 
1564             /* enable xmit interrupts based on this */
 
1565             mask |= (IM_TX_EMPTY_INT | IM_TX_INT);
 
1567             /* and let the card send more packets to me */
 
1568             netif_wake_queue(dev);
 
1570         if (status & IM_RX_OVRN_INT) {
 
1571             smc->stats.rx_errors++;
 
1572             smc->stats.rx_fifo_errors++;
 
1574                 smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */
 
1575             outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);
 
1577         if (status & IM_EPH_INT)
 
1579     } while (--bogus_cnt);
 
1581     DEBUG(3, "  Restoring saved registers mask %2.2x bank %4.4x"
 
1582           " pointer %4.4x.\n", mask, saved_bank, saved_pointer);
 
1584     /* restore state register */
 
1585     outw((mask<<8), ioaddr + INTERRUPT);
 
1586     outw(saved_pointer, ioaddr + POINTER);
 
1587     SMC_SELECT_BANK(saved_bank);
 
1589     DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);
 
1593     if ((smc->manfid == MANFID_OSITECH) &&
 
1594         (smc->cardid != PRODID_OSITECH_SEVEN)) {
 
1595         /* Retrigger interrupt if needed */
 
1596         mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);
 
1597         set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);
 
1599     if (smc->manfid == MANFID_MOTOROLA) {
 
1601         cor = readb(smc->base + MOT_UART + CISREG_COR);
 
1602         writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);
 
1603         writeb(cor, smc->base + MOT_UART + CISREG_COR);
 
1604         cor = readb(smc->base + MOT_LAN + CISREG_COR);
 
1605         writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);
 
1606         writeb(cor, smc->base + MOT_LAN + CISREG_COR);
 
1608 #ifdef DOES_NOT_WORK
 
1609     if (smc->base != NULL) { /* Megahertz MFC's */
 
1610         readb(smc->base+MEGAHERTZ_ISR);
 
1611         readb(smc->base+MEGAHERTZ_ISR);
 
1614     spin_unlock(&smc->lock);
 
1615     return IRQ_RETVAL(handled);
 
1618 /*====================================================================*/
 
1620 static void smc_rx(struct net_device *dev)
 
1622     struct smc_private *smc = netdev_priv(dev);
 
1623     unsigned int ioaddr = dev->base_addr;
 
1625     int packet_length;  /* Caution: not frame length, rather words
 
1626                            to transfer from the chip. */
 
1628     /* Assertion: we are in Window 2. */
 
1630     if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
 
1631         printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
 
1636     /*  Reset the read pointer, and read the status and packet length. */
 
1637     outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);
 
1638     rx_status = inw(ioaddr + DATA_1);
 
1639     packet_length = inw(ioaddr + DATA_1) & 0x07ff;
 
1641     DEBUG(2, "%s: Receive status %4.4x length %d.\n",
 
1642           dev->name, rx_status, packet_length);
 
1644     if (!(rx_status & RS_ERRORS)) {             
 
1645         /* do stuff to make a new packet */
 
1646         struct sk_buff *skb;
 
1648         /* Note: packet_length adds 5 or 6 extra bytes here! */
 
1649         skb = dev_alloc_skb(packet_length+2);
 
1652             DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);
 
1653             smc->stats.rx_dropped++;
 
1654             outw(MC_RELEASE, ioaddr + MMU_CMD);
 
1658         packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);
 
1659         skb_reserve(skb, 2);
 
1660         insw(ioaddr+DATA_1, skb_put(skb, packet_length),
 
1661              (packet_length+1)>>1);
 
1662         skb->protocol = eth_type_trans(skb, dev);
 
1665         dev->last_rx = jiffies;
 
1666         smc->stats.rx_packets++;
 
1667         smc->stats.rx_bytes += packet_length;
 
1668         if (rx_status & RS_MULTICAST)
 
1669             smc->stats.multicast++;
 
1672         smc->stats.rx_errors++;
 
1674         if (rx_status & RS_ALGNERR)  smc->stats.rx_frame_errors++;
 
1675         if (rx_status & (RS_TOOSHORT | RS_TOOLONG))
 
1676             smc->stats.rx_length_errors++;
 
1677         if (rx_status & RS_BADCRC)      smc->stats.rx_crc_errors++;
 
1679     /* Let the MMU free the memory of this packet. */
 
1680     outw(MC_RELEASE, ioaddr + MMU_CMD);
 
1685 /*====================================================================*/
 
1687 static struct net_device_stats *smc_get_stats(struct net_device *dev)
 
1689     struct smc_private *smc = netdev_priv(dev);
 
1690     /* Nothing to update - the 91c92 is a pretty primative chip. */
 
1694 /*======================================================================
 
1696     Calculate values for the hardware multicast filter hash table.
 
1698 ======================================================================*/
 
1700 static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
 
1701                                u_char *multicast_table)
 
1703     struct dev_mc_list  *mc_addr;
 
1705     for (mc_addr = addrs;  mc_addr && count-- > 0;  mc_addr = mc_addr->next) {
 
1706         u_int position = ether_crc(6, mc_addr->dmi_addr);
 
1707 #ifndef final_version           /* Verify multicast address. */
 
1708         if ((mc_addr->dmi_addr[0] & 1) == 0)
 
1711         multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
 
1715 /*======================================================================
 
1717     Set the receive mode.
 
1719     This routine is used by both the protocol level to notify us of
 
1720     promiscuous/multicast mode changes, and by the open/reset code to
 
1721     initialize the Rx registers.  We always set the multicast list and
 
1722     leave the receiver running.
 
1724 ======================================================================*/
 
1726 static void set_rx_mode(struct net_device *dev)
 
1728     unsigned int ioaddr = dev->base_addr;
 
1729     struct smc_private *smc = netdev_priv(dev);
 
1730     u_int multicast_table[ 2 ] = { 0, };
 
1731     unsigned long flags;
 
1732     u_short rx_cfg_setting;
 
1734     if (dev->flags & IFF_PROMISC) {
 
1735         rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;
 
1736     } else if (dev->flags & IFF_ALLMULTI)
 
1737         rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
 
1739         if (dev->mc_count)  {
 
1740             fill_multicast_tbl(dev->mc_count, dev->mc_list,
 
1741                                (u_char *)multicast_table);
 
1743         rx_cfg_setting = RxStripCRC | RxEnable;
 
1746     /* Load MC table and Rx setting into the chip without interrupts. */
 
1747     spin_lock_irqsave(&smc->lock, flags);
 
1749     outl(multicast_table[0], ioaddr + MULTICAST0);
 
1750     outl(multicast_table[1], ioaddr + MULTICAST4);
 
1752     outw(rx_cfg_setting, ioaddr + RCR);
 
1754     spin_unlock_irqrestore(&smc->lock, flags);
 
1759 /*======================================================================
 
1761     Senses when a card's config changes. Here, it's coax or TP.
 
1763 ======================================================================*/
 
1765 static int s9k_config(struct net_device *dev, struct ifmap *map)
 
1767     struct smc_private *smc = netdev_priv(dev);
 
1768     if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
 
1769         if (smc->cfg & CFG_MII_SELECT)
 
1771         else if (map->port > 2)
 
1773         dev->if_port = map->port;
 
1774         printk(KERN_INFO "%s: switched to %s port\n",
 
1775                dev->name, if_names[dev->if_port]);
 
1781 /*======================================================================
 
1783     Reset the chip, reloading every register that might be corrupted.
 
1785 ======================================================================*/
 
1788   Set transceiver type, perhaps to something other than what the user
 
1789   specified in dev->if_port.
 
1791 static void smc_set_xcvr(struct net_device *dev, int if_port)
 
1793     struct smc_private *smc = netdev_priv(dev);
 
1794     unsigned int ioaddr = dev->base_addr;
 
1797     saved_bank = inw(ioaddr + BANK_SELECT);
 
1800         outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG);
 
1801         if ((smc->manfid == MANFID_OSITECH) &&
 
1802             (smc->cardid != PRODID_OSITECH_SEVEN))
 
1803             set_bits(OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
 
1804         smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002);
 
1806         outw(smc->cfg, ioaddr + CONFIG);
 
1807         if ((smc->manfid == MANFID_OSITECH) &&
 
1808             (smc->cardid != PRODID_OSITECH_SEVEN))
 
1809             mask_bits(~OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
 
1810         smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001);
 
1812     SMC_SELECT_BANK(saved_bank);
 
1815 static void smc_reset(struct net_device *dev)
 
1817     unsigned int ioaddr = dev->base_addr;
 
1818     struct smc_private *smc = netdev_priv(dev);
 
1821     DEBUG(0, "%s: smc91c92 reset called.\n", dev->name);
 
1823     /* The first interaction must be a write to bring the chip out
 
1826     /* Reset the chip. */
 
1827     outw(RCR_SOFTRESET, ioaddr + RCR);
 
1830     /* Clear the transmit and receive configuration registers. */
 
1831     outw(RCR_CLEAR, ioaddr + RCR);
 
1832     outw(TCR_CLEAR, ioaddr + TCR);
 
1834     /* Set the Window 1 control, configuration and station addr registers.
 
1835        No point in writing the I/O base register ;-> */
 
1837     /* Automatically release successfully transmitted packets,
 
1838        Accept link errors, counter and Tx error interrupts. */
 
1839     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
 
1841     smc_set_xcvr(dev, dev->if_port);
 
1842     if ((smc->manfid == MANFID_OSITECH) &&
 
1843         (smc->cardid != PRODID_OSITECH_SEVEN))
 
1844         outw((dev->if_port == 2 ? OSI_AUI_PWR : 0) |
 
1845              (inw(ioaddr-0x10+OSITECH_AUI_PWR) & 0xff00),
 
1846              ioaddr - 0x10 + OSITECH_AUI_PWR);
 
1848     /* Fill in the physical address.  The databook is wrong about the order! */
 
1849     for (i = 0; i < 6; i += 2)
 
1850         outw((dev->dev_addr[i+1]<<8)+dev->dev_addr[i],
 
1851              ioaddr + ADDR0 + i);
 
1855     outw(MC_RESET, ioaddr + MMU_CMD);
 
1856     outw(0, ioaddr + INTERRUPT);
 
1858     /* Re-enable the chip. */
 
1860     outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) |
 
1861          TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR);
 
1864     if (smc->cfg & CFG_MII_SELECT) {
 
1868         mdio_write(dev, smc->mii_if.phy_id, 0, 0x8000);
 
1870         /* Advertise 100F, 100H, 10F, 10H */
 
1871         mdio_write(dev, smc->mii_if.phy_id, 4, 0x01e1);
 
1873         /* Restart MII autonegotiation */
 
1874         mdio_write(dev, smc->mii_if.phy_id, 0, 0x0000);
 
1875         mdio_write(dev, smc->mii_if.phy_id, 0, 0x1200);
 
1878     /* Enable interrupts. */
 
1880     outw((IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT) << 8,
 
1881          ioaddr + INTERRUPT);
 
1884 /*======================================================================
 
1886     Media selection timer routine
 
1888 ======================================================================*/
 
1890 static void media_check(u_long arg)
 
1892     struct net_device *dev = (struct net_device *) arg;
 
1893     struct smc_private *smc = netdev_priv(dev);
 
1894     unsigned int ioaddr = dev->base_addr;
 
1895     u_short i, media, saved_bank;
 
1897     unsigned long flags;
 
1899     spin_lock_irqsave(&smc->lock, flags);
 
1901     saved_bank = inw(ioaddr + BANK_SELECT);
 
1903     if (!netif_device_present(dev))
 
1908     /* need MC_RESET to keep the memory consistent. errata? */
 
1910         outw(MC_RESET, ioaddr + MMU_CMD);
 
1913     i = inw(ioaddr + INTERRUPT);
 
1915     media = inw(ioaddr + EPH) & EPH_LINK_OK;
 
1917     media |= (inw(ioaddr + CONFIG) & CFG_AUI_SELECT) ? 2 : 1;
 
1919     /* Check for pending interrupt with watchdog flag set: with
 
1920        this, we can limp along even if the interrupt is blocked */
 
1921     if (smc->watchdog++ && ((i>>8) & i)) {
 
1922         if (!smc->fast_poll)
 
1923             printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
 
1924         smc_interrupt(dev->irq, dev);
 
1925         smc->fast_poll = HZ;
 
1927     if (smc->fast_poll) {
 
1929         smc->media.expires = jiffies + HZ/100;
 
1930         add_timer(&smc->media);
 
1931         SMC_SELECT_BANK(saved_bank);
 
1932         spin_unlock_irqrestore(&smc->lock, flags);
 
1936     if (smc->cfg & CFG_MII_SELECT) {
 
1937         if (smc->mii_if.phy_id < 0)
 
1941         link = mdio_read(dev, smc->mii_if.phy_id, 1);
 
1942         if (!link || (link == 0xffff)) {
 
1943             printk(KERN_INFO "%s: MII is missing!\n", dev->name);
 
1944             smc->mii_if.phy_id = -1;
 
1949         if (link != smc->link_status) {
 
1950             u_short p = mdio_read(dev, smc->mii_if.phy_id, 5);
 
1951             printk(KERN_INFO "%s: %s link beat\n", dev->name,
 
1952                 (link) ? "found" : "lost");
 
1953             smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
 
1956                 printk(KERN_INFO "%s: autonegotiation complete: "
 
1957                        "%sbaseT-%cD selected\n", dev->name,
 
1958                        ((p & 0x0180) ? "100" : "10"),
 
1959                        (smc->duplex ? 'F' : 'H'));
 
1962             outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
 
1963             smc->link_status = link;
 
1968     /* Ignore collisions unless we've had no rx's recently */
 
1969     if (time_after(jiffies, dev->last_rx + HZ)) {
 
1970         if (smc->tx_err || (smc->media_status & EPH_16COL))
 
1975     if (media != smc->media_status) {
 
1976         if ((media & smc->media_status & 1) &&
 
1977             ((smc->media_status ^ media) & EPH_LINK_OK))
 
1978             printk(KERN_INFO "%s: %s link beat\n", dev->name,
 
1979                    (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
 
1980         else if ((media & smc->media_status & 2) &&
 
1981                  ((smc->media_status ^ media) & EPH_16COL))
 
1982             printk(KERN_INFO "%s: coax cable %s\n", dev->name,
 
1983                    (media & EPH_16COL ? "problem" : "ok"));
 
1984         if (dev->if_port == 0) {
 
1986                 if (media & EPH_LINK_OK)
 
1987                     printk(KERN_INFO "%s: flipped to 10baseT\n",
 
1990                     smc_set_xcvr(dev, 2);
 
1992                 if (media & EPH_16COL)
 
1993                     smc_set_xcvr(dev, 1);
 
1995                     printk(KERN_INFO "%s: flipped to 10base2\n",
 
1999         smc->media_status = media;
 
2003     smc->media.expires = jiffies + HZ;
 
2004     add_timer(&smc->media);
 
2005     SMC_SELECT_BANK(saved_bank);
 
2006     spin_unlock_irqrestore(&smc->lock, flags);
 
2009 static int smc_link_ok(struct net_device *dev)
 
2011     unsigned int ioaddr = dev->base_addr;
 
2012     struct smc_private *smc = netdev_priv(dev);
 
2014     if (smc->cfg & CFG_MII_SELECT) {
 
2015         return mii_link_ok(&smc->mii_if);
 
2018         return inw(ioaddr + EPH) & EPH_LINK_OK;
 
2022 static int smc_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
 
2025     unsigned int ioaddr = dev->base_addr;
 
2027     ecmd->supported = (SUPPORTED_TP | SUPPORTED_AUI |
 
2028         SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
 
2031     tmp = inw(ioaddr + CONFIG);
 
2032     ecmd->port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
 
2033     ecmd->transceiver = XCVR_INTERNAL;
 
2034     ecmd->speed = SPEED_10;
 
2035     ecmd->phy_address = ioaddr + MGMT;
 
2038     tmp = inw(ioaddr + TCR);
 
2039     ecmd->duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
 
2044 static int smc_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
 
2047     unsigned int ioaddr = dev->base_addr;
 
2049     if (ecmd->speed != SPEED_10)
 
2051     if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
 
2053     if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI)
 
2055     if (ecmd->transceiver != XCVR_INTERNAL)
 
2058     if (ecmd->port == PORT_AUI)
 
2059         smc_set_xcvr(dev, 1);
 
2061         smc_set_xcvr(dev, 0);
 
2064     tmp = inw(ioaddr + TCR);
 
2065     if (ecmd->duplex == DUPLEX_FULL)
 
2069     outw(tmp, ioaddr + TCR);
 
2074 static int check_if_running(struct net_device *dev)
 
2076         if (!netif_running(dev))
 
2081 static void smc_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 
2083         strcpy(info->driver, DRV_NAME);
 
2084         strcpy(info->version, DRV_VERSION);
 
2087 static int smc_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
2089         struct smc_private *smc = netdev_priv(dev);
 
2090         unsigned int ioaddr = dev->base_addr;
 
2091         u16 saved_bank = inw(ioaddr + BANK_SELECT);
 
2094         spin_lock_irq(&smc->lock);
 
2096         if (smc->cfg & CFG_MII_SELECT)
 
2097                 ret = mii_ethtool_gset(&smc->mii_if, ecmd);
 
2099                 ret = smc_netdev_get_ecmd(dev, ecmd);
 
2100         SMC_SELECT_BANK(saved_bank);
 
2101         spin_unlock_irq(&smc->lock);
 
2105 static int smc_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
2107         struct smc_private *smc = netdev_priv(dev);
 
2108         unsigned int ioaddr = dev->base_addr;
 
2109         u16 saved_bank = inw(ioaddr + BANK_SELECT);
 
2112         spin_lock_irq(&smc->lock);
 
2114         if (smc->cfg & CFG_MII_SELECT)
 
2115                 ret = mii_ethtool_sset(&smc->mii_if, ecmd);
 
2117                 ret = smc_netdev_set_ecmd(dev, ecmd);
 
2118         SMC_SELECT_BANK(saved_bank);
 
2119         spin_unlock_irq(&smc->lock);
 
2123 static u32 smc_get_link(struct net_device *dev)
 
2125         struct smc_private *smc = netdev_priv(dev);
 
2126         unsigned int ioaddr = dev->base_addr;
 
2127         u16 saved_bank = inw(ioaddr + BANK_SELECT);
 
2130         spin_lock_irq(&smc->lock);
 
2132         ret = smc_link_ok(dev);
 
2133         SMC_SELECT_BANK(saved_bank);
 
2134         spin_unlock_irq(&smc->lock);
 
2139 static u32 smc_get_msglevel(struct net_device *dev)
 
2144 static void smc_set_msglevel(struct net_device *dev, u32 val)
 
2150 static int smc_nway_reset(struct net_device *dev)
 
2152         struct smc_private *smc = netdev_priv(dev);
 
2153         if (smc->cfg & CFG_MII_SELECT) {
 
2154                 unsigned int ioaddr = dev->base_addr;
 
2155                 u16 saved_bank = inw(ioaddr + BANK_SELECT);
 
2159                 res = mii_nway_restart(&smc->mii_if);
 
2160                 SMC_SELECT_BANK(saved_bank);
 
2167 static const struct ethtool_ops ethtool_ops = {
 
2168         .begin = check_if_running,
 
2169         .get_drvinfo = smc_get_drvinfo,
 
2170         .get_settings = smc_get_settings,
 
2171         .set_settings = smc_set_settings,
 
2172         .get_link = smc_get_link,
 
2174         .get_msglevel = smc_get_msglevel,
 
2175         .set_msglevel = smc_set_msglevel,
 
2177         .nway_reset = smc_nway_reset,
 
2180 static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
 
2182         struct smc_private *smc = netdev_priv(dev);
 
2183         struct mii_ioctl_data *mii = if_mii(rq);
 
2186         unsigned int ioaddr = dev->base_addr;
 
2188         if (!netif_running(dev))
 
2191         spin_lock_irq(&smc->lock);
 
2192         saved_bank = inw(ioaddr + BANK_SELECT);
 
2194         rc = generic_mii_ioctl(&smc->mii_if, mii, cmd, NULL);
 
2195         SMC_SELECT_BANK(saved_bank);
 
2196         spin_unlock_irq(&smc->lock);
 
2200 static struct pcmcia_device_id smc91c92_ids[] = {
 
2201         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501),
 
2202         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a),
 
2203         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
 
2204         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
 
2205         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
 
2206         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
 
2207         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
 
2208         PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
 
2209         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
 
2210         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
 
2211         PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
 
2212         PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
 
2213         PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
 
2214         PCMCIA_DEVICE_PROD_ID12("ARGOSY", "Fast Ethernet PCCard", 0x78f308dc, 0xdcea68bc),
 
2215         PCMCIA_DEVICE_PROD_ID12("dit Co., Ltd.", "PC Card-10/100BTX", 0xe59365c8, 0x6a2161d1),
 
2216         PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L100C", 0x6a26d1cf, 0xc16ce9c5),
 
2217         PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
 
2218         PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
 
2219         PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
 
2220         PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Four of Diamonds Ethernet", 0xc2f80cd, 0xb3466314),
 
2221         PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
 
2222         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
 
2223         PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
 
2224         PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
 
2225         /* These conflict with other cards! */
 
2226         /* PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0100), */
 
2227         /* PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), */
 
2230 MODULE_DEVICE_TABLE(pcmcia, smc91c92_ids);
 
2232 static struct pcmcia_driver smc91c92_cs_driver = {
 
2233         .owner          = THIS_MODULE,
 
2235                 .name   = "smc91c92_cs",
 
2237         .probe          = smc91c92_probe,
 
2238         .remove         = smc91c92_detach,
 
2239         .id_table       = smc91c92_ids,
 
2240         .suspend        = smc91c92_suspend,
 
2241         .resume         = smc91c92_resume,
 
2244 static int __init init_smc91c92_cs(void)
 
2246         return pcmcia_register_driver(&smc91c92_cs_driver);
 
2249 static void __exit exit_smc91c92_cs(void)
 
2251         pcmcia_unregister_driver(&smc91c92_cs_driver);
 
2254 module_init(init_smc91c92_cs);
 
2255 module_exit(exit_smc91c92_cs);