Annotation of Gnu-Mach/linux/pcmcia-cs/clients/smc91c92_cs.c, revision 1.1.1.1

1.1       root        1: /*======================================================================
                      2: 
                      3:     A PCMCIA ethernet driver for SMC91c92-based cards.
                      4: 
                      5:     This driver supports Megahertz PCMCIA ethernet cards; and
                      6:     Megahertz, Motorola, Ositech, and Psion Dacom ethernet/modem
                      7:     multifunction cards.
                      8: 
                      9:     Copyright (C) 1999 David A. Hinds -- [email protected]
                     10: 
                     11:     smc91c92_cs.c 1.123 2003/08/25 15:57:41
                     12: 
                     13:     This driver contains code written by Donald Becker
                     14:     ([email protected]), Rowan Hughes ([email protected]),
                     15:     David Hinds ([email protected]), and Erik Stahlman
                     16:     ([email protected]).  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 ([email protected]) added support for the Motorola
                     21:     Mariner, with help from Allen Brost.
                     22: 
                     23:     This software may be used and distributed according to the terms of
                     24:     the GNU General Public License, incorporated herein by reference.
                     25: 
                     26: ======================================================================*/
                     27: 
                     28: #include <linux/module.h>
                     29: #include <linux/kernel.h>
                     30: #include <linux/init.h>
                     31: #include <linux/sched.h>
                     32: #include <linux/slab.h>
                     33: #include <linux/string.h>
                     34: #include <linux/timer.h>
                     35: #include <linux/interrupt.h>
                     36: #include <linux/delay.h>
                     37: #include <linux/crc32.h>
                     38: #include <asm/io.h>
                     39: #include <asm/system.h>
                     40: #include <asm/uaccess.h>
                     41: 
                     42: #include <linux/netdevice.h>
                     43: #include <linux/etherdevice.h>
                     44: #include <linux/skbuff.h>
                     45: #include <linux/if_arp.h>
                     46: #include <linux/ioport.h>
                     47: 
                     48: #include <pcmcia/version.h>
                     49: #include <pcmcia/cs_types.h>
                     50: #include <pcmcia/cs.h>
                     51: #include <pcmcia/cistpl.h>
                     52: #include <pcmcia/cisreg.h>
                     53: #include <pcmcia/ciscode.h>
                     54: #include <pcmcia/ds.h>
                     55: 
                     56: /* Ositech Seven of Diamonds firmware */
                     57: #include "ositech.h"
                     58: 
                     59: /*====================================================================*/
                     60: 
                     61: static char *if_names[] = { "auto", "10baseT", "10base2"};
                     62: 
                     63: /* Module parameters */
                     64: 
                     65: MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
                     66: MODULE_LICENSE("GPL");
                     67: 
                     68: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
                     69: 
                     70: /*
                     71:   Transceiver/media type.
                     72:    0 = auto
                     73:    1 = 10baseT (and autoselect if #define AUTOSELECT),
                     74:    2 = AUI/10base2,
                     75: */
                     76: INT_MODULE_PARM(if_port, 0);
                     77: 
                     78: /* Bit map of interrupts to choose from. */
                     79: INT_MODULE_PARM(irq_mask, 0xdeb8);
                     80: static int irq_list[4] = { -1 };
                     81: MODULE_PARM(irq_list, "1-4i");
                     82: 
                     83: #ifdef PCMCIA_DEBUG
                     84: INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
                     85: static const char *version =
                     86: "smc91c92_cs.c 0.09 1996/8/4 Donald Becker, [email protected].\n";
                     87: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
                     88: #else
                     89: #define DEBUG(n, args...)
                     90: #endif
                     91: 
                     92: /*====================================================================*/
                     93: 
                     94: /* Operational parameter that usually are not changed. */
                     95: 
                     96: /* Time in jiffies before concluding Tx hung */
                     97: #define TX_TIMEOUT             ((400*HZ)/1000)
                     98: 
                     99: /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
                    100: #define INTR_WORK              4
                    101: 
                    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
                    105: 
                    106: static dev_info_t dev_info = "smc91c92_cs";
                    107: 
                    108: static dev_link_t *dev_list;
                    109: 
                    110: struct smc_private {
                    111:     dev_link_t                 link;
                    112:     struct net_device          dev;
                    113:     u_short                    manfid;
                    114:     u_short                    cardid;
                    115:     struct net_device_stats    stats;
                    116:     dev_node_t                 node;
                    117:     struct sk_buff             *saved_skb;
                    118:     int                                packets_waiting;
                    119:     caddr_t                    base;
                    120:     u_short                    cfg;
                    121:     struct timer_list          media;
                    122:     int                                watchdog, tx_err;
                    123:     u_short                    media_status;
                    124:     u_short                    fast_poll;
                    125:     u_short                    link_status;
                    126:     int                                phy_id;
                    127:     int                                duplex;
                    128:     int                                rx_ovrn;
                    129: };
                    130: 
                    131: /* Special definitions for Megahertz multifunction cards */
                    132: #define MEGAHERTZ_ISR          0x0380
                    133: 
                    134: /* Special function registers for Motorola Mariner */
                    135: #define MOT_LAN                        0x0000
                    136: #define MOT_UART               0x0020
                    137: #define MOT_EEPROM             0x20
                    138: 
                    139: #define MOT_NORMAL \
                    140: (COR_LEVEL_REQ | COR_FUNC_ENA | COR_ADDR_DECODE | COR_IREQ_ENA)
                    141: 
                    142: /* Special function registers for Ositech cards */
                    143: #define OSITECH_AUI_CTL                0x0c
                    144: #define OSITECH_PWRDOWN                0x0d
                    145: #define OSITECH_RESET          0x0e
                    146: #define OSITECH_ISR            0x0f
                    147: #define OSITECH_AUI_PWR                0x0c
                    148: #define OSITECH_RESET_ISR      0x0e
                    149: 
                    150: #define OSI_AUI_PWR            0x40
                    151: #define OSI_LAN_PWRDOWN                0x02
                    152: #define OSI_MODEM_PWRDOWN      0x01
                    153: #define OSI_LAN_RESET          0x02
                    154: #define OSI_MODEM_RESET                0x01
                    155: 
                    156: /* Symbolic constants for the SMC91c9* series chips, from Erik Stahlman. */
                    157: #define        BANK_SELECT             14              /* Window select register. */
                    158: #define SMC_SELECT_BANK(x)  { outw(x, ioaddr + BANK_SELECT); }
                    159: 
                    160: /* Bank 0 registers. */
                    161: #define        TCR             0       /* transmit control register */
                    162: #define         TCR_CLEAR      0       /* do NOTHING */
                    163: #define  TCR_ENABLE    0x0001  /* if this is 1, we can transmit */
                    164: #define         TCR_PAD_EN     0x0080  /* pads short packets to 64 bytes */
                    165: #define  TCR_MONCSN    0x0400  /* Monitor Carrier. */
                    166: #define  TCR_FDUPLX    0x0800  /* Full duplex mode. */
                    167: #define         TCR_NORMAL TCR_ENABLE | TCR_PAD_EN
                    168: 
                    169: #define EPH            2       /* Ethernet Protocol Handler report. */
                    170: #define  EPH_TX_SUC    0x0001
                    171: #define  EPH_SNGLCOL   0x0002
                    172: #define  EPH_MULCOL    0x0004
                    173: #define  EPH_LTX_MULT  0x0008
                    174: #define  EPH_16COL     0x0010
                    175: #define  EPH_SQET      0x0020
                    176: #define  EPH_LTX_BRD   0x0040
                    177: #define  EPH_TX_DEFR   0x0080
                    178: #define  EPH_LAT_COL   0x0200
                    179: #define  EPH_LOST_CAR  0x0400
                    180: #define  EPH_EXC_DEF   0x0800
                    181: #define  EPH_CTR_ROL   0x1000
                    182: #define  EPH_RX_OVRN   0x2000
                    183: #define  EPH_LINK_OK   0x4000
                    184: #define  EPH_TX_UNRN   0x8000
                    185: #define MEMINFO                8       /* Memory Information Register */
                    186: #define MEMCFG         10      /* Memory Configuration Register */
                    187: 
                    188: /* Bank 1 registers. */
                    189: #define CONFIG                 0
                    190: #define  CFG_MII_SELECT                0x8000  /* 91C100 only */
                    191: #define  CFG_NO_WAIT           0x1000
                    192: #define  CFG_FULL_STEP         0x0400
                    193: #define  CFG_SET_SQLCH         0x0200
                    194: #define  CFG_AUI_SELECT                0x0100
                    195: #define  CFG_16BIT             0x0080
                    196: #define  CFG_DIS_LINK          0x0040
                    197: #define  CFG_STATIC            0x0030
                    198: #define  CFG_IRQ_SEL_1         0x0004
                    199: #define  CFG_IRQ_SEL_0         0x0002
                    200: #define BASE_ADDR              2
                    201: #define        ADDR0                   4
                    202: #define        GENERAL                 10
                    203: #define        CONTROL                 12
                    204: #define  CTL_STORE             0x0001
                    205: #define  CTL_RELOAD            0x0002
                    206: #define  CTL_EE_SELECT         0x0004
                    207: #define  CTL_TE_ENABLE         0x0020
                    208: #define  CTL_CR_ENABLE         0x0040
                    209: #define  CTL_LE_ENABLE         0x0080
                    210: #define  CTL_AUTO_RELEASE      0x0800
                    211: #define         CTL_POWERDOWN          0x2000
                    212: 
                    213: /* Bank 2 registers. */
                    214: #define MMU_CMD                0
                    215: #define         MC_ALLOC       0x20    /* or with number of 256 byte packets */
                    216: #define         MC_RESET       0x40
                    217: #define  MC_RELEASE    0x80    /* remove and release the current rx packet */
                    218: #define  MC_FREEPKT    0xA0    /* Release packet in PNR register */
                    219: #define  MC_ENQUEUE    0xC0    /* Enqueue the packet for transmit */
                    220: #define        PNR_ARR         2
                    221: #define FIFO_PORTS     4
                    222: #define  FP_RXEMPTY    0x8000
                    223: #define        POINTER         6
                    224: #define  PTR_AUTO_INC  0x0040
                    225: #define  PTR_READ      0x2000
                    226: #define         PTR_AUTOINC    0x4000
                    227: #define         PTR_RCV        0x8000
                    228: #define        DATA_1          8
                    229: #define        INTERRUPT       12
                    230: #define  IM_RCV_INT            0x1
                    231: #define         IM_TX_INT              0x2
                    232: #define         IM_TX_EMPTY_INT        0x4
                    233: #define         IM_ALLOC_INT           0x8
                    234: #define         IM_RX_OVRN_INT         0x10
                    235: #define         IM_EPH_INT             0x20
                    236: 
                    237: #define        RCR             4
                    238: enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002,
                    239:             RxEnable = 0x0100, RxStripCRC = 0x0200};
                    240: #define  RCR_SOFTRESET 0x8000  /* resets the chip */
                    241: #define         RCR_STRIP_CRC  0x200   /* strips CRC */
                    242: #define  RCR_ENABLE    0x100   /* IFF this is set, we can receive packets */
                    243: #define  RCR_ALMUL     0x4     /* receive all multicast packets */
                    244: #define         RCR_PROMISC    0x2     /* enable promiscuous mode */
                    245: 
                    246: /* the normal settings for the RCR register : */
                    247: #define         RCR_NORMAL     (RCR_STRIP_CRC | RCR_ENABLE)
                    248: #define  RCR_CLEAR     0x0             /* set it to a base state */
                    249: #define        COUNTER         6
                    250: 
                    251: /* BANK 3 -- not the same values as in smc9194! */
                    252: #define        MULTICAST0      0
                    253: #define        MULTICAST2      2
                    254: #define        MULTICAST4      4
                    255: #define        MULTICAST6      6
                    256: #define MGMT           8
                    257: #define REVISION       0x0a
                    258: 
                    259: /* Transmit status bits. */
                    260: #define TS_SUCCESS 0x0001
                    261: #define TS_16COL   0x0010
                    262: #define TS_LATCOL  0x0200
                    263: #define TS_LOSTCAR 0x0400
                    264: 
                    265: /* Receive status bits. */
                    266: #define RS_ALGNERR     0x8000
                    267: #define RS_BADCRC      0x2000
                    268: #define RS_ODDFRAME    0x1000
                    269: #define RS_TOOLONG     0x0800
                    270: #define RS_TOOSHORT    0x0400
                    271: #define RS_MULTICAST   0x0001
                    272: #define RS_ERRORS      (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
                    273: 
                    274: #define set_bits(v, p) outw(inw(p)|(v), (p))
                    275: #define mask_bits(v, p) outw(inw(p)&(v), (p))
                    276: 
                    277: /*====================================================================*/
                    278: 
                    279: static dev_link_t *smc91c92_attach(void);
                    280: static void smc91c92_detach(dev_link_t *);
                    281: static void smc91c92_config(dev_link_t *link);
                    282: static void smc91c92_release(u_long arg);
                    283: static int smc91c92_event(event_t event, int priority,
                    284:                          event_callback_args_t *args);
                    285: 
                    286: static int smc_open(struct net_device *dev);
                    287: static int smc_close(struct net_device *dev);
                    288: static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
                    289: static void smc_tx_timeout(struct net_device *dev);
                    290: static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
                    291: static void smc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
                    292: static void smc_rx(struct net_device *dev);
                    293: static struct net_device_stats *smc_get_stats(struct net_device *dev);
                    294: static void set_rx_mode(struct net_device *dev);
                    295: static int s9k_config(struct net_device *dev, struct ifmap *map);
                    296: static void smc_set_xcvr(struct net_device *dev, int if_port);
                    297: static void smc_reset(struct net_device *dev);
                    298: static void media_check(u_long arg);
                    299: static void mdio_sync(ioaddr_t addr);
                    300: static int mdio_read(struct net_device *dev, int phy_id, int loc);
                    301: static void mdio_write(struct net_device *dev, int phy_id, int loc, int value);
                    302: 
                    303: /*======================================================================
                    304: 
                    305:     This bit of code is used to avoid unregistering network devices
                    306:     at inappropriate times.  2.2 and later kernels are fairly picky
                    307:     about when this can happen.
                    308: 
                    309: ======================================================================*/
                    310: 
                    311: static void flush_stale_links(void)
                    312: {
                    313:     dev_link_t *link, *next;
                    314:     for (link = dev_list; link; link = next) {
                    315:        next = link->next;
                    316:        if (link->state & DEV_STALE_LINK)
                    317:            smc91c92_detach(link);
                    318:     }
                    319: }
                    320: 
                    321: /*====================================================================*/
                    322: 
                    323: static void cs_error(client_handle_t handle, int func, int ret)
                    324: {
                    325:     error_info_t err = { func, ret };
                    326:     CardServices(ReportError, handle, &err);
                    327: }
                    328: 
                    329: /*======================================================================
                    330: 
                    331:   smc91c92_attach() creates an "instance" of the driver, allocating
                    332:   local data structures for one device.  The device is registered
                    333:   with Card Services.
                    334: 
                    335: ======================================================================*/
                    336: 
                    337: static dev_link_t *smc91c92_attach(void)
                    338: {
                    339:     client_reg_t client_reg;
                    340:     struct smc_private *smc;
                    341:     dev_link_t *link;
                    342:     struct net_device *dev;
                    343:     int i, ret;
                    344: 
                    345:     DEBUG(0, "smc91c92_attach()\n");
                    346:     flush_stale_links();
                    347: 
                    348:     /* Create new ethernet device */
                    349:     smc = kmalloc(sizeof(struct smc_private), GFP_KERNEL);
                    350:     if (!smc) return NULL;
                    351:     memset(smc, 0, sizeof(struct smc_private));
                    352:     link = &smc->link; dev = &smc->dev;
                    353: 
                    354:     init_timer(&link->release);
                    355:     link->release.function = &smc91c92_release;
                    356:     link->release.data = (u_long)link;
                    357:     link->io.NumPorts1 = 16;
                    358:     link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
                    359:     link->io.IOAddrLines = 4;
                    360:     link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
                    361:     link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;
                    362:     if (irq_list[0] == -1)
                    363:        link->irq.IRQInfo2 = irq_mask;
                    364:     else
                    365:        for (i = 0; i < 4; i++)
                    366:            link->irq.IRQInfo2 |= 1 << irq_list[i];
                    367:     link->irq.Handler = &smc_interrupt;
                    368:     link->conf.Attributes = CONF_ENABLE_IRQ;
                    369:     link->conf.Vcc = 50;
                    370:     link->conf.IntType = INT_MEMORY_AND_IO;
                    371: 
                    372:     /* The SMC91c92-specific entries in the device structure. */
                    373:     dev->hard_start_xmit = &smc_start_xmit;
                    374:     dev->get_stats = &smc_get_stats;
                    375:     dev->set_config = &s9k_config;
                    376:     dev->set_multicast_list = &set_rx_mode;
                    377:     ether_setup(dev);
                    378:     init_dev_name(dev, smc->node);
                    379:     dev->open = &smc_open;
                    380:     dev->stop = &smc_close;
                    381:     dev->do_ioctl = &smc_ioctl;
                    382: #ifdef HAVE_TX_TIMEOUT
                    383:     dev->tx_timeout = smc_tx_timeout;
                    384:     dev->watchdog_timeo = TX_TIMEOUT;
                    385: #endif
                    386:     dev->priv = link->priv = link->irq.Instance = smc;
                    387: 
                    388:     /* Register with Card Services */
                    389:     link->next = dev_list;
                    390:     dev_list = link;
                    391:     client_reg.dev_info = &dev_info;
                    392:     client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
                    393:     client_reg.EventMask = CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
                    394:        CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
                    395:        CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
                    396:     client_reg.event_handler = &smc91c92_event;
                    397:     client_reg.Version = 0x0210;
                    398:     client_reg.event_callback_args.client_data = link;
                    399:     ret = CardServices(RegisterClient, &link->handle, &client_reg);
                    400:     if (ret != 0) {
                    401:        cs_error(link->handle, RegisterClient, ret);
                    402:        smc91c92_detach(link);
                    403:        return NULL;
                    404:     }
                    405: 
                    406:     return link;
                    407: } /* smc91c92_attach */
                    408: 
                    409: /*======================================================================
                    410: 
                    411:     This deletes a driver "instance".  The device is de-registered
                    412:     with Card Services.  If it has been released, all local data
                    413:     structures are freed.  Otherwise, the structures will be freed
                    414:     when the device is released.
                    415: 
                    416: ======================================================================*/
                    417: 
                    418: static void smc91c92_detach(dev_link_t *link)
                    419: {
                    420:     struct smc_private *smc = link->priv;
                    421:     dev_link_t **linkp;
                    422: 
                    423:     DEBUG(0, "smc91c92_detach(0x%p)\n", link);
                    424: 
                    425:     /* Locate device structure */
                    426:     for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
                    427:        if (*linkp == link) break;
                    428:     if (*linkp == NULL)
                    429:        return;
                    430: 
                    431:     del_timer(&link->release);
                    432:     if (link->state & DEV_CONFIG) {
                    433:        smc91c92_release((u_long)link);
                    434:        if (link->state & DEV_STALE_CONFIG) {
                    435:            link->state |= DEV_STALE_LINK;
                    436:            return;
                    437:        }
                    438:     }
                    439: 
                    440:     if (link->handle)
                    441:        CardServices(DeregisterClient, link->handle);
                    442: 
                    443:     /* Unlink device structure, free bits */
                    444:     *linkp = link->next;
                    445:     if (link->dev)
                    446:        unregister_netdev(&smc->dev);
                    447:     kfree(smc);
                    448: 
                    449: } /* smc91c92_detach */
                    450: 
                    451: /*====================================================================*/
                    452: 
                    453: static int cvt_ascii_address(struct net_device *dev, char *s)
                    454: {
                    455:     int i, j, da, c;
                    456: 
                    457:     if (strlen(s) != 12)
                    458:        return -1;
                    459:     for (i = 0; i < 6; i++) {
                    460:        da = 0;
                    461:        for (j = 0; j < 2; j++) {
                    462:            c = *s++;
                    463:            da <<= 4;
                    464:            da += ((c >= '0') && (c <= '9')) ?
                    465:                (c - '0') : ((c & 0x0f) + 9);
                    466:        }
                    467:        dev->dev_addr[i] = da;
                    468:     }
                    469:     return 0;
                    470: }
                    471: 
                    472: /*====================================================================*/
                    473: 
                    474: static int get_tuple(int fn, client_handle_t handle, tuple_t *tuple,
                    475:                     cisparse_t *parse)
                    476: {
                    477:     int i;
                    478:     i = CardServices(fn, handle, tuple);
                    479:     if (i != CS_SUCCESS) return i;
                    480:     i = CardServices(GetTupleData, handle, tuple);
                    481:     if (i != CS_SUCCESS) return i;
                    482:     return CardServices(ParseTuple, handle, tuple, parse);
                    483: }
                    484: 
                    485: #define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
                    486: #define next_tuple(a, b, c) get_tuple(GetNextTuple, a, b, c)
                    487: 
                    488: /*======================================================================
                    489: 
                    490:     Configuration stuff for Megahertz cards
                    491: 
                    492:     mhz_3288_power() is used to power up a 3288's ethernet chip.
                    493:     mhz_mfc_config() handles socket setup for multifunction (1144
                    494:     and 3288) cards.  mhz_setup() gets a card's hardware ethernet
                    495:     address.
                    496: 
                    497: ======================================================================*/
                    498: 
                    499: static int mhz_3288_power(dev_link_t *link)
                    500: {
                    501:     struct smc_private *smc = link->priv;
                    502:     u_char tmp;
                    503: 
                    504:     /* Read the ISR twice... */
                    505:     readb(smc->base+MEGAHERTZ_ISR);
                    506:     udelay(5);
                    507:     readb(smc->base+MEGAHERTZ_ISR);
                    508: 
                    509:     /* Pause 200ms... */
                    510:     mdelay(200);
                    511: 
                    512:     /* Now read and write the COR... */
                    513:     tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
                    514:     udelay(5);
                    515:     writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
                    516: 
                    517:     return 0;
                    518: }
                    519: 
                    520: static int mhz_mfc_config(dev_link_t *link)
                    521: {
                    522:     struct smc_private *smc = link->priv;
                    523:     struct net_device *dev = &smc->dev;
                    524:     tuple_t tuple;
                    525:     cisparse_t parse;
                    526:     u_char buf[255];
                    527:     cistpl_cftable_entry_t *cf = &parse.cftable_entry;
                    528:     win_req_t req;
                    529:     memreq_t mem;
                    530:     int i, k;
                    531: 
                    532:     link->conf.Attributes |= CONF_ENABLE_SPKR;
                    533:     link->conf.Status = CCSR_AUDIO_ENA;
                    534:     link->irq.Attributes =
                    535:        IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
                    536:     link->io.IOAddrLines = 16;
                    537:     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
                    538:     link->io.NumPorts2 = 8;
                    539: 
                    540:     tuple.Attributes = tuple.TupleOffset = 0;
                    541:     tuple.TupleData = (cisdata_t *)buf;
                    542:     tuple.TupleDataMax = sizeof(buf);
                    543:     tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
                    544: 
                    545:     i = first_tuple(link->handle, &tuple, &parse);
                    546:     /* The Megahertz combo cards have modem-like CIS entries, so
                    547:        we have to explicitly try a bunch of port combinations. */
                    548:     while (i == CS_SUCCESS) {
                    549:        link->conf.ConfigIndex = cf->index;
                    550:        link->io.BasePort2 = cf->io.win[0].base;
                    551:        for (k = 0; k < 0x400; k += 0x10) {
                    552:            if (k & 0x80) continue;
                    553:            link->io.BasePort1 = k ^ 0x300;
                    554:            i = CardServices(RequestIO, link->handle, &link->io);
                    555:            if (i == CS_SUCCESS) break;
                    556:        }
                    557:        if (i == CS_SUCCESS) break;
                    558:        i = next_tuple(link->handle, &tuple, &parse);
                    559:     }
                    560:     if (i != CS_SUCCESS)
                    561:        return i;
                    562:     dev->base_addr = link->io.BasePort1;
                    563: 
                    564:     /* Allocate a memory window, for accessing the ISR */
                    565:     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
                    566:     req.Base = req.Size = 0;
                    567:     req.AccessSpeed = 0;
                    568:     link->win = (window_handle_t)link->handle;
                    569:     i = CardServices(RequestWindow, &link->win, &req);
                    570:     if (i != CS_SUCCESS)
                    571:        return i;
                    572:     smc->base = ioremap(req.Base, req.Size);
                    573:     mem.CardOffset = mem.Page = 0;
                    574:     if (smc->manfid == MANFID_MOTOROLA)
                    575:        mem.CardOffset = link->conf.ConfigBase;
                    576:     i = CardServices(MapMemPage, link->win, &mem);
                    577: 
                    578:     if ((i == CS_SUCCESS)
                    579:        && (smc->manfid == MANFID_MEGAHERTZ)
                    580:        && (smc->cardid == PRODID_MEGAHERTZ_EM3288))
                    581:        mhz_3288_power(link);
                    582: 
                    583:     return i;
                    584: }
                    585: 
                    586: static int mhz_setup(dev_link_t *link)
                    587: {
                    588:     client_handle_t handle = link->handle;
                    589:     struct smc_private *smc = link->priv;
                    590:     struct net_device *dev = &smc->dev;
                    591:     tuple_t tuple;
                    592:     cisparse_t parse;
                    593:     u_char buf[255], *station_addr;
                    594: 
                    595:     tuple.Attributes = tuple.TupleOffset = 0;
                    596:     tuple.TupleData = buf;
                    597:     tuple.TupleDataMax = sizeof(buf);
                    598: 
                    599:     /* Read the station address from the CIS.  It is stored as the last
                    600:        (fourth) string in the Version 1 Version/ID tuple. */
                    601:     tuple.DesiredTuple = CISTPL_VERS_1;
                    602:     if (first_tuple(handle, &tuple, &parse) != CS_SUCCESS)
                    603:        return -1;
                    604:     /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */
                    605:     if (next_tuple(handle, &tuple, &parse) != CS_SUCCESS)
                    606:        first_tuple(handle, &tuple, &parse);
                    607:     if (parse.version_1.ns > 3) {
                    608:        station_addr = parse.version_1.str + parse.version_1.ofs[3];
                    609:        if (cvt_ascii_address(dev, station_addr) == 0)
                    610:            return 0;
                    611:     }
                    612: 
                    613:     /* Another possibility: for the EM3288, in a special tuple */
                    614:     tuple.DesiredTuple = 0x81;
                    615:     if (CardServices(GetFirstTuple, handle, &tuple) != CS_SUCCESS)
                    616:        return -1;
                    617:     if (CardServices(GetTupleData, handle, &tuple) != CS_SUCCESS)
                    618:        return -1;
                    619:     buf[12] = '\0';
                    620:     if (cvt_ascii_address(dev, buf) == 0)
                    621:        return 0;
                    622: 
                    623:     return -1;
                    624: }
                    625: 
                    626: /*======================================================================
                    627: 
                    628:     Configuration stuff for the Motorola Mariner
                    629: 
                    630:     mot_config() writes directly to the Mariner configuration
                    631:     registers because the CIS is just bogus.
                    632: 
                    633: ======================================================================*/
                    634: 
                    635: static void mot_config(dev_link_t *link)
                    636: {
                    637:     struct smc_private *smc = link->priv;
                    638:     struct net_device *dev = &smc->dev;
                    639:     ioaddr_t ioaddr = dev->base_addr;
                    640:     ioaddr_t iouart = link->io.BasePort2;
                    641: 
                    642:     /* Set UART base address and force map with COR bit 1 */
                    643:     writeb(iouart & 0xff,        smc->base + MOT_UART + CISREG_IOBASE_0);
                    644:     writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1);
                    645:     writeb(MOT_NORMAL,           smc->base + MOT_UART + CISREG_COR);
                    646: 
                    647:     /* Set SMC base address and force map with COR bit 1 */
                    648:     writeb(ioaddr & 0xff,        smc->base + MOT_LAN + CISREG_IOBASE_0);
                    649:     writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1);
                    650:     writeb(MOT_NORMAL,           smc->base + MOT_LAN + CISREG_COR);
                    651: 
                    652:     /* Wait for things to settle down */
                    653:     mdelay(100);
                    654: }
                    655: 
                    656: static int mot_setup(dev_link_t *link)
                    657: {
                    658:     struct smc_private *smc = link->priv;
                    659:     struct net_device *dev = &smc->dev;
                    660:     ioaddr_t ioaddr = dev->base_addr;
                    661:     int i, wait, loop;
                    662:     u_int addr;
                    663: 
                    664:     /* Read Ethernet address from Serial EEPROM */
                    665: 
                    666:     for (i = 0; i < 3; i++) {
                    667:        SMC_SELECT_BANK(2);
                    668:        outw(MOT_EEPROM + i, ioaddr + POINTER);
                    669:        SMC_SELECT_BANK(1);
                    670:        outw((CTL_RELOAD | CTL_EE_SELECT), ioaddr + CONTROL);
                    671: 
                    672:        for (loop = wait = 0; loop < 200; loop++) {
                    673:            udelay(10);
                    674:            wait = ((CTL_RELOAD | CTL_STORE) & inw(ioaddr + CONTROL));
                    675:            if (wait == 0) break;
                    676:        }
                    677:        
                    678:        if (wait)
                    679:            return -1;
                    680:        
                    681:        addr = inw(ioaddr + GENERAL);
                    682:        dev->dev_addr[2*i]   = addr & 0xff;
                    683:        dev->dev_addr[2*i+1] = (addr >> 8) & 0xff;
                    684:     }
                    685: 
                    686:     return 0;
                    687: }
                    688: 
                    689: /*====================================================================*/
                    690: 
                    691: static int smc_config(dev_link_t *link)
                    692: {
                    693:     struct smc_private *smc = link->priv;
                    694:     struct net_device *dev = &smc->dev;
                    695:     tuple_t tuple;
                    696:     cisparse_t parse;
                    697:     u_char buf[255];
                    698:     cistpl_cftable_entry_t *cf = &parse.cftable_entry;
                    699:     int i;
                    700: 
                    701:     tuple.Attributes = tuple.TupleOffset = 0;
                    702:     tuple.TupleData = (cisdata_t *)buf;
                    703:     tuple.TupleDataMax = sizeof(buf);
                    704:     tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
                    705: 
                    706:     link->io.NumPorts1 = 16;
                    707:     i = first_tuple(link->handle, &tuple, &parse);
                    708:     while (i != CS_NO_MORE_ITEMS) {
                    709:        if (i == CS_SUCCESS) {
                    710:            link->conf.ConfigIndex = cf->index;
                    711:            link->io.BasePort1 = cf->io.win[0].base;
                    712:            link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
                    713:            i = CardServices(RequestIO, link->handle, &link->io);
                    714:            if (i == CS_SUCCESS) break;
                    715:        }
                    716:        i = next_tuple(link->handle, &tuple, &parse);
                    717:     }
                    718:     if (i == CS_SUCCESS)
                    719:        dev->base_addr = link->io.BasePort1;
                    720:     return i;
                    721: }
                    722: 
                    723: static int smc_setup(dev_link_t *link)
                    724: {
                    725:     client_handle_t handle = link->handle;
                    726:     struct smc_private *smc = link->priv;
                    727:     struct net_device *dev = &smc->dev;
                    728:     tuple_t tuple;
                    729:     cisparse_t parse;
                    730:     cistpl_lan_node_id_t *node_id;
                    731:     u_char buf[255], *station_addr;
                    732:     int i;
                    733: 
                    734:     tuple.Attributes = tuple.TupleOffset = 0;
                    735:     tuple.TupleData = buf;
                    736:     tuple.TupleDataMax = sizeof(buf);
                    737: 
                    738:     /* Check for a LAN function extension tuple */
                    739:     tuple.DesiredTuple = CISTPL_FUNCE;
                    740:     i = first_tuple(handle, &tuple, &parse);
                    741:     while (i == CS_SUCCESS) {
                    742:        if (parse.funce.type == CISTPL_FUNCE_LAN_NODE_ID)
                    743:            break;
                    744:        i = next_tuple(handle, &tuple, &parse);
                    745:     }
                    746:     if (i == CS_SUCCESS) {
                    747:        node_id = (cistpl_lan_node_id_t *)parse.funce.data;
                    748:        if (node_id->nb == 6) {
                    749:            for (i = 0; i < 6; i++)
                    750:                dev->dev_addr[i] = node_id->id[i];
                    751:            return 0;
                    752:        }
                    753:     }
                    754: 
                    755:     /* Try the third string in the Version 1 Version/ID tuple. */
                    756:     tuple.DesiredTuple = CISTPL_VERS_1;
                    757:     if (first_tuple(handle, &tuple, &parse) != CS_SUCCESS)
                    758:        return -1;
                    759:     station_addr = parse.version_1.str + parse.version_1.ofs[2];
                    760:     if (cvt_ascii_address(dev, station_addr) == 0)
                    761:        return 0;
                    762: 
                    763:     return -1;
                    764: }
                    765: 
                    766: /*====================================================================*/
                    767: 
                    768: static int osi_config(dev_link_t *link)
                    769: {
                    770:     struct smc_private *smc = link->priv;
                    771:     struct net_device *dev = &smc->dev;
                    772:     static ioaddr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
                    773:     int i, j;
                    774: 
                    775:     link->conf.Attributes |= CONF_ENABLE_SPKR;
                    776:     link->conf.Status = CCSR_AUDIO_ENA;
                    777:     link->irq.Attributes =
                    778:        IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
                    779:     link->io.NumPorts1 = 64;
                    780:     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
                    781:     link->io.NumPorts2 = 8;
                    782:     link->io.IOAddrLines = 16;
                    783: 
                    784:     /* Enable Hard Decode, LAN, Modem */
                    785:     link->conf.ConfigIndex = 0x23;
                    786: 
                    787:     for (i = j = 0; j < 4; j++) {
                    788:        link->io.BasePort2 = com[j];
                    789:        i = CardServices(RequestIO, link->handle, &link->io);
                    790:        if (i == CS_SUCCESS) break;
                    791:     }
                    792:     if (i != CS_SUCCESS) {
                    793:        /* Fallback: turn off hard decode */
                    794:        link->conf.ConfigIndex = 0x03;
                    795:        link->io.NumPorts2 = 0;
                    796:        i = CardServices(RequestIO, link->handle, &link->io);
                    797:     }
                    798:     dev->base_addr = link->io.BasePort1 + 0x10;
                    799:     return i;
                    800: }
                    801: 
                    802: static int osi_setup(dev_link_t *link, u_short manfid, u_short cardid)
                    803: {
                    804:     client_handle_t handle = link->handle;
                    805:     struct smc_private *smc = link->priv;
                    806:     struct net_device *dev = &smc->dev;
                    807:     tuple_t tuple;
                    808:     u_char buf[255];
                    809:     int i;
                    810: 
                    811:     tuple.Attributes = TUPLE_RETURN_COMMON;
                    812:     tuple.TupleData = buf;
                    813:     tuple.TupleDataMax = sizeof(buf);
                    814:     tuple.TupleOffset = 0;
                    815: 
                    816:     /* Read the station address from tuple 0x90, subtuple 0x04 */
                    817:     tuple.DesiredTuple = 0x90;
                    818:     i = CardServices(GetFirstTuple, handle, &tuple);
                    819:     while (i == CS_SUCCESS) {
                    820:        i = CardServices(GetTupleData, handle, &tuple);
                    821:        if ((i != CS_SUCCESS) || (buf[0] == 0x04))
                    822:            break;
                    823:        i = CardServices(GetNextTuple, handle, &tuple);
                    824:     }
                    825:     if (i != CS_SUCCESS)
                    826:        return -1;
                    827:     for (i = 0; i < 6; i++)
                    828:        dev->dev_addr[i] = buf[i+2];
                    829: 
                    830:     if (((manfid == MANFID_OSITECH) &&
                    831:         (cardid == PRODID_OSITECH_SEVEN)) ||
                    832:        ((manfid == MANFID_PSION) &&
                    833:         (cardid == PRODID_PSION_NET100))) {
                    834:        /* Download the Seven of Diamonds firmware */
                    835:        for (i = 0; i < sizeof(__Xilinx7OD); i++) {
                    836:            outb(__Xilinx7OD[i], link->io.BasePort1+2);
                    837:            udelay(50);
                    838:        }
                    839:     } else if (manfid == MANFID_OSITECH) {
                    840:        /* Make sure both functions are powered up */
                    841:        set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
                    842:        /* Now, turn on the interrupt for both card functions */
                    843:        set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
                    844:        DEBUG(2, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
                    845:              inw(link->io.BasePort1 + OSITECH_AUI_PWR),
                    846:              inw(link->io.BasePort1 + OSITECH_RESET_ISR));
                    847:     }
                    848: 
                    849:     return 0;
                    850: }
                    851: 
                    852: /*======================================================================
                    853: 
                    854:     This verifies that the chip is some SMC91cXX variant, and returns
                    855:     the revision code if successful.  Otherwise, it returns -ENODEV.
                    856: 
                    857: ======================================================================*/
                    858: 
                    859: static int check_sig(dev_link_t *link)
                    860: {
                    861:     struct smc_private *smc = link->priv;
                    862:     struct net_device *dev = &smc->dev;
                    863:     ioaddr_t ioaddr = dev->base_addr;
                    864:     int width;
                    865:     u_short s;
                    866: 
                    867:     SMC_SELECT_BANK(1);
                    868:     if (inw(ioaddr + BANK_SELECT) >> 8 != 0x33) {
                    869:        /* Try powering up the chip */
                    870:        outw(0, ioaddr + CONTROL);
                    871:        mdelay(55);
                    872:     }
                    873: 
                    874:     /* Try setting bus width */
                    875:     width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
                    876:     s = inb(ioaddr + CONFIG);
                    877:     if (width)
                    878:        s |= CFG_16BIT;
                    879:     else
                    880:        s &= ~CFG_16BIT;
                    881:     outb(s, ioaddr + CONFIG);
                    882: 
                    883:     /* Check Base Address Register to make sure bus width is OK */
                    884:     s = inw(ioaddr + BASE_ADDR);
                    885:     if ((inw(ioaddr + BANK_SELECT) >> 8 == 0x33) &&
                    886:        ((s >> 8) != (s & 0xff))) {
                    887:        SMC_SELECT_BANK(3);
                    888:        s = inw(ioaddr + REVISION);
                    889:        return (s & 0xff);
                    890:     }
                    891: 
                    892:     if (width) {
                    893:        event_callback_args_t args;
                    894:        printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
                    895:        args.client_data = link;
                    896:        smc91c92_event(CS_EVENT_RESET_PHYSICAL, 0, &args);
                    897:        CardServices(ReleaseIO, link->handle, &link->io);
                    898:        link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
                    899:        CardServices(RequestIO, link->handle, &link->io);
                    900:        smc91c92_event(CS_EVENT_CARD_RESET, 0, &args);
                    901:        return check_sig(link);
                    902:     }
                    903:     return -ENODEV;
                    904: }
                    905: 
                    906: /*======================================================================
                    907: 
                    908:     smc91c92_config() is scheduled to run after a CARD_INSERTION event
                    909:     is received, to configure the PCMCIA socket, and to make the
                    910:     ethernet device available to the system.
                    911: 
                    912: ======================================================================*/
                    913: 
                    914: #define CS_EXIT_TEST(ret, svc, label) \
                    915: if (ret != CS_SUCCESS) { cs_error(link->handle, svc, ret); goto label; }
                    916: 
                    917: static void smc91c92_config(dev_link_t *link)
                    918: {
                    919:     client_handle_t handle = link->handle;
                    920:     struct smc_private *smc = link->priv;
                    921:     struct net_device *dev = &smc->dev;
                    922:     tuple_t tuple;
                    923:     cisparse_t parse;
                    924:     u_short buf[32];
                    925:     char *name;
                    926:     int i, j, rev;
                    927:     ioaddr_t ioaddr;
                    928: 
                    929:     DEBUG(0, "smc91c92_config(0x%p)\n", link);
                    930: 
                    931:     tuple.Attributes = tuple.TupleOffset = 0;
                    932:     tuple.TupleData = (cisdata_t *)buf;
                    933:     tuple.TupleDataMax = sizeof(buf);
                    934: 
                    935:     tuple.DesiredTuple = CISTPL_CONFIG;
                    936:     i = first_tuple(handle, &tuple, &parse);
                    937:     CS_EXIT_TEST(i, ParseTuple, config_failed);
                    938:     link->conf.ConfigBase = parse.config.base;
                    939:     link->conf.Present = parse.config.rmask[0];
                    940: 
                    941:     tuple.DesiredTuple = CISTPL_MANFID;
                    942:     tuple.Attributes = TUPLE_RETURN_COMMON;
                    943:     if (first_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
                    944:        smc->manfid = parse.manfid.manf;
                    945:        smc->cardid = parse.manfid.card;
                    946:     }
                    947: 
                    948:     /* Configure card */
                    949:     link->state |= DEV_CONFIG;
                    950: 
                    951:     if ((smc->manfid == MANFID_OSITECH) &&
                    952:        (smc->cardid != PRODID_OSITECH_SEVEN)) {
                    953:        i = osi_config(link);
                    954:     } else if ((smc->manfid == MANFID_MOTOROLA) ||
                    955:               ((smc->manfid == MANFID_MEGAHERTZ) &&
                    956:                ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) ||
                    957:                 (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) {
                    958:        i = mhz_mfc_config(link);
                    959:     } else {
                    960:        i = smc_config(link);
                    961:     }
                    962:     CS_EXIT_TEST(i, RequestIO, config_failed);
                    963: 
                    964:     i = CardServices(RequestIRQ, link->handle, &link->irq);
                    965:     CS_EXIT_TEST(i, RequestIRQ, config_failed);
                    966:     i = CardServices(RequestConfiguration, link->handle, &link->conf);
                    967:     CS_EXIT_TEST(i, RequestConfiguration, config_failed);
                    968: 
                    969:     if (smc->manfid == MANFID_MOTOROLA)
                    970:        mot_config(link);
                    971: 
                    972:     dev->irq = link->irq.AssignedIRQ;
                    973: 
                    974:     if ((if_port >= 0) && (if_port <= 2))
                    975:        dev->if_port = if_port;
                    976:     else
                    977:        printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
                    978: 
                    979:     if (register_netdev(dev) != 0) {
                    980:        printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
                    981:        goto config_undo;
                    982:     }
                    983: 
                    984:     switch (smc->manfid) {
                    985:     case MANFID_OSITECH:
                    986:     case MANFID_PSION:
                    987:        i = osi_setup(link, smc->manfid, smc->cardid); break;
                    988:     case MANFID_SMC:
                    989:     case MANFID_NEW_MEDIA:
                    990:        i = smc_setup(link); break;
                    991:     case 0x128: /* For broken Megahertz cards */
                    992:     case MANFID_MEGAHERTZ:
                    993:        i = mhz_setup(link); break;
                    994:     case MANFID_MOTOROLA:
                    995:     default: /* get the hw address from EEPROM */
                    996:        i = mot_setup(link); break;
                    997:     }
                    998: 
                    999:     if (i != 0) {
                   1000:        printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
                   1001:        goto config_undo;
                   1002:     }
                   1003: 
                   1004:     copy_dev_name(smc->node, dev);
                   1005:     link->dev = &smc->node;
                   1006:     smc->duplex = 0;
                   1007:     smc->rx_ovrn = 0;
                   1008: 
                   1009:     rev = check_sig(link);
                   1010:     name = "???";
                   1011:     if (rev > 0)
                   1012:        switch (rev >> 4) {
                   1013:        case 3: name = "92"; break;
                   1014:        case 4: name = ((rev & 15) >= 6) ? "96" : "94"; break;
                   1015:        case 5: name = "95"; break;
                   1016:        case 7: name = "100"; break;
                   1017:        case 8: name = "100-FD"; break;
                   1018:        case 9: name = "110"; break;
                   1019:        }
                   1020:     printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
                   1021:           "hw_addr ", dev->name, name, (rev & 0x0f), dev->base_addr,
                   1022:           dev->irq);
                   1023:     for (i = 0; i < 6; i++)
                   1024:        printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
                   1025: 
                   1026:     ioaddr = dev->base_addr;
                   1027:     if (rev > 0) {
                   1028:        u_long mir, mcr;
                   1029:        SMC_SELECT_BANK(0);
                   1030:        mir = inw(ioaddr + MEMINFO) & 0xff;
                   1031:        if (mir == 0xff) mir++;
                   1032:        /* Get scale factor for memory size */
                   1033:        mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200;
                   1034:        mir *= 128 * (1<<((mcr >> 9) & 7));
                   1035:        if (mir & 0x3ff)
                   1036:            printk(KERN_INFO "  %lu byte", mir);
                   1037:        else
                   1038:            printk(KERN_INFO "  %lu kb", mir>>10);
                   1039:        SMC_SELECT_BANK(1);
                   1040:        smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT;
                   1041:        smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC;
                   1042:        if (smc->manfid == MANFID_OSITECH)
                   1043:            smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0;
                   1044:        if ((rev >> 4) >= 7)
                   1045:            smc->cfg |= CFG_MII_SELECT;
                   1046:        printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
                   1047:               "MII" : if_names[dev->if_port]);
                   1048:     }
                   1049: 
                   1050:     if (smc->cfg & CFG_MII_SELECT) {
                   1051:        SMC_SELECT_BANK(3);
                   1052: 
                   1053:        for (i = 0; i < 32; i++) {
                   1054:            j = mdio_read(dev, i, 1);
                   1055:            if ((j != 0) && (j != 0xffff)) break;
                   1056:        }
                   1057:        smc->phy_id = (i < 32) ? i : -1;
                   1058:        if (i < 32) {
                   1059:            DEBUG(0, "  MII transceiver at index %d, status %x.\n", i, j);
                   1060:        } else {
                   1061:            printk(KERN_NOTICE "  No MII transceivers found!\n");
                   1062:        }
                   1063: 
                   1064:        SMC_SELECT_BANK(0);
                   1065:     }
                   1066: 
                   1067:     link->state &= ~DEV_CONFIG_PENDING;
                   1068:     return;
                   1069: 
                   1070: config_undo:
                   1071:     unregister_netdev(dev);
                   1072: config_failed:                 /* CS_EXIT_TEST() calls jump to here... */
                   1073:     smc91c92_release((u_long)link);
                   1074:     link->state &= ~DEV_CONFIG_PENDING;
                   1075: 
                   1076: } /* smc91c92_config */
                   1077: 
                   1078: /*======================================================================
                   1079: 
                   1080:     After a card is removed, smc91c92_release() will unregister the net
                   1081:     device, and release the PCMCIA configuration.  If the device is
                   1082:     still open, this will be postponed until it is closed.
                   1083: 
                   1084: ======================================================================*/
                   1085: 
                   1086: static void smc91c92_release(u_long arg)
                   1087: {
                   1088:     dev_link_t *link = (dev_link_t *)arg;
                   1089:     struct smc_private *smc = link->priv;
                   1090: 
                   1091:     DEBUG(0, "smc91c92_release(0x%p)\n", link);
                   1092: 
                   1093:     if (link->open) {
                   1094:        DEBUG(1, "smc91c92_cs: release postponed, '%s' still open\n",
                   1095:              link->dev->dev_name);
                   1096:        link->state |= DEV_STALE_CONFIG;
                   1097:        return;
                   1098:     }
                   1099: 
                   1100:     CardServices(ReleaseConfiguration, link->handle);
                   1101:     CardServices(ReleaseIO, link->handle, &link->io);
                   1102:     CardServices(ReleaseIRQ, link->handle, &link->irq);
                   1103:     if (link->win) {
                   1104:        iounmap(smc->base);
                   1105:        CardServices(ReleaseWindow, link->win);
                   1106:     }
                   1107: 
                   1108:     link->state &= ~DEV_CONFIG;
                   1109: 
                   1110: } /* smc91c92_release */
                   1111: 
                   1112: /*======================================================================
                   1113: 
                   1114:     The card status event handler.  Mostly, this schedules other
                   1115:     stuff to run after an event is received.  A CARD_REMOVAL event
                   1116:     also sets some flags to discourage the net drivers from trying
                   1117:     to talk to the card any more.
                   1118: 
                   1119: ======================================================================*/
                   1120: 
                   1121: static int smc91c92_event(event_t event, int priority,
                   1122:                          event_callback_args_t *args)
                   1123: {
                   1124:     dev_link_t *link = args->client_data;
                   1125:     struct smc_private *smc = link->priv;
                   1126:     struct net_device *dev = &smc->dev;
                   1127:     int i;
                   1128: 
                   1129:     DEBUG(1, "smc91c92_event(0x%06x)\n", event);
                   1130: 
                   1131:     switch (event) {
                   1132:     case CS_EVENT_CARD_REMOVAL:
                   1133:        link->state &= ~DEV_PRESENT;
                   1134:        if (link->state & DEV_CONFIG) {
                   1135:            netif_device_detach(dev);
                   1136:            mod_timer(&link->release, jiffies + HZ/20);
                   1137:        }
                   1138:        break;
                   1139:     case CS_EVENT_CARD_INSERTION:
                   1140:        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                   1141:        smc91c92_config(link);
                   1142:        break;
                   1143:     case CS_EVENT_PM_SUSPEND:
                   1144:        link->state |= DEV_SUSPEND;
                   1145:        /* Fall through... */
                   1146:     case CS_EVENT_RESET_PHYSICAL:
                   1147:        if (link->state & DEV_CONFIG) {
                   1148:            if (link->open)
                   1149:                netif_device_detach(dev);
                   1150:            CardServices(ReleaseConfiguration, link->handle);
                   1151:        }
                   1152:        break;
                   1153:     case CS_EVENT_PM_RESUME:
                   1154:        link->state &= ~DEV_SUSPEND;
                   1155:        /* Fall through... */
                   1156:     case CS_EVENT_CARD_RESET:
                   1157:        if (link->state & DEV_CONFIG) {
                   1158:            if ((smc->manfid == MANFID_MEGAHERTZ) &&
                   1159:                (smc->cardid == PRODID_MEGAHERTZ_EM3288))
                   1160:                mhz_3288_power(link);
                   1161:            CardServices(RequestConfiguration, link->handle, &link->conf);
                   1162:            if (smc->manfid == MANFID_MOTOROLA)
                   1163:                mot_config(link);
                   1164:            if ((smc->manfid == MANFID_OSITECH) &&
                   1165:                (smc->cardid != PRODID_OSITECH_SEVEN)) {
                   1166:                /* Power up the card and enable interrupts */
                   1167:                set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
                   1168:                set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
                   1169:            }
                   1170:            if (((smc->manfid == MANFID_OSITECH) &&
                   1171:                (smc->cardid == PRODID_OSITECH_SEVEN)) ||
                   1172:                ((smc->manfid == MANFID_PSION) &&
                   1173:                (smc->cardid == PRODID_PSION_NET100))) {
                   1174:                /* Download the Seven of Diamonds firmware */
                   1175:                for (i = 0; i < sizeof(__Xilinx7OD); i++) {
                   1176:                    outb(__Xilinx7OD[i], link->io.BasePort1+2);
                   1177:                    udelay(50);
                   1178:                }
                   1179:            }
                   1180:            if (link->open) {
                   1181:                smc_reset(dev);
                   1182:                netif_device_attach(dev);
                   1183:            }
                   1184:        }
                   1185:        break;
                   1186:     }
                   1187:     return 0;
                   1188: } /* smc91c92_event */
                   1189: 
                   1190: /*======================================================================
                   1191: 
                   1192:     MII interface support for SMC91cXX based cards
                   1193: ======================================================================*/
                   1194: 
                   1195: #define MDIO_SHIFT_CLK         0x04
                   1196: #define MDIO_DATA_OUT          0x01
                   1197: #define MDIO_DIR_WRITE         0x08
                   1198: #define MDIO_DATA_WRITE0       (MDIO_DIR_WRITE)
                   1199: #define MDIO_DATA_WRITE1       (MDIO_DIR_WRITE | MDIO_DATA_OUT)
                   1200: #define MDIO_DATA_READ         0x02
                   1201: 
                   1202: static void mdio_sync(ioaddr_t addr)
                   1203: {
                   1204:     int bits;
                   1205:     for (bits = 0; bits < 32; bits++) {
                   1206:        outb(MDIO_DATA_WRITE1, addr);
                   1207:        outb(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
                   1208:     }
                   1209: }
                   1210: 
                   1211: static int mdio_read(struct net_device *dev, int phy_id, int loc)
                   1212: {
                   1213:     ioaddr_t addr = dev->base_addr + MGMT;
                   1214:     u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
                   1215:     int i, retval = 0;
                   1216: 
                   1217:     mdio_sync(addr);
                   1218:     for (i = 13; i >= 0; i--) {
                   1219:        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
                   1220:        outb(dat, addr);
                   1221:        outb(dat | MDIO_SHIFT_CLK, addr);
                   1222:     }
                   1223:     for (i = 19; i > 0; i--) {
                   1224:        outb(0, addr);
                   1225:        retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
                   1226:        outb(MDIO_SHIFT_CLK, addr);
                   1227:     }
                   1228:     return (retval>>1) & 0xffff;
                   1229: }
                   1230: 
                   1231: static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
                   1232: {
                   1233:     ioaddr_t addr = dev->base_addr + MGMT;
                   1234:     u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
                   1235:     int i;
                   1236: 
                   1237:     mdio_sync(addr);
                   1238:     for (i = 31; i >= 0; i--) {
                   1239:        int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
                   1240:        outb(dat, addr);
                   1241:        outb(dat | MDIO_SHIFT_CLK, addr);
                   1242:     }
                   1243:     for (i = 1; i >= 0; i--) {
                   1244:        outb(0, addr);
                   1245:        outb(MDIO_SHIFT_CLK, addr);
                   1246:     }
                   1247: }
                   1248: 
                   1249: /*======================================================================
                   1250: 
                   1251:     The driver core code, most of which should be common with a
                   1252:     non-PCMCIA implementation.
                   1253: 
                   1254: ======================================================================*/
                   1255: 
                   1256: #ifdef PCMCIA_DEBUG
                   1257: static void smc_dump(struct net_device *dev)
                   1258: {
                   1259:     ioaddr_t ioaddr = dev->base_addr;
                   1260:     u_short i, w, save;
                   1261:     save = inw(ioaddr + BANK_SELECT);
                   1262:     for (w = 0; w < 4; w++) {
                   1263:        SMC_SELECT_BANK(w);
                   1264:        printk(KERN_DEBUG "bank %d: ", w);
                   1265:        for (i = 0; i < 14; i += 2)
                   1266:            printk(" %04x", inw(ioaddr + i));
                   1267:        printk("\n");
                   1268:     }
                   1269:     outw(save, ioaddr + BANK_SELECT);
                   1270: }
                   1271: #endif
                   1272: 
                   1273: static int smc_open(struct net_device *dev)
                   1274: {
                   1275:     struct smc_private *smc = dev->priv;
                   1276:     dev_link_t *link = &smc->link;
                   1277: 
                   1278: #ifdef PCMCIA_DEBUG
                   1279:     DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n",
                   1280:          dev->name, dev, inw(dev->base_addr + BANK_SELECT));
                   1281:     if (pc_debug > 1) smc_dump(dev);
                   1282: #endif
                   1283: 
                   1284:     /* Check that the PCMCIA card is still here. */
                   1285:     if (!DEV_OK(link))
                   1286:        return -ENODEV;
                   1287:     /* Physical device present signature. */
                   1288:     if (check_sig(link) < 0) {
                   1289:        printk("smc91c92_cs: Yikes!  Bad chip signature!\n");
                   1290:        return -ENODEV;
                   1291:     }
                   1292:     link->open++;
                   1293:     MOD_INC_USE_COUNT;
                   1294: 
                   1295:     netif_start_queue(dev);
                   1296:     netif_mark_up(dev);
                   1297:     smc->saved_skb = 0;
                   1298:     smc->packets_waiting = 0;
                   1299: 
                   1300:     smc_reset(dev);
                   1301:     smc->media.function = &media_check;
                   1302:     smc->media.data = (u_long)smc;
                   1303:     smc->media.expires = jiffies + HZ;
                   1304:     add_timer(&smc->media);
                   1305: 
                   1306:     return 0;
                   1307: } /* smc_open */
                   1308: 
                   1309: /*====================================================================*/
                   1310: 
                   1311: static int smc_close(struct net_device *dev)
                   1312: {
                   1313:     struct smc_private *smc = dev->priv;
                   1314:     dev_link_t *link = &smc->link;
                   1315:     ioaddr_t ioaddr = dev->base_addr;
                   1316: 
                   1317:     DEBUG(0, "%s: smc_close(), status %4.4x.\n",
                   1318:          dev->name, inw(ioaddr + BANK_SELECT));
                   1319: 
                   1320:     netif_stop_queue(dev);
                   1321:     netif_mark_down(dev);
                   1322: 
                   1323:     /* Shut off all interrupts, and turn off the Tx and Rx sections.
                   1324:        Don't bother to check for chip present. */
                   1325:     SMC_SELECT_BANK(2);        /* Nominally paranoia, but do no assume... */
                   1326:     outw(0, ioaddr + INTERRUPT);
                   1327:     SMC_SELECT_BANK(0);
                   1328:     mask_bits(0xff00, ioaddr + RCR);
                   1329:     mask_bits(0xff00, ioaddr + TCR);
                   1330: 
                   1331:     /* Put the chip into power-down mode. */
                   1332:     SMC_SELECT_BANK(1);
                   1333:     outw(CTL_POWERDOWN, ioaddr + CONTROL );
                   1334: 
                   1335:     link->open--;
                   1336:     del_timer(&smc->media);
                   1337:     if (link->state & DEV_STALE_CONFIG)
                   1338:        mod_timer(&link->release, jiffies + HZ/20);
                   1339: 
                   1340:     MOD_DEC_USE_COUNT;
                   1341: 
                   1342:     return 0;
                   1343: } /* smc_close */
                   1344: 
                   1345: static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                   1346: {
                   1347:     struct smc_private *smc = dev->priv;
                   1348:     u16 *data = (u16 *)&rq->ifr_data;
                   1349:     ushort saved_bank;
                   1350:     ioaddr_t ioaddr = dev->base_addr;
                   1351: 
                   1352:     if (!(smc->cfg & CFG_MII_SELECT))
                   1353:        return -EOPNOTSUPP;
                   1354: 
                   1355:     saved_bank = inw(ioaddr + BANK_SELECT);
                   1356:     SMC_SELECT_BANK(3);
                   1357: 
                   1358:     switch (cmd) {
                   1359:     case SIOCDEVPRIVATE:
                   1360:        data[0] = smc->phy_id;
                   1361:     case SIOCDEVPRIVATE+1:
                   1362:        data[3] = mdio_read(dev, data[0], data[1] & 0x1f);
                   1363:        SMC_SELECT_BANK(saved_bank);
                   1364:        return 0;
                   1365:     case SIOCDEVPRIVATE+2:
                   1366:        if (!capable(CAP_NET_ADMIN)) {
                   1367:            SMC_SELECT_BANK(saved_bank);
                   1368:            return -EPERM;
                   1369:        }
                   1370:        mdio_write(dev, data[0], data[1] & 0x1f, data[2]);
                   1371:        SMC_SELECT_BANK(saved_bank);
                   1372:        return 0;
                   1373:     }
                   1374:     SMC_SELECT_BANK(saved_bank);
                   1375:     return -EOPNOTSUPP;
                   1376: }
                   1377: /*======================================================================
                   1378: 
                   1379:    Transfer a packet to the hardware and trigger the packet send.
                   1380:    This may be called at either from either the Tx queue code
                   1381:    or the interrupt handler.
                   1382: 
                   1383: ======================================================================*/
                   1384: 
                   1385: static void smc_hardware_send_packet(struct net_device * dev)
                   1386: {
                   1387:     struct smc_private *smc = dev->priv;
                   1388:     struct sk_buff *skb = smc->saved_skb;
                   1389:     ioaddr_t ioaddr = dev->base_addr;
                   1390:     u_char packet_no;
                   1391: 
                   1392:     if (!skb) {
                   1393:        printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
                   1394:        return;
                   1395:     }
                   1396: 
                   1397:     /* There should be a packet slot waiting. */
                   1398:     packet_no = inw(ioaddr + PNR_ARR) >> 8;
                   1399:     if (packet_no & 0x80) {
                   1400:        /* If not, there is a hardware problem!  Likely an ejected card. */
                   1401:        printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
                   1402:               " failed, status %#2.2x.\n", dev->name, packet_no);
                   1403:        dev_kfree_skb_irq(skb);
                   1404:        smc->saved_skb = NULL;
                   1405:        netif_start_queue(dev);
                   1406:        return;
                   1407:     }
                   1408: 
                   1409:     add_tx_bytes(&smc->stats, skb->len);
                   1410:     /* The card should use the just-allocated buffer. */
                   1411:     outw(packet_no, ioaddr + PNR_ARR);
                   1412:     /* point to the beginning of the packet */
                   1413:     outw(PTR_AUTOINC , ioaddr + POINTER);
                   1414: 
                   1415:     /* Send the packet length (+6 for status, length and ctl byte)
                   1416:        and the status word (set to zeros). */
                   1417:     {
                   1418:        u_char *buf = skb->data;
                   1419:        u_int length = skb->len; /* The chip will pad to ethernet min. */
                   1420: 
                   1421:        DEBUG(2, "%s: Trying to xmit packet of length %d.\n",
                   1422:              dev->name, length);
                   1423:        
                   1424:        /* send the packet length: +6 for status word, length, and ctl */
                   1425:        outw(0, ioaddr + DATA_1);
                   1426:        outw(length + 6, ioaddr + DATA_1);
                   1427:        outsw(ioaddr + DATA_1, buf, length >> 1);
                   1428:        
                   1429:        /* The odd last byte, if there is one, goes in the control word. */
                   1430:        outw((length & 1) ? 0x2000 | buf[length-1] : 0, ioaddr + DATA_1);
                   1431:     }
                   1432: 
                   1433:     /* Enable the Tx interrupts, both Tx (TxErr) and TxEmpty. */
                   1434:     outw(((IM_TX_INT|IM_TX_EMPTY_INT)<<8) |
                   1435:         (inw(ioaddr + INTERRUPT) & 0xff00),
                   1436:         ioaddr + INTERRUPT);
                   1437: 
                   1438:     /* The chip does the rest of the work. */
                   1439:     outw(MC_ENQUEUE , ioaddr + MMU_CMD);
                   1440: 
                   1441:     smc->saved_skb = NULL;
                   1442:     dev_kfree_skb_irq(skb);
                   1443:     dev->trans_start = jiffies;
                   1444:     netif_start_queue(dev);
                   1445:     return;
                   1446: }
                   1447: 
                   1448: /*====================================================================*/
                   1449: 
                   1450: static void smc_tx_timeout(struct net_device *dev)
                   1451: {
                   1452:     struct smc_private *smc = dev->priv;
                   1453:     ioaddr_t ioaddr = dev->base_addr;
                   1454: 
                   1455:     printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
                   1456:           "Tx_status %2.2x status %4.4x.\n",
                   1457:           dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
                   1458:     smc->stats.tx_errors++;
                   1459:     smc_reset(dev);
                   1460:     dev->trans_start = jiffies;
                   1461:     smc->saved_skb = NULL;
                   1462:     netif_wake_queue(dev);
                   1463: }
                   1464: 
                   1465: static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev)
                   1466: {
                   1467:     struct smc_private *smc = dev->priv;
                   1468:     ioaddr_t ioaddr = dev->base_addr;
                   1469:     u_short num_pages;
                   1470:     short time_out, ir;
                   1471: 
                   1472:     tx_timeout_check(dev, smc_tx_timeout);
                   1473:     skb_tx_check(dev, skb);
                   1474: 
                   1475:     DEBUG(2, "%s: smc_start_xmit(length = %ld) called,"
                   1476:          " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
                   1477: 
                   1478:     if (smc->saved_skb) {
                   1479:        /* THIS SHOULD NEVER HAPPEN. */
                   1480:        smc->stats.tx_aborted_errors++;
                   1481:        printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
                   1482:               dev->name);
                   1483:        return 1;
                   1484:     }
                   1485:     smc->saved_skb = skb;
                   1486: 
                   1487:     num_pages = skb->len >> 8;
                   1488: 
                   1489:     if (num_pages > 7) {
                   1490:        printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
                   1491:        DEV_KFREE_SKB (skb);
                   1492:        smc->saved_skb = NULL;
                   1493:        smc->stats.tx_dropped++;
                   1494:        return 0;               /* Do not re-queue this packet. */
                   1495:     }
                   1496:     /* A packet is now waiting. */
                   1497:     smc->packets_waiting++;
                   1498: 
                   1499:     SMC_SELECT_BANK(2);        /* Paranoia, we should always be in window 2 */
                   1500: 
                   1501:     /* need MC_RESET to keep the memory consistent. errata? */
                   1502:     if (smc->rx_ovrn) {
                   1503:        outw(MC_RESET, ioaddr + MMU_CMD);
                   1504:        smc->rx_ovrn = 0;
                   1505:     }
                   1506: 
                   1507:     /* Allocate the memory; send the packet now if we win. */
                   1508:     outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);
                   1509:     for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {
                   1510:        ir = inw(ioaddr+INTERRUPT);
                   1511:        if (ir & IM_ALLOC_INT) {
                   1512:            /* Acknowledge the interrupt, send the packet. */
                   1513:            outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);
                   1514:            smc_hardware_send_packet(dev);      /* Send the packet now.. */
                   1515:            return 0;
                   1516:        }
                   1517:     }
                   1518: 
                   1519:     /* Otherwise defer until the Tx-space-allocated interrupt. */
                   1520:     DEBUG(2, "%s: memory allocation deferred.\n", dev->name);
                   1521:     outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);
                   1522: 
                   1523:     return 0;
                   1524: }
                   1525: 
                   1526: /*======================================================================
                   1527: 
                   1528:     Handle a Tx anomolous event.  Entered while in Window 2.
                   1529: 
                   1530: ======================================================================*/
                   1531: 
                   1532: static void smc_tx_err(struct net_device * dev)
                   1533: {
                   1534:     struct smc_private *smc = (struct smc_private *)dev->priv;
                   1535:     ioaddr_t ioaddr = dev->base_addr;
                   1536:     int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;
                   1537:     int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;
                   1538:     int tx_status;
                   1539: 
                   1540:     /* select this as the packet to read from */
                   1541:     outw(packet_no, ioaddr + PNR_ARR);
                   1542: 
                   1543:     /* read the first word from this packet */
                   1544:     outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);
                   1545: 
                   1546:     tx_status = inw(ioaddr + DATA_1);
                   1547: 
                   1548:     smc->stats.tx_errors++;
                   1549:     if (tx_status & TS_LOSTCAR) smc->stats.tx_carrier_errors++;
                   1550:     if (tx_status & TS_LATCOL)  smc->stats.tx_window_errors++;
                   1551:     if (tx_status & TS_16COL) {
                   1552:        smc->stats.tx_aborted_errors++;
                   1553:        smc->tx_err++;
                   1554:     }
                   1555: 
                   1556:     if (tx_status & TS_SUCCESS) {
                   1557:        printk(KERN_NOTICE "%s: Successful packet caused error "
                   1558:               "interrupt?\n", dev->name);
                   1559:     }
                   1560:     /* re-enable transmit */
                   1561:     SMC_SELECT_BANK(0);
                   1562:     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
                   1563:     SMC_SELECT_BANK(2);
                   1564: 
                   1565:     outw(MC_FREEPKT, ioaddr + MMU_CMD);        /* Free the packet memory. */
                   1566: 
                   1567:     /* one less packet waiting for me */
                   1568:     smc->packets_waiting--;
                   1569: 
                   1570:     outw(saved_packet, ioaddr + PNR_ARR);
                   1571:     return;
                   1572: }
                   1573: 
                   1574: /*====================================================================*/
                   1575: 
                   1576: static void smc_eph_irq(struct net_device *dev)
                   1577: {
                   1578:     struct smc_private *smc = dev->priv;
                   1579:     ioaddr_t ioaddr = dev->base_addr;
                   1580:     u_short card_stats, ephs;
                   1581: 
                   1582:     SMC_SELECT_BANK(0);
                   1583:     ephs = inw(ioaddr + EPH);
                   1584:     DEBUG(2, "%s: Ethernet protocol handler interrupt, status"
                   1585:          " %4.4x.\n", dev->name, ephs);
                   1586:     /* Could be a counter roll-over warning: update stats. */
                   1587:     card_stats = inw(ioaddr + COUNTER);
                   1588:     /* single collisions */
                   1589:     smc->stats.collisions += card_stats & 0xF;
                   1590:     card_stats >>= 4;
                   1591:     /* multiple collisions */
                   1592:     smc->stats.collisions += card_stats & 0xF;
                   1593: #if 0          /* These are for when linux supports these statistics */
                   1594:     card_stats >>= 4;                  /* deferred */
                   1595:     card_stats >>= 4;                  /* excess deferred */
                   1596: #endif
                   1597:     /* If we had a transmit error we must re-enable the transmitter. */
                   1598:     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
                   1599: 
                   1600:     /* Clear a link error interrupt. */
                   1601:     SMC_SELECT_BANK(1);
                   1602:     outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);
                   1603:     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
                   1604:         ioaddr + CONTROL);
                   1605:     SMC_SELECT_BANK(2);
                   1606: }
                   1607: 
                   1608: /*====================================================================*/
                   1609: 
                   1610: static void smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                   1611: {
                   1612:     struct smc_private *smc = dev_id;
                   1613:     struct net_device *dev = &smc->dev;
                   1614:     ioaddr_t ioaddr;
                   1615:     u_short saved_bank, saved_pointer, mask, status;
                   1616:     char bogus_cnt = INTR_WORK;                /* Work we are willing to do. */
                   1617: 
                   1618:     if (!netif_device_present(dev))
                   1619:        return;
                   1620:     ioaddr = dev->base_addr;
                   1621: 
                   1622:     DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
                   1623:          irq, ioaddr);
                   1624: 
                   1625:     smc->watchdog = 0;
                   1626:     saved_bank = inw(ioaddr + BANK_SELECT);
                   1627:     if ((saved_bank & 0xff00) != 0x3300) {
                   1628:        /* The device does not exist -- the card could be off-line, or
                   1629:           maybe it has been ejected. */
                   1630:        DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
                   1631:              "/ejected device.\n", dev->name, irq);
                   1632:        goto irq_done;
                   1633:     }
                   1634: 
                   1635:     SMC_SELECT_BANK(2);
                   1636:     saved_pointer = inw(ioaddr + POINTER);
                   1637:     mask = inw(ioaddr + INTERRUPT) >> 8;
                   1638:     /* clear all interrupts */
                   1639:     outw(0, ioaddr + INTERRUPT);
                   1640: 
                   1641:     do { /* read the status flag, and mask it */
                   1642:        status = inw(ioaddr + INTERRUPT) & 0xff;
                   1643:        DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
                   1644:              status, mask);
                   1645:        if ((status & mask) == 0)
                   1646:            break;
                   1647:        
                   1648:        if (status & IM_RCV_INT) {
                   1649:            /* Got a packet(s). */
                   1650:            smc_rx(dev);
                   1651:        }
                   1652:        if (status & IM_TX_INT) {
                   1653:            smc_tx_err(dev);
                   1654:            outw(IM_TX_INT, ioaddr + INTERRUPT);
                   1655:        }
                   1656:        status &= mask;
                   1657:        if (status & IM_TX_EMPTY_INT) {
                   1658:            outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);
                   1659:            mask &= ~IM_TX_EMPTY_INT;
                   1660:            smc->stats.tx_packets += smc->packets_waiting;
                   1661:            smc->packets_waiting = 0;
                   1662:        }
                   1663:        if (status & IM_ALLOC_INT) {
                   1664:            /* Clear this interrupt so it doesn't happen again */
                   1665:            mask &= ~IM_ALLOC_INT;
                   1666:        
                   1667:            smc_hardware_send_packet(dev);
                   1668:        
                   1669:            /* enable xmit interrupts based on this */
                   1670:            mask |= (IM_TX_EMPTY_INT | IM_TX_INT);
                   1671:        
                   1672:            /* and let the card send more packets to me */
                   1673:            netif_wake_queue(dev);
                   1674:        }
                   1675:        if (status & IM_RX_OVRN_INT) {
                   1676:            smc->stats.rx_errors++;
                   1677:            smc->stats.rx_fifo_errors++;
                   1678:            if (smc->duplex)
                   1679:                smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */
                   1680:            outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);
                   1681:        }
                   1682:        if (status & IM_EPH_INT)
                   1683:            smc_eph_irq(dev);
                   1684:     } while (--bogus_cnt);
                   1685: 
                   1686:     DEBUG(3, "  Restoring saved registers mask %2.2x bank %4.4x"
                   1687:          " pointer %4.4x.\n", mask, saved_bank, saved_pointer);
                   1688: 
                   1689:     /* restore state register */
                   1690:     outw((mask<<8), ioaddr + INTERRUPT);
                   1691:     outw(saved_pointer, ioaddr + POINTER);
                   1692:     SMC_SELECT_BANK(saved_bank);
                   1693: 
                   1694:     DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);
                   1695: 
                   1696: irq_done:
                   1697: 
                   1698:     if ((smc->manfid == MANFID_OSITECH) &&
                   1699:        (smc->cardid != PRODID_OSITECH_SEVEN)) {
                   1700:        /* Retrigger interrupt if needed */
                   1701:        mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);
                   1702:        set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);
                   1703:     }
                   1704:     if (smc->manfid == MANFID_MOTOROLA) {
                   1705:        u_char cor;
                   1706:        cor = readb(smc->base + MOT_UART + CISREG_COR);
                   1707:        writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);
                   1708:        writeb(cor, smc->base + MOT_UART + CISREG_COR);
                   1709:        cor = readb(smc->base + MOT_LAN + CISREG_COR);
                   1710:        writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);
                   1711:        writeb(cor, smc->base + MOT_LAN + CISREG_COR);
                   1712:     }
                   1713: #ifdef DOES_NOT_WORK
                   1714:     if (smc->base != NULL) { /* Megahertz MFC's */
                   1715:        readb(smc->base+MEGAHERTZ_ISR);
                   1716:        readb(smc->base+MEGAHERTZ_ISR);
                   1717:     }
                   1718: #endif
                   1719: }
                   1720: 
                   1721: /*====================================================================*/
                   1722: 
                   1723: static void smc_rx(struct net_device *dev)
                   1724: {
                   1725:     struct smc_private *smc = (struct smc_private *)dev->priv;
                   1726:     ioaddr_t ioaddr = dev->base_addr;
                   1727:     int rx_status;
                   1728:     int packet_length; /* Caution: not frame length, rather words
                   1729:                           to transfer from the chip. */
                   1730: 
                   1731:     /* Assertion: we are in Window 2. */
                   1732: 
                   1733:     if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
                   1734:        printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
                   1735:               dev->name);
                   1736:        return;
                   1737:     }
                   1738: 
                   1739:     /*  Reset the read pointer, and read the status and packet length. */
                   1740:     outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);
                   1741:     rx_status = inw(ioaddr + DATA_1);
                   1742:     packet_length = inw(ioaddr + DATA_1) & 0x07ff;
                   1743: 
                   1744:     DEBUG(2, "%s: Receive status %4.4x length %d.\n",
                   1745:          dev->name, rx_status, packet_length);
                   1746: 
                   1747:     if (!(rx_status & RS_ERRORS)) {            
                   1748:        /* do stuff to make a new packet */
                   1749:        struct sk_buff *skb;
                   1750:        
                   1751:        /* Note: packet_length adds 5 or 6 extra bytes here! */
                   1752:        skb = dev_alloc_skb(packet_length+2);
                   1753:        
                   1754:        if (skb == NULL) {
                   1755:            DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);
                   1756:            smc->stats.rx_dropped++;
                   1757:            outw(MC_RELEASE, ioaddr + MMU_CMD);
                   1758:            return;
                   1759:        }
                   1760:        
                   1761:        packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);
                   1762:        skb_reserve(skb, 2);
                   1763:        insw(ioaddr+DATA_1, skb_put(skb, packet_length),
                   1764:             (packet_length+1)>>1);
                   1765:        skb->protocol = eth_type_trans(skb, dev);
                   1766:        
                   1767:        skb->dev = dev;
                   1768:        netif_rx(skb);
                   1769:        dev->last_rx = jiffies;
                   1770:        smc->stats.rx_packets++;
                   1771:        add_rx_bytes(&smc->stats, packet_length);
                   1772:        if (rx_status & RS_MULTICAST)
                   1773:            smc->stats.multicast++;
                   1774:     } else {
                   1775:        /* error ... */
                   1776:        smc->stats.rx_errors++;
                   1777:        
                   1778:        if (rx_status & RS_ALGNERR)  smc->stats.rx_frame_errors++;
                   1779:        if (rx_status & (RS_TOOSHORT | RS_TOOLONG))
                   1780:            smc->stats.rx_length_errors++;
                   1781:        if (rx_status & RS_BADCRC)      smc->stats.rx_crc_errors++;
                   1782:     }
                   1783:     /* Let the MMU free the memory of this packet. */
                   1784:     outw(MC_RELEASE, ioaddr + MMU_CMD);
                   1785: 
                   1786:     return;
                   1787: }
                   1788: 
                   1789: /*====================================================================*/
                   1790: 
                   1791: static struct net_device_stats *smc_get_stats(struct net_device *dev)
                   1792: {
                   1793:     struct smc_private *smc = (struct smc_private *)dev->priv;
                   1794:     /* Nothing to update - the 91c92 is a pretty primative chip. */
                   1795:     return &smc->stats;
                   1796: }
                   1797: 
                   1798: /*======================================================================
                   1799: 
                   1800:     Calculate values for the hardware multicast filter hash table.
                   1801: 
                   1802: ======================================================================*/
                   1803: 
                   1804: static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
                   1805:                               u_char *multicast_table)
                   1806: {
                   1807:     struct dev_mc_list *mc_addr;
                   1808: 
                   1809:     for (mc_addr = addrs;  mc_addr && --count > 0;  mc_addr = mc_addr->next) {
                   1810:        u_int position = ether_crc(6, mc_addr->dmi_addr);
                   1811: #ifndef final_version          /* Verify multicast address. */
                   1812:        if ((mc_addr->dmi_addr[0] & 1) == 0)
                   1813:            continue;
                   1814: #endif
                   1815:        multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
                   1816:     }
                   1817: }
                   1818: 
                   1819: /*======================================================================
                   1820: 
                   1821:     Set the receive mode.
                   1822: 
                   1823:     This routine is used by both the protocol level to notify us of
                   1824:     promiscuous/multicast mode changes, and by the open/reset code to
                   1825:     initialize the Rx registers.  We always set the multicast list and
                   1826:     leave the receiver running.
                   1827: 
                   1828: ======================================================================*/
                   1829: 
                   1830: static void set_rx_mode(struct net_device *dev)
                   1831: {
                   1832:     ioaddr_t ioaddr = dev->base_addr;
                   1833:     u_int multicast_table[ 2 ] = { 0, };
                   1834:     unsigned long flags;
                   1835:     u_short rx_cfg_setting;
                   1836: 
                   1837:     if (dev->flags & IFF_PROMISC) {
                   1838:        printk(KERN_NOTICE "%s: setting Rx mode to promiscuous.\n", dev->name);
                   1839:        rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;
                   1840:     } else if (dev->flags & IFF_ALLMULTI)
                   1841:        rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
                   1842:     else {
                   1843:        if (dev->mc_count)  {
                   1844:            fill_multicast_tbl(dev->mc_count, dev->mc_list,
                   1845:                               (u_char *)multicast_table);
                   1846:        }
                   1847:        rx_cfg_setting = RxStripCRC | RxEnable;
                   1848:     }
                   1849: 
                   1850:     /* Load MC table and Rx setting into the chip without interrupts. */
                   1851:     save_flags(flags);
                   1852:     cli();
                   1853:     SMC_SELECT_BANK(3);
                   1854:     outl(multicast_table[0], ioaddr + MULTICAST0);
                   1855:     outl(multicast_table[1], ioaddr + MULTICAST4);
                   1856:     SMC_SELECT_BANK(0);
                   1857:     outw(rx_cfg_setting, ioaddr + RCR);
                   1858:     SMC_SELECT_BANK(2);
                   1859:     restore_flags(flags);
                   1860: 
                   1861:     return;
                   1862: }
                   1863: 
                   1864: /*======================================================================
                   1865: 
                   1866:     Senses when a card's config changes. Here, it's coax or TP.
                   1867: 
                   1868: ======================================================================*/
                   1869: 
                   1870: static int s9k_config(struct net_device *dev, struct ifmap *map)
                   1871: {
                   1872:     struct smc_private *smc = dev->priv;
                   1873:     if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
                   1874:        if (smc->cfg & CFG_MII_SELECT)
                   1875:            return -EOPNOTSUPP;
                   1876:        else if (map->port > 2)
                   1877:            return -EINVAL;
                   1878:        dev->if_port = map->port;
                   1879:        printk(KERN_INFO "%s: switched to %s port\n",
                   1880:               dev->name, if_names[dev->if_port]);
                   1881:        smc_reset(dev);
                   1882:     }
                   1883:     return 0;
                   1884: }
                   1885: 
                   1886: /*======================================================================
                   1887: 
                   1888:     Reset the chip, reloading every register that might be corrupted.
                   1889: 
                   1890: ======================================================================*/
                   1891: 
                   1892: /*
                   1893:   Set transceiver type, perhaps to something other than what the user
                   1894:   specified in dev->if_port.
                   1895: */
                   1896: static void smc_set_xcvr(struct net_device *dev, int if_port)
                   1897: {
                   1898:     struct smc_private *smc = (struct smc_private *)dev->priv;
                   1899:     ioaddr_t ioaddr = dev->base_addr;
                   1900:     u_short saved_bank;
                   1901: 
                   1902:     saved_bank = inw(ioaddr + BANK_SELECT);
                   1903:     SMC_SELECT_BANK(1);
                   1904:     if (if_port == 2) {
                   1905:        outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG);
                   1906:        if ((smc->manfid == MANFID_OSITECH) &&
                   1907:            (smc->cardid != PRODID_OSITECH_SEVEN))
                   1908:            set_bits(OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
                   1909:        smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002);
                   1910:     } else {
                   1911:        outw(smc->cfg, ioaddr + CONFIG);
                   1912:        if ((smc->manfid == MANFID_OSITECH) &&
                   1913:            (smc->cardid != PRODID_OSITECH_SEVEN))
                   1914:            mask_bits(~OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
                   1915:        smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001);
                   1916:     }
                   1917:     SMC_SELECT_BANK(saved_bank);
                   1918: }
                   1919: 
                   1920: static void smc_reset(struct net_device *dev)
                   1921: {
                   1922:     ioaddr_t ioaddr = dev->base_addr;
                   1923:     struct smc_private *smc = dev->priv;
                   1924:     int i;
                   1925: 
                   1926:     DEBUG(0, "%s: smc91c92 reset called.\n", dev->name);
                   1927: 
                   1928:     /* The first interaction must be a write to bring the chip out
                   1929:        of sleep mode. */
                   1930:     SMC_SELECT_BANK(0);
                   1931:     /* Reset the chip. */
                   1932:     outw(RCR_SOFTRESET, ioaddr + RCR);
                   1933:     udelay(10);
                   1934: 
                   1935:     /* Clear the transmit and receive configuration registers. */
                   1936:     outw(RCR_CLEAR, ioaddr + RCR);
                   1937:     outw(TCR_CLEAR, ioaddr + TCR);
                   1938: 
                   1939:     /* Set the Window 1 control, configuration and station addr registers.
                   1940:        No point in writing the I/O base register ;-> */
                   1941:     SMC_SELECT_BANK(1);
                   1942:     /* Automatically release succesfully transmitted packets,
                   1943:        Accept link errors, counter and Tx error interrupts. */
                   1944:     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
                   1945:         ioaddr + CONTROL);
                   1946:     smc_set_xcvr(dev, dev->if_port);
                   1947:     if ((smc->manfid == MANFID_OSITECH) &&
                   1948:        (smc->cardid != PRODID_OSITECH_SEVEN))
                   1949:        outw((dev->if_port == 2 ? OSI_AUI_PWR : 0) |
                   1950:             (inw(ioaddr-0x10+OSITECH_AUI_PWR) & 0xff00),
                   1951:             ioaddr - 0x10 + OSITECH_AUI_PWR);
                   1952: 
                   1953:     /* Fill in the physical address.  The databook is wrong about the order! */
                   1954:     for (i = 0; i < 6; i += 2)
                   1955:        outw((dev->dev_addr[i+1]<<8)+dev->dev_addr[i],
                   1956:             ioaddr + ADDR0 + i);
                   1957: 
                   1958:     /* Reset the MMU */
                   1959:     SMC_SELECT_BANK(2);
                   1960:     outw(MC_RESET, ioaddr + MMU_CMD);
                   1961:     outw(0, ioaddr + INTERRUPT);
                   1962: 
                   1963:     /* Re-enable the chip. */
                   1964:     SMC_SELECT_BANK(0);
                   1965:     outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) |
                   1966:         TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR);
                   1967:     set_rx_mode(dev);
                   1968: 
                   1969:     if (smc->cfg & CFG_MII_SELECT) {
                   1970:        SMC_SELECT_BANK(3);
                   1971: 
                   1972:        /* Reset MII */
                   1973:        mdio_write(dev, smc->phy_id, 0, 0x8000);
                   1974: 
                   1975:        /* Advertise 100F, 100H, 10F, 10H */
                   1976:        mdio_write(dev, smc->phy_id, 4, 0x01e1);
                   1977: 
                   1978:        /* Restart MII autonegotiation */
                   1979:        mdio_write(dev, smc->phy_id, 0, 0x0000);
                   1980:        mdio_write(dev, smc->phy_id, 0, 0x1200);
                   1981:     }
                   1982: 
                   1983:     /* Enable interrupts. */
                   1984:     SMC_SELECT_BANK(2);
                   1985:     outw((IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT) << 8,
                   1986:         ioaddr + INTERRUPT);
                   1987: }
                   1988: 
                   1989: /*======================================================================
                   1990: 
                   1991:     Media selection timer routine
                   1992: 
                   1993: ======================================================================*/
                   1994: 
                   1995: static void media_check(u_long arg)
                   1996: {
                   1997:     struct smc_private *smc = (struct smc_private *)(arg);
                   1998:     struct net_device *dev = &smc->dev;
                   1999:     ioaddr_t ioaddr = dev->base_addr;
                   2000:     u_short i, media, saved_bank;
                   2001:     u_short link;
                   2002: 
                   2003:     saved_bank = inw(ioaddr + BANK_SELECT);
                   2004: 
                   2005:     if (!netif_device_present(dev))
                   2006:        goto reschedule;
                   2007: 
                   2008:     SMC_SELECT_BANK(2);
                   2009: 
                   2010:     /* need MC_RESET to keep the memory consistent. errata? */
                   2011:     if (smc->rx_ovrn) {
                   2012:        outw(MC_RESET, ioaddr + MMU_CMD);
                   2013:        smc->rx_ovrn = 0;
                   2014:     }
                   2015:     i = inw(ioaddr + INTERRUPT);
                   2016:     SMC_SELECT_BANK(0);
                   2017:     media = inw(ioaddr + EPH) & EPH_LINK_OK;
                   2018:     SMC_SELECT_BANK(1);
                   2019:     media |= (inw(ioaddr + CONFIG) & CFG_AUI_SELECT) ? 2 : 1;
                   2020: 
                   2021:     /* Check for pending interrupt with watchdog flag set: with
                   2022:        this, we can limp along even if the interrupt is blocked */
                   2023:     if (smc->watchdog++ && ((i>>8) & i)) {
                   2024:        if (!smc->fast_poll)
                   2025:            printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
                   2026:        smc_interrupt(dev->irq, smc, NULL);
                   2027:        smc->fast_poll = HZ;
                   2028:     }
                   2029:     if (smc->fast_poll) {
                   2030:        smc->fast_poll--;
                   2031:        smc->media.expires = jiffies + 1;
                   2032:        add_timer(&smc->media);
                   2033:        SMC_SELECT_BANK(saved_bank);
                   2034:        return;
                   2035:     }
                   2036: 
                   2037:     if (smc->cfg & CFG_MII_SELECT) {
                   2038:        if (smc->phy_id < 0)
                   2039:            goto reschedule;
                   2040: 
                   2041:        SMC_SELECT_BANK(3);
                   2042:        link = mdio_read(dev, smc->phy_id, 1);
                   2043:        if (!link || (link == 0xffff)) {
                   2044:            printk(KERN_INFO "%s: MII is missing!\n", dev->name);
                   2045:            smc->phy_id = -1;
                   2046:            goto reschedule;
                   2047:        }
                   2048: 
                   2049:        link &= 0x0004;
                   2050:        if (link != smc->link_status) {
                   2051:            u_short p = mdio_read(dev, smc->phy_id, 5);
                   2052:            printk(KERN_INFO "%s: %s link beat\n", dev->name,
                   2053:                (link) ? "found" : "lost");
                   2054:            smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
                   2055:                           ? TCR_FDUPLX : 0);
                   2056:            if (link) {
                   2057:                printk(KERN_INFO "%s: autonegotiation complete: "
                   2058:                       "%sbaseT-%cD selected\n", dev->name,
                   2059:                       ((p & 0x0180) ? "100" : "10"),
                   2060:                       (smc->duplex ? 'F' : 'H'));
                   2061:            }
                   2062:            SMC_SELECT_BANK(0);
                   2063:            outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
                   2064:            smc->link_status = link;
                   2065:        }
                   2066:        goto reschedule;
                   2067:     }
                   2068: 
                   2069:     /* Ignore collisions unless we've had no rx's recently */
                   2070:     if (jiffies - dev->last_rx > HZ) {
                   2071:        if (smc->tx_err || (smc->media_status & EPH_16COL))
                   2072:            media |= EPH_16COL;
                   2073:     }
                   2074:     smc->tx_err = 0;
                   2075: 
                   2076:     if (media != smc->media_status) {
                   2077:        if ((media & smc->media_status & 1) &&
                   2078:            ((smc->media_status ^ media) & EPH_LINK_OK))
                   2079:            printk(KERN_INFO "%s: %s link beat\n", dev->name,
                   2080:                   (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
                   2081:        else if ((media & smc->media_status & 2) &&
                   2082:                 ((smc->media_status ^ media) & EPH_16COL))
                   2083:            printk(KERN_INFO "%s: coax cable %s\n", dev->name,
                   2084:                   (media & EPH_16COL ? "problem" : "ok"));
                   2085:        if (dev->if_port == 0) {
                   2086:            if (media & 1) {
                   2087:                if (media & EPH_LINK_OK)
                   2088:                    printk(KERN_INFO "%s: flipped to 10baseT\n",
                   2089:                           dev->name);
                   2090:                else
                   2091:                    smc_set_xcvr(dev, 2);
                   2092:            } else {
                   2093:                if (media & EPH_16COL)
                   2094:                    smc_set_xcvr(dev, 1);
                   2095:                else
                   2096:                    printk(KERN_INFO "%s: flipped to 10base2\n",
                   2097:                           dev->name);
                   2098:            }
                   2099:        }
                   2100:        smc->media_status = media;
                   2101:     }
                   2102: 
                   2103: reschedule:
                   2104:     smc->media.expires = jiffies + HZ;
                   2105:     add_timer(&smc->media);
                   2106:     SMC_SELECT_BANK(saved_bank);
                   2107: }
                   2108: 
                   2109: 
                   2110: /*====================================================================*/
                   2111: 
                   2112: static int __init init_smc91c92_cs(void)
                   2113: {
                   2114:     servinfo_t serv;
                   2115:     DEBUG(0, "%s\n", version);
                   2116:     CardServices(GetCardServicesInfo, &serv);
                   2117:     if (serv.Revision != CS_RELEASE_CODE) {
                   2118:        printk(KERN_ERR
                   2119:               "smc91c92_cs: Card Services release does not match!\n");
                   2120:        return -EINVAL;
                   2121:     }
                   2122:     register_pccard_driver(&dev_info, &smc91c92_attach, &smc91c92_detach);
                   2123:     return 0;
                   2124: }
                   2125: 
                   2126: static void __exit exit_smc91c92_cs(void)
                   2127: {
                   2128:     DEBUG(0, "smc91c92_cs: unloading\n");
                   2129:     unregister_pccard_driver(&dev_info);
                   2130:     while (dev_list != NULL)
                   2131:        smc91c92_detach(dev_list);
                   2132: }
                   2133: 
                   2134: module_init(init_smc91c92_cs);
                   2135: module_exit(exit_smc91c92_cs);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.