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

1.1       root        1: /* [xirc2ps_cs.c wk 03.11.99] (1.40 1999/11/18 00:06:03)
                      2:  * Xircom CreditCard Ethernet Adapter IIps driver
                      3:  * Xircom Realport 10/100 (RE-100) driver 
                      4:  *
                      5:  * This driver supports various Xircom CreditCard Ethernet adapters
                      6:  * including the CE2, CE IIps, RE-10, CEM28, CEM33, CE33, CEM56,
                      7:  * CE3-100, CE3B, RE-100, REM10BT, and REM56G-100.
                      8:  *
                      9:  * 2000-09-24 <[email protected]> The Xircom CE3B-100 may not
                     10:  * autodetect the media properly. In this case use the
                     11:  * if_port=1 (for 10BaseT) or if_port=4 (for 100BaseT) options
                     12:  * to force the media type.
                     13:  * 
                     14:  * Written originally by Werner Koch based on David Hinds' skeleton of the
                     15:  * PCMCIA driver.
                     16:  *
                     17:  * Copyright (c) 1997,1998 Werner Koch (dd9jn)
                     18:  *
                     19:  * This driver is free software; you can redistribute it and/or modify
                     20:  * it under the terms of the GNU General Public License as published by
                     21:  * the Free Software Foundation; either version 2 of the License, or
                     22:  * (at your option) any later version.
                     23:  *
                     24:  * It is distributed in the hope that it will be useful,
                     25:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     26:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     27:  * GNU General Public License for more details.
                     28:  *
                     29:  * You should have received a copy of the GNU General Public License
                     30:  * along with this program; if not, write to the Free Software
                     31:  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
                     32:  *
                     33:  *
                     34:  * ALTERNATIVELY, this driver may be distributed under the terms of
                     35:  * the following license, in which case the provisions of this license
                     36:  * are required INSTEAD OF the GNU General Public License.  (This clause
                     37:  * is necessary due to a potential bad interaction between the GPL and
                     38:  * the restrictions contained in a BSD-style copyright.)
                     39:  *
                     40:  * Redistribution and use in source and binary forms, with or without
                     41:  * modification, are permitted provided that the following conditions
                     42:  * are met:
                     43:  * 1. Redistributions of source code must retain the above copyright
                     44:  *    notice, and the entire permission notice in its entirety,
                     45:  *    including the disclaimer of warranties.
                     46:  * 2. Redistributions in binary form must reproduce the above copyright
                     47:  *    notice, this list of conditions and the following disclaimer in the
                     48:  *    documentation and/or other materials provided with the distribution.
                     49:  * 3. The name of the author may not be used to endorse or promote
                     50:  *    products derived from this software without specific prior
                     51:  *    written permission.
                     52:  *
                     53:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
                     54:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     55:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     56:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     57:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     58:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     59:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     60:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     61:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     62:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
                     63:  * OF THE POSSIBILITY OF SUCH DAMAGE.
                     64:  */
                     65: 
                     66: #include <linux/module.h>
                     67: #include <linux/kernel.h>
                     68: #include <linux/init.h>
                     69: #include <linux/sched.h>
                     70: #include <linux/ptrace.h>
                     71: #include <linux/slab.h>
                     72: #include <linux/string.h>
                     73: #include <linux/timer.h>
                     74: #include <linux/interrupt.h>
                     75: #include <linux/in.h>
                     76: #include <linux/delay.h>
                     77: #include <asm/io.h>
                     78: #include <asm/system.h>
                     79: #include <asm/bitops.h>
                     80: 
                     81: #include <linux/netdevice.h>
                     82: #include <linux/etherdevice.h>
                     83: #include <linux/skbuff.h>
                     84: #include <linux/if_arp.h>
                     85: #include <linux/ioport.h>
                     86: 
                     87: #include <pcmcia/version.h>
                     88: #include <pcmcia/cs_types.h>
                     89: #include <pcmcia/cs.h>
                     90: #include <pcmcia/cistpl.h>
                     91: #include <pcmcia/cisreg.h>
                     92: #include <pcmcia/ciscode.h>
                     93: 
                     94: #ifndef MANFID_COMPAQ
                     95:   #define MANFID_COMPAQ           0x0138
                     96:   #define MANFID_COMPAQ2          0x0183  /* is this correct? */
                     97: #endif
                     98: 
                     99: #include <pcmcia/ds.h>
                    100: 
                    101: /* Time in jiffies before concluding Tx hung */
                    102: #define TX_TIMEOUT     ((400*HZ)/1000)
                    103: 
                    104: /****************
                    105:  * Some constants used to access the hardware
                    106:  */
                    107: 
                    108: /* Register offsets and value constans */
                    109: #define XIRCREG_CR  0  /* Command register (wr) */
                    110: enum xirc_cr {
                    111:     TransmitPacket = 0x01,
                    112:     SoftReset = 0x02,
                    113:     EnableIntr = 0x04,
                    114:     ForceIntr  = 0x08,
                    115:     ClearTxFIFO = 0x10,
                    116:     ClearRxOvrun = 0x20,
                    117:     RestartTx   = 0x40
                    118: };
                    119: #define XIRCREG_ESR 0  /* Ethernet status register (rd) */
                    120: enum xirc_esr {
                    121:     FullPktRcvd = 0x01, /* full packet in receive buffer */
                    122:     PktRejected = 0x04, /* a packet has been rejected */
                    123:     TxPktPend = 0x08,  /* TX Packet Pending */
                    124:     IncorPolarity = 0x10,
                    125:     MediaSelect = 0x20 /* set if TP, clear if AUI */
                    126: };
                    127: #define XIRCREG_PR  1  /* Page Register select */
                    128: #define XIRCREG_EDP 4  /* Ethernet Data Port Register */
                    129: #define XIRCREG_ISR 6  /* Ethernet Interrupt Status Register */
                    130: enum xirc_isr {
                    131:     TxBufOvr = 0x01,   /* TX Buffer Overflow */
                    132:     PktTxed  = 0x02,   /* Packet Transmitted */
                    133:     MACIntr  = 0x04,   /* MAC Interrupt occurred */
                    134:     TxResGrant = 0x08, /* Tx Reservation Granted */
                    135:     RxFullPkt = 0x20,  /* Rx Full Packet */
                    136:     RxPktRej  = 0x40,  /* Rx Packet Rejected */
                    137:     ForcedIntr= 0x80   /* Forced Interrupt */
                    138: };
                    139: #define XIRCREG1_IMR0 12 /* Ethernet Interrupt Mask Register (on page 1)*/
                    140: #define XIRCREG1_IMR1 13
                    141: #define XIRCREG0_TSO  8  /* Transmit Space Open Register (on page 0)*/
                    142: #define XIRCREG0_TRS  10 /* Transmit reservation Size Register (page 0)*/
                    143: #define XIRCREG0_DO   12 /* Data Offset Register (page 0) (wr) */
                    144: #define XIRCREG0_RSR  12 /* Receive Status Register (page 0) (rd) */
                    145: enum xirc_rsr {
                    146:     PhyPkt = 0x01,     /* set:physical packet, clear: multicast packet */
                    147:     BrdcstPkt = 0x02,  /* set if it is a broadcast packet */
                    148:     PktTooLong = 0x04, /* set if packet length > 1518 */
                    149:     AlignErr = 0x10,   /* incorrect CRC and last octet not complete */
                    150:     CRCErr = 0x20,     /* incorrect CRC and last octet is complete */
                    151:     PktRxOk = 0x80     /* received ok */
                    152: };
                    153: #define XIRCREG0_PTR 13 /* packets transmitted register (rd) */
                    154: #define XIRCREG0_RBC 14 /* receive byte count regsister (rd) */
                    155: #define XIRCREG1_ECR 14 /* ethernet configurationn register */
                    156: enum xirc_ecr {
                    157:     FullDuplex = 0x04, /* enable full duplex mode */
                    158:     LongTPMode = 0x08, /* adjust for longer lengths of TP cable */
                    159:     DisablePolCor = 0x10,/* disable auto polarity correction */
                    160:     DisableLinkPulse = 0x20, /* disable link pulse generation */
                    161:     DisableAutoTx = 0x40, /* disable auto-transmit */
                    162: };
                    163: #define XIRCREG2_RBS 8 /* receive buffer start register */
                    164: #define XIRCREG2_LED 10 /* LED Configuration register */
                    165: /* values for the leds:    Bits 2-0 for led 1
                    166:  *  0 disabled            Bits 5-3 for led 2
                    167:  *  1 collision
                    168:  *  2 noncollision
                    169:  *  3 link_detected
                    170:  *  4 incor_polarity
                    171:  *  5 jabber
                    172:  *  6 auto_assertion
                    173:  *  7 rx_tx_activity
                    174:  */
                    175: #define XIRCREG2_MSR 12 /* Mohawk specific register */
                    176: 
                    177: #define XIRCREG4_GPR0 8 /* General Purpose Register 0 */
                    178: #define XIRCREG4_GPR1 9 /* General Purpose Register 1 */
                    179: #define XIRCREG2_GPR2 13 /* General Purpose Register 2 (page2!)*/
                    180: #define XIRCREG4_BOV 10 /* Bonding Version Register */
                    181: #define XIRCREG4_LMA 12 /* Local Memory Address Register */
                    182: #define XIRCREG4_LMD 14 /* Local Memory Data Port */
                    183: /* MAC register can only by accessed with 8 bit operations */
                    184: #define XIRCREG40_CMD0 8    /* Command Register (wr) */
                    185: enum xirc_cmd {            /* Commands */
                    186:     Transmit = 0x01,
                    187:     EnableRecv = 0x04,
                    188:     DisableRecv = 0x08,
                    189:     Abort = 0x10,
                    190:     Online = 0x20,
                    191:     IntrAck = 0x40,
                    192:     Offline = 0x80
                    193: };
                    194: #define XIRCREG5_RHSA0 10  /* Rx Host Start Address */
                    195: #define XIRCREG40_RXST0 9   /* Receive Status Register */
                    196: #define XIRCREG40_TXST0 11  /* Transmit Status Register 0 */
                    197: #define XIRCREG40_TXST1 12  /* Transmit Status Register 10 */
                    198: #define XIRCREG40_RMASK0 13  /* Receive Mask Register */
                    199: #define XIRCREG40_TMASK0 14  /* Transmit Mask Register 0 */
                    200: #define XIRCREG40_TMASK1 15  /* Transmit Mask Register 0 */
                    201: #define XIRCREG42_SWC0 8   /* Software Configuration 0 */
                    202: #define XIRCREG42_SWC1 9   /* Software Configuration 1 */
                    203: #define XIRCREG42_BOC  10  /* Back-Off Configuration */
                    204: #define XIRCREG44_TDR0 8   /* Time Domain Reflectometry 0 */
                    205: #define XIRCREG44_TDR1 9   /* Time Domain Reflectometry 1 */
                    206: #define XIRCREG44_RXBC_LO 10 /* Rx Byte Count 0 (rd) */
                    207: #define XIRCREG44_RXBC_HI 11 /* Rx Byte Count 1 (rd) */
                    208: #define XIRCREG45_REV   15 /* Revision Register (rd) */
                    209: #define XIRCREG50_IA   8   /* Individual Address (8-13) */
                    210: 
                    211: static char *if_names[] = { "Auto", "10BaseT", "10Base2", "AUI", "100BaseT" };
                    212: 
                    213: /****************
                    214:  * All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
                    215:  * you do not define PCMCIA_DEBUG at all, all the debug code will be
                    216:  * left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
                    217:  * be present but disabled -- but it can then be enabled for specific
                    218:  * modules at load time with a 'pc_debug=#' option to insmod.
                    219:  */
                    220: #ifdef PCMCIA_DEBUG
                    221: static int pc_debug = PCMCIA_DEBUG;
                    222: MODULE_PARM(pc_debug, "i");
                    223: #define DEBUG(n, args...) if (pc_debug>(n)) printk(KDBG_XIRC args)
                    224: #else
                    225: #define DEBUG(n, args...)
                    226: #endif
                    227: static char *version =
                    228: "xirc2ps_cs.c 1.31 1998/12/09 19:32:55 (dd9jn+kvh)";
                    229:            /* !--- CVS revision */
                    230: #define KDBG_XIRC KERN_DEBUG   "xirc2ps_cs: "
                    231: #define KERR_XIRC KERN_ERR     "xirc2ps_cs: "
                    232: #define KWRN_XIRC KERN_WARNING "xirc2ps_cs: "
                    233: #define KNOT_XIRC KERN_NOTICE  "xirc2ps_cs: "
                    234: #define KINF_XIRC KERN_INFO    "xirc2ps_cs: "
                    235: 
                    236: /* card types */
                    237: #define XIR_UNKNOWN  0 /* unknown: not supported */
                    238: #define XIR_CE      1  /* (prodid 1) different hardware: not supported */
                    239: #define XIR_CE2      2 /* (prodid 2) */
                    240: #define XIR_CE3      3 /* (prodid 3) */
                    241: #define XIR_CEM      4 /* (prodid 1) different hardware: not supported */
                    242: #define XIR_CEM2     5 /* (prodid 2) */
                    243: #define XIR_CEM3     6 /* (prodid 3) */
                    244: #define XIR_CEM33    7 /* (prodid 4) */
                    245: #define XIR_CEM56M   8 /* (prodid 5) */
                    246: #define XIR_CEM56    9 /* (prodid 6) */
                    247: #define XIR_CM28    10 /* (prodid 3) modem only: not supported here */
                    248: #define XIR_CM33    11 /* (prodid 4) modem only: not supported here */
                    249: #define XIR_CM56    12 /* (prodid 5) modem only: not supported here */
                    250: #define XIR_CG     13  /* (prodid 1) GSM modem only: not supported */
                    251: #define XIR_CBE     14 /* (prodid 1) cardbus ethernet: not supported */
                    252: /*====================================================================*/
                    253: 
                    254: /* Module parameters */
                    255: 
                    256: MODULE_DESCRIPTION("Xircom PCMCIA ethernet driver");
                    257: MODULE_LICENSE("Dual MPL/GPL");
                    258: 
                    259: #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
                    260: 
                    261: static int irq_list[4] = { -1 };
                    262: MODULE_PARM(irq_list, "1-4i");
                    263: INT_MODULE_PARM(irq_mask,      0xdeb8);
                    264: INT_MODULE_PARM(if_port,       0);
                    265: INT_MODULE_PARM(full_duplex,   0);
                    266: INT_MODULE_PARM(do_sound,      1);
                    267: INT_MODULE_PARM(lockup_hack,   0);  /* anti lockup hack */
                    268: 
                    269: /*====================================================================*/
                    270: 
                    271: /* We do not process more than these number of bytes during one
                    272:  * interrupt. (Of course we receive complete packets, so this is not
                    273:  * an exact value).
                    274:  * Something between 2000..22000; first value gives best interrupt latency,
                    275:  * the second enables the usage of the complete on-chip buffer. We use the
                    276:  * high value as the initial value.
                    277:  */
                    278: static unsigned maxrx_bytes = 22000;
                    279: 
                    280: /* MII management prototypes */
                    281: static void mii_idle(ioaddr_t ioaddr);
                    282: static void mii_putbit(ioaddr_t ioaddr, unsigned data);
                    283: static int  mii_getbit(ioaddr_t ioaddr);
                    284: static void mii_wbits(ioaddr_t ioaddr, unsigned data, int len);
                    285: static unsigned mii_rd(ioaddr_t ioaddr,        u_char phyaddr, u_char phyreg);
                    286: static void mii_wr(ioaddr_t ioaddr, u_char phyaddr, u_char phyreg,
                    287:                   unsigned data, int len);
                    288: 
                    289: /*
                    290:  * The event() function is this driver's Card Services event handler.
                    291:  * It will be called by Card Services when an appropriate card status
                    292:  * event is received.  The config() and release() entry points are
                    293:  * used to configure or release a socket, in response to card insertion
                    294:  * and ejection events.  They are invoked from the event handler.
                    295:  */
                    296: 
                    297: static int has_ce2_string(dev_link_t * link);
                    298: static void xirc2ps_config(dev_link_t * link);
                    299: static void xirc2ps_release(u_long arg);
                    300: static int xirc2ps_event(event_t event, int priority,
                    301:                         event_callback_args_t * args);
                    302: 
                    303: /****************
                    304:  * The attach() and detach() entry points are used to create and destroy
                    305:  * "instances" of the driver, where each instance represents everything
                    306:  * needed to manage one actual PCMCIA card.
                    307:  */
                    308: 
                    309: static dev_link_t *xirc2ps_attach(void);
                    310: static void xirc2ps_detach(dev_link_t *);
                    311: 
                    312: /****************
                    313:  * You'll also need to prototype all the functions that will actually
                    314:  * be used to talk to your device.  See 'pcmem_cs' for a good example
                    315:  * of a fully self-sufficient driver; the other drivers rely more or
                    316:  * less on other parts of the kernel.
                    317:  */
                    318: 
                    319: static void xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs);
                    320: 
                    321: /*
                    322:  * The dev_info variable is the "key" that is used to match up this
                    323:  * device driver with appropriate cards, through the card configuration
                    324:  * database.
                    325:  */
                    326: 
                    327: static dev_info_t dev_info = "xirc2ps_cs";
                    328: 
                    329: /****************
                    330:  * A linked list of "instances" of the device.  Each actual
                    331:  * PCMCIA card corresponds to one device instance, and is described
                    332:  * by one dev_link_t structure (defined in ds.h).
                    333:  *
                    334:  * You may not want to use a linked list for this -- for example, the
                    335:  * memory card driver uses an array of dev_link_t pointers, where minor
                    336:  * device numbers are used to derive the corresponding array index.
                    337:  */
                    338: 
                    339: static dev_link_t *dev_list = NULL;
                    340: 
                    341: /****************
                    342:  * A dev_link_t structure has fields for most things that are needed
                    343:  * to keep track of a socket, but there will usually be some device
                    344:  * specific information that also needs to be kept track of.  The
                    345:  * 'priv' pointer in a dev_link_t structure can be used to point to
                    346:  * a device-specific private data structure, like this.
                    347:  *
                    348:  * A driver needs to provide a dev_node_t structure for each device
                    349:  * on a card.  In some cases, there is only one device per card (for
                    350:  * example, ethernet cards, modems).  In other cases, there may be
                    351:  * many actual or logical devices (SCSI adapters, memory cards with
                    352:  * multiple partitions).  The dev_node_t structures need to be kept
                    353:  * in a linked list starting at the 'dev' field of a dev_link_t
                    354:  * structure.  We allocate them in the card's private data structure,
                    355:  * because they generally can't be allocated dynamically.
                    356:  */
                    357: 
                    358: typedef struct local_info_t {
                    359:     dev_link_t link;
                    360:     struct net_device dev;
                    361:     dev_node_t node;
                    362:     struct net_device_stats stats;
                    363:     int card_type;
                    364:     int probe_port;
                    365:     int silicon; /* silicon revision. 0=old CE2, 1=Scipper, 4=Mohawk */
                    366:     int mohawk;  /* a CE3 type card */
                    367:     int dingo;  /* a CEM56 type card */
                    368:     int new_mii; /* has full 10baseT/100baseT MII */
                    369:     int modem;  /* is a multi function card (i.e with a modem) */
                    370:     caddr_t dingo_ccr; /* only used for CEM56 cards */
                    371:     unsigned last_ptr_value; /* last packets transmitted value */
                    372:     const char *manf_str;
                    373: } local_info_t;
                    374: 
                    375: /****************
                    376:  * Some more prototypes
                    377:  */
                    378: static int do_start_xmit(struct sk_buff *skb, struct net_device *dev);
                    379: static void do_tx_timeout(struct net_device *dev);
                    380: static struct net_device_stats *do_get_stats(struct net_device *dev);
                    381: static void set_addresses(struct net_device *dev);
                    382: static void set_multicast_list(struct net_device *dev);
                    383: static int set_card_type(dev_link_t *link, const void *s);
                    384: static int do_config(struct net_device *dev, struct ifmap *map);
                    385: static int do_open(struct net_device *dev);
                    386: static int do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
                    387: static void hardreset(struct net_device *dev);
                    388: static void do_reset(struct net_device *dev, int full);
                    389: static int init_mii(struct net_device *dev);
                    390: static void do_powerdown(struct net_device *dev);
                    391: static int do_stop(struct net_device *dev);
                    392: 
                    393: 
                    394: /*=============== Helper functions =========================*/
                    395: static void
                    396: flush_stale_links(void)
                    397: {
                    398:     dev_link_t *link, *next;
                    399:     for (link = dev_list; link; link = next) {
                    400:        next = link->next;
                    401:        if (link->state & DEV_STALE_LINK)
                    402:            xirc2ps_detach(link);
                    403:     }
                    404: }
                    405: 
                    406: static void
                    407: cs_error(client_handle_t handle, int func, int ret)
                    408: {
                    409:     error_info_t err = { func, ret };
                    410:     CardServices(ReportError, handle, &err);
                    411: }
                    412: 
                    413: static int
                    414: get_tuple_data(int fn, client_handle_t handle, tuple_t *tuple)
                    415: {
                    416:     int err;
                    417: 
                    418:     if ((err=CardServices(fn, handle, tuple)))
                    419:        return err;
                    420:     return CardServices(GetTupleData, handle, tuple);
                    421: }
                    422: 
                    423: static int
                    424: get_tuple(int fn, client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
                    425: {
                    426:     int err;
                    427: 
                    428:     if ((err=get_tuple_data(fn, handle, tuple)))
                    429:        return err;
                    430:     return CardServices(ParseTuple, handle, tuple, parse);
                    431: }
                    432: 
                    433: #define first_tuple(a, b, c) get_tuple(GetFirstTuple, a, b, c)
                    434: #define next_tuple(a, b, c)  get_tuple(GetNextTuple, a, b, c)
                    435: 
                    436: #define SelectPage(pgnr)   outb((pgnr), ioaddr + XIRCREG_PR)
                    437: #define GetByte(reg)      ((unsigned)inb(ioaddr + (reg)))
                    438: #define GetWord(reg)      ((unsigned)inw(ioaddr + (reg)))
                    439: #define PutByte(reg,value) outb((value), ioaddr+(reg))
                    440: #define PutWord(reg,value) outw((value), ioaddr+(reg))
                    441: 
                    442: static void
                    443: busy_loop(u_long len)
                    444: {
                    445: #ifdef MACH
                    446:     /* TODO: Is this really what we want?  */
                    447:     __udelay(1000000 / HZ *  len);
                    448: #else
                    449:     if (in_interrupt()) {
                    450:        u_long timeout = jiffies + len;
                    451:        u_long flags;
                    452:        save_flags(flags);
                    453:        sti();
                    454:        while (timeout >= jiffies)
                    455:            ;
                    456:        restore_flags(flags);
                    457:     } else {
                    458:        __set_current_state(TASK_UNINTERRUPTIBLE);
                    459:        schedule_timeout(len);
                    460:     }
                    461: #endif
                    462: }
                    463: 
                    464: 
                    465: /*====== Functions used for debugging =================================*/
                    466: #if defined(PCMCIA_DEBUG) && 0 /* reading regs may change system status */
                    467: static void
                    468: PrintRegisters(struct net_device *dev)
                    469: {
                    470:     ioaddr_t ioaddr = dev->base_addr;
                    471: 
                    472:     if (pc_debug > 1) {
                    473:        int i, page;
                    474: 
                    475:        printk(KDBG_XIRC "Register  common: ");
                    476:        for (i = 0; i < 8; i++)
                    477:            printk(" %2.2x", GetByte(i));
                    478:        printk("\n");
                    479:        for (page = 0; page <= 8; page++) {
                    480:            printk(KDBG_XIRC "Register page %2x: ", page);
                    481:            SelectPage(page);
                    482:            for (i = 8; i < 16; i++)
                    483:                printk(" %2.2x", GetByte(i));
                    484:            printk("\n");
                    485:        }
                    486:        for (page=0x40 ; page <= 0x5f; page++) {
                    487:            if (page == 0x43 || (page >= 0x46 && page <= 0x4f)
                    488:                || (page >= 0x51 && page <=0x5e))
                    489:                continue;
                    490:            printk(KDBG_XIRC "Register page %2x: ", page);
                    491:            SelectPage(page);
                    492:            for (i = 8; i < 16; i++)
                    493:                printk(" %2.2x", GetByte(i));
                    494:            printk("\n");
                    495:        }
                    496:     }
                    497: }
                    498: #endif /* PCMCIA_DEBUG */
                    499: 
                    500: /*============== MII Management functions ===============*/
                    501: 
                    502: /****************
                    503:  * Turn around for read
                    504:  */
                    505: static void
                    506: mii_idle(ioaddr_t ioaddr)
                    507: {
                    508:     PutByte(XIRCREG2_GPR2, 0x04|0); /* drive MDCK low */
                    509:     udelay(1);
                    510:     PutByte(XIRCREG2_GPR2, 0x04|1); /* and drive MDCK high */
                    511:     udelay(1);
                    512: }
                    513: 
                    514: /****************
                    515:  * Write a bit to MDI/O
                    516:  */
                    517: static void
                    518: mii_putbit(ioaddr_t ioaddr, unsigned data)
                    519: {
                    520:   #if 1
                    521:     if (data) {
                    522:        PutByte(XIRCREG2_GPR2, 0x0c|2|0); /* set MDIO */
                    523:        udelay(1);
                    524:        PutByte(XIRCREG2_GPR2, 0x0c|2|1); /* and drive MDCK high */
                    525:        udelay(1);
                    526:     } else {
                    527:        PutByte(XIRCREG2_GPR2, 0x0c|0|0); /* clear MDIO */
                    528:        udelay(1);
                    529:        PutByte(XIRCREG2_GPR2, 0x0c|0|1); /* and drive MDCK high */
                    530:        udelay(1);
                    531:     }
                    532:   #else
                    533:     if (data) {
                    534:        PutWord(XIRCREG2_GPR2-1, 0x0e0e);
                    535:        udelay(1);
                    536:        PutWord(XIRCREG2_GPR2-1, 0x0f0f);
                    537:        udelay(1);
                    538:     } else {
                    539:        PutWord(XIRCREG2_GPR2-1, 0x0c0c);
                    540:        udelay(1);
                    541:        PutWord(XIRCREG2_GPR2-1, 0x0d0d);
                    542:        udelay(1);
                    543:     }
                    544:   #endif
                    545: }
                    546: 
                    547: /****************
                    548:  * Get a bit from MDI/O
                    549:  */
                    550: static int
                    551: mii_getbit(ioaddr_t ioaddr)
                    552: {
                    553:     unsigned d;
                    554: 
                    555:     PutByte(XIRCREG2_GPR2, 4|0); /* drive MDCK low */
                    556:     udelay(1);
                    557:     d = GetByte(XIRCREG2_GPR2); /* read MDIO */
                    558:     PutByte(XIRCREG2_GPR2, 4|1); /* drive MDCK high again */
                    559:     udelay(1);
                    560:     return d & 0x20; /* read MDIO */
                    561: }
                    562: 
                    563: static void
                    564: mii_wbits(ioaddr_t ioaddr, unsigned data, int len)
                    565: {
                    566:     unsigned m = 1 << (len-1);
                    567:     for (; m; m >>= 1)
                    568:        mii_putbit(ioaddr, data & m);
                    569: }
                    570: 
                    571: static unsigned
                    572: mii_rd(ioaddr_t ioaddr,        u_char phyaddr, u_char phyreg)
                    573: {
                    574:     int i;
                    575:     unsigned data=0, m;
                    576: 
                    577:     SelectPage(2);
                    578:     for (i=0; i < 32; i++)             /* 32 bit preamble */
                    579:        mii_putbit(ioaddr, 1);
                    580:     mii_wbits(ioaddr, 0x06, 4);        /* Start and opcode for read */
                    581:     mii_wbits(ioaddr, phyaddr, 5);     /* PHY address to be accessed */
                    582:     mii_wbits(ioaddr, phyreg, 5);      /* PHY register to read */
                    583:     mii_idle(ioaddr);                  /* turn around */
                    584:     mii_getbit(ioaddr);
                    585: 
                    586:     for (m = 1<<15; m; m >>= 1)
                    587:        if (mii_getbit(ioaddr))
                    588:            data |= m;
                    589:     mii_idle(ioaddr);
                    590:     return data;
                    591: }
                    592: 
                    593: static void
                    594: mii_wr(ioaddr_t ioaddr, u_char phyaddr, u_char phyreg, unsigned data, int len)
                    595: {
                    596:     int i;
                    597: 
                    598:     SelectPage(2);
                    599:     for (i=0; i < 32; i++)             /* 32 bit preamble */
                    600:        mii_putbit(ioaddr, 1);
                    601:     mii_wbits(ioaddr, 0x05, 4);        /* Start and opcode for write */
                    602:     mii_wbits(ioaddr, phyaddr, 5);     /* PHY address to be accessed */
                    603:     mii_wbits(ioaddr, phyreg, 5);      /* PHY Register to write */
                    604:     mii_putbit(ioaddr, 1);             /* turn around */
                    605:     mii_putbit(ioaddr, 0);
                    606:     mii_wbits(ioaddr, data, len);      /* And write the data */
                    607:     mii_idle(ioaddr);
                    608: }
                    609: 
                    610: /*============= Main bulk of functions =========================*/
                    611: 
                    612: /****************
                    613:  * xirc2ps_attach() creates an "instance" of the driver, allocating
                    614:  * local data structures for one device.  The device is registered
                    615:  * with Card Services.
                    616:  *
                    617:  * The dev_link structure is initialized, but we don't actually
                    618:  * configure the card at this point -- we wait until we receive a
                    619:  * card insertion event.
                    620:  */
                    621: 
                    622: static dev_link_t *
                    623: xirc2ps_attach(void)
                    624: {
                    625:     client_reg_t client_reg;
                    626:     dev_link_t *link;
                    627:     struct net_device *dev;
                    628:     local_info_t *local;
                    629:     int err;
                    630: 
                    631:     DEBUG(0, "attach()\n");
                    632:     flush_stale_links();
                    633: 
                    634:     /* Allocate the device structure */
                    635:     local = kmalloc(sizeof(*local), GFP_KERNEL);
                    636:     if (!local) return NULL;
                    637:     memset(local, 0, sizeof(*local));
                    638:     link = &local->link; dev = &local->dev;
                    639:     link->priv = dev->priv = local;
                    640: 
                    641:     init_timer(&link->release);
                    642:     link->release.function = &xirc2ps_release;
                    643:     link->release.data = (u_long) link;
                    644: 
                    645:     /* General socket configuration */
                    646:     link->conf.Attributes = CONF_ENABLE_IRQ;
                    647:     link->conf.Vcc = 50;
                    648:     link->conf.IntType = INT_MEMORY_AND_IO;
                    649:     link->conf.ConfigIndex = 1;
                    650:     link->conf.Present = PRESENT_OPTION;
                    651:     link->irq.Handler = xirc2ps_interrupt;
                    652:     link->irq.Instance = dev;
                    653: 
                    654:     /* Fill in card specific entries */
                    655:     dev->hard_start_xmit = &do_start_xmit;
                    656:     dev->set_config = &do_config;
                    657:     dev->get_stats = &do_get_stats;
                    658:     dev->do_ioctl = &do_ioctl;
                    659:     dev->set_multicast_list = &set_multicast_list;
                    660:     ether_setup(dev);
                    661:     init_dev_name(dev, local->node);
                    662:     dev->open = &do_open;
                    663:     dev->stop = &do_stop;
                    664: #ifdef HAVE_TX_TIMEOUT
                    665:     dev->tx_timeout = do_tx_timeout;
                    666:     dev->watchdog_timeo = TX_TIMEOUT;
                    667: #endif
                    668: 
                    669:     /* Register with Card Services */
                    670:     link->next = dev_list;
                    671:     dev_list = link;
                    672:     client_reg.dev_info = &dev_info;
                    673:     client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;
                    674:     client_reg.EventMask =
                    675:        CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |
                    676:        CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |
                    677:        CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;
                    678:     client_reg.event_handler = &xirc2ps_event;
                    679:     client_reg.Version = 0x0210;
                    680:     client_reg.event_callback_args.client_data = link;
                    681:     if ((err = CardServices(RegisterClient, &link->handle, &client_reg))) {
                    682:        cs_error(link->handle, RegisterClient, err);
                    683:        xirc2ps_detach(link);
                    684:        return NULL;
                    685:     }
                    686: 
                    687:     return link;
                    688: } /* xirc2ps_attach */
                    689: 
                    690: /****************
                    691:  *  This deletes a driver "instance".  The device is de-registered
                    692:  *  with Card Services.  If it has been released, all local data
                    693:  *  structures are freed.  Otherwise, the structures will be freed
                    694:  *  when the device is released.
                    695:  */
                    696: 
                    697: static void
                    698: xirc2ps_detach(dev_link_t * link)
                    699: {
                    700:     local_info_t *local = link->priv;
                    701:     dev_link_t **linkp;
                    702: 
                    703:     DEBUG(0, "detach(0x%p)\n", link);
                    704: 
                    705:     /* Locate device structure */
                    706:     for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
                    707:        if (*linkp == link)
                    708:            break;
                    709:     if (!*linkp) {
                    710:        DEBUG(0, "detach(0x%p): dev_link lost\n", link);
                    711:        return;
                    712:     }
                    713: 
                    714:     /*
                    715:      * If the device is currently configured and active, we won't
                    716:      * actually delete it yet. Instead, it is marked so that when
                    717:      * the release() function is called, that will trigger a proper
                    718:      * detach().
                    719:      */
                    720:     del_timer(&link->release);
                    721:     if (link->state & DEV_CONFIG) {
                    722:        DEBUG(0, "detach postponed, '%s' still locked\n",
                    723:              link->dev->dev_name);
                    724:        link->state |= DEV_STALE_LINK;
                    725:        return;
                    726:     }
                    727: 
                    728:     /* Break the link with Card Services */
                    729:     if (link->handle)
                    730:        CardServices(DeregisterClient, link->handle);
                    731: 
                    732:     /* Unlink device structure, free it */
                    733:     *linkp = link->next;
                    734:     if (link->dev)
                    735:        unregister_netdev(&local->dev);
                    736:     kfree(local);
                    737: 
                    738: } /* xirc2ps_detach */
                    739: 
                    740: /****************
                    741:  * Detect the type of the card. s is the buffer with the data of tuple 0x20
                    742:  * Returns: 0 := not supported
                    743:  *                    mediaid=11 and prodid=47
                    744:  * Media-Id bits:
                    745:  *  Ethernet       0x01
                    746:  *  Tokenring      0x02
                    747:  *  Arcnet         0x04
                    748:  *  Wireless       0x08
                    749:  *  Modem          0x10
                    750:  *  GSM only       0x20
                    751:  * Prod-Id bits:
                    752:  *  Pocket         0x10
                    753:  *  External       0x20
                    754:  *  Creditcard     0x40
                    755:  *  Cardbus        0x80
                    756:  *
                    757:  */
                    758: static int
                    759: set_card_type(dev_link_t *link, const void *s)
                    760: {
                    761:     local_info_t *local = link->priv;
                    762:   #ifdef PCMCIA_DEBUG
                    763:     unsigned cisrev = ((const unsigned char *)s)[2];
                    764:   #endif
                    765:     unsigned mediaid= ((const unsigned char *)s)[3];
                    766:     unsigned prodid = ((const unsigned char *)s)[4];
                    767: 
                    768:     DEBUG(0, "cisrev=%02x mediaid=%02x prodid=%02x\n",
                    769:          cisrev, mediaid, prodid);
                    770: 
                    771:     local->mohawk = 0;
                    772:     local->dingo = 0;
                    773:     local->modem = 0;
                    774:     local->card_type = XIR_UNKNOWN;
                    775:     if (!(prodid & 0x40)) {
                    776:        printk(KNOT_XIRC "Ooops: Not a creditcard\n");
                    777:        return 0;
                    778:     }
                    779:     if (!(mediaid & 0x01)) {
                    780:        printk(KNOT_XIRC "Not an Ethernet card\n");
                    781:        return 0;
                    782:     }
                    783:     if (mediaid & 0x10) {
                    784:        local->modem = 1;
                    785:        switch(prodid & 15) {
                    786:          case 1: local->card_type = XIR_CEM   ; break;
                    787:          case 2: local->card_type = XIR_CEM2  ; break;
                    788:          case 3: local->card_type = XIR_CEM3  ; break;
                    789:          case 4: local->card_type = XIR_CEM33 ; break;
                    790:          case 5: local->card_type = XIR_CEM56M;
                    791:                  local->mohawk = 1;
                    792:                  break;
                    793:          case 6:
                    794:          case 7: /* 7 is the RealPort 10/56 */
                    795:                  local->card_type = XIR_CEM56 ;
                    796:                  local->mohawk = 1;
                    797:                  local->dingo = 1;
                    798:                  break;
                    799:        }
                    800:     } else {
                    801:        switch(prodid & 15) {
                    802:          case 1: local->card_type = has_ce2_string(link)? XIR_CE2 : XIR_CE ;
                    803:                  break;
                    804:          case 15:
                    805:          case 2: local->card_type = XIR_CE2; break;
                    806:          case 3: local->card_type = XIR_CE3;
                    807:                  local->mohawk = 1;
                    808:                  break;
                    809:        }
                    810:     }
                    811:     if (local->card_type == XIR_CE || local->card_type == XIR_CEM) {
                    812:        printk(KNOT_XIRC "Sorry, this is an old CE card\n");
                    813:        return 0;
                    814:     }
                    815:     if (local->card_type == XIR_UNKNOWN)
                    816:        printk(KNOT_XIRC "unknown card (mediaid=%02x prodid=%02x)\n",
                    817:               mediaid, prodid);
                    818: 
                    819:     return 1;
                    820: }
                    821: 
                    822: /****************
                    823:  * There are some CE2 cards out which claim to be a CE card.
                    824:  * This function looks for a "CE2" in the 3rd version field.
                    825:  * Returns: true if this is a CE2
                    826:  */
                    827: static int
                    828: has_ce2_string(dev_link_t * link)
                    829: {
                    830:     client_handle_t handle = link->handle;
                    831:     tuple_t tuple;
                    832:     cisparse_t parse;
                    833:     u_char buf[256];
                    834: 
                    835:     tuple.Attributes = 0;
                    836:     tuple.TupleData = buf;
                    837:     tuple.TupleDataMax = 254;
                    838:     tuple.TupleOffset = 0;
                    839:     tuple.DesiredTuple = CISTPL_VERS_1;
                    840:     if (!first_tuple(handle, &tuple, &parse) && parse.version_1.ns > 2) {
                    841:        if (strstr(parse.version_1.str + parse.version_1.ofs[2], "CE2"))
                    842:            return 1;
                    843:     }
                    844:     return 0;
                    845: }
                    846: 
                    847: /****************
                    848:  * xirc2ps_config() is scheduled to run after a CARD_INSERTION event
                    849:  * is received, to configure the PCMCIA socket, and to make the
                    850:  * ethernet device available to the system.
                    851:  */
                    852: static void
                    853: xirc2ps_config(dev_link_t * link)
                    854: {
                    855:     client_handle_t handle = link->handle;
                    856:     local_info_t *local = link->priv;
                    857:     struct net_device *dev = &local->dev;
                    858:     tuple_t tuple;
                    859:     cisparse_t parse;
                    860:     ioaddr_t ioaddr;
                    861:     int err, i;
                    862:     u_char buf[64];
                    863:     cistpl_lan_node_id_t *node_id = (cistpl_lan_node_id_t*)parse.funce.data;
                    864:     cistpl_cftable_entry_t *cf = &parse.cftable_entry;
                    865: 
                    866:     local->dingo_ccr = 0;
                    867: 
                    868:     DEBUG(0, "config(0x%p)\n", link);
                    869: 
                    870:     /*
                    871:      * This reads the card's CONFIG tuple to find its configuration
                    872:      * registers.
                    873:      */
                    874:     tuple.Attributes = 0;
                    875:     tuple.TupleData = buf;
                    876:     tuple.TupleDataMax = 64;
                    877:     tuple.TupleOffset = 0;
                    878: 
                    879:     /* Is this a valid card */
                    880:     tuple.DesiredTuple = CISTPL_MANFID;
                    881:     if ((err=first_tuple(handle, &tuple, &parse))) {
                    882:        printk(KNOT_XIRC "manfid not found in CIS\n");
                    883:        goto failure;
                    884:     }
                    885: 
                    886:     switch(parse.manfid.manf) {
                    887:       case MANFID_XIRCOM:
                    888:        local->manf_str = "Xircom";
                    889:        break;
                    890:       case MANFID_ACCTON:
                    891:        local->manf_str = "Accton";
                    892:        break;
                    893:       case MANFID_COMPAQ:
                    894:       case MANFID_COMPAQ2:
                    895:        local->manf_str = "Compaq";
                    896:        break;
                    897:       case MANFID_INTEL:
                    898:        local->manf_str = "Intel";
                    899:        break;
                    900:       case MANFID_TOSHIBA:
                    901:        local->manf_str = "Toshiba";
                    902:        break;
                    903:       default:
                    904:        printk(KNOT_XIRC "Unknown Card Manufacturer ID: 0x%04x\n",
                    905:               (unsigned)parse.manfid.manf);
                    906:        goto failure;
                    907:     }
                    908:     DEBUG(0, "found %s card\n", local->manf_str);
                    909: 
                    910:     if (!set_card_type(link, buf)) {
                    911:        printk(KNOT_XIRC "this card is not supported\n");
                    912:        goto failure;
                    913:     }
                    914: 
                    915:     /* get configuration stuff */
                    916:     tuple.DesiredTuple = CISTPL_CONFIG;
                    917:     if ((err=first_tuple(handle, &tuple, &parse)))
                    918:        goto cis_error;
                    919:     link->conf.ConfigBase = parse.config.base;
                    920:     link->conf.Present =    parse.config.rmask[0];
                    921: 
                    922:     /* get the ethernet address from the CIS */
                    923:     tuple.DesiredTuple = CISTPL_FUNCE;
                    924:     for (err = first_tuple(handle, &tuple, &parse); !err;
                    925:                             err = next_tuple(handle, &tuple, &parse)) {
                    926:        /* Once I saw two CISTPL_FUNCE_LAN_NODE_ID entries:
                    927:         * the first one with a length of zero the second correct -
                    928:         * so I skip all entries with length 0 */
                    929:        if (parse.funce.type == CISTPL_FUNCE_LAN_NODE_ID
                    930:            && ((cistpl_lan_node_id_t *)parse.funce.data)->nb)
                    931:            break;
                    932:     }
                    933:     if (err) { /* not found: try to get the node-id from tuple 0x89 */
                    934:        tuple.DesiredTuple = 0x89;  /* data layout looks like tuple 0x22 */
                    935:        if (!(err = get_tuple_data(GetFirstTuple, handle, &tuple))) {
                    936:            if (tuple.TupleDataLen == 8 && *buf == CISTPL_FUNCE_LAN_NODE_ID)
                    937:                memcpy(&parse, buf, 8);
                    938:            else
                    939:                err = -1;
                    940:        }
                    941:     }
                    942:     if (err) { /* another try  (James Lehmer's CE2 version 4.1)*/
                    943:        tuple.DesiredTuple = CISTPL_FUNCE;
                    944:        for (err = first_tuple(handle, &tuple, &parse); !err;
                    945:                                 err = next_tuple(handle, &tuple, &parse)) {
                    946:            if (parse.funce.type == 0x02 && parse.funce.data[0] == 1
                    947:                && parse.funce.data[1] == 6 && tuple.TupleDataLen == 13) {
                    948:                buf[1] = 4;
                    949:                memcpy(&parse, buf+1, 8);
                    950:                break;
                    951:            }
                    952:        }
                    953:     }
                    954:     if (err) {
                    955:        printk(KNOT_XIRC "node-id not found in CIS\n");
                    956:        goto failure;
                    957:     }
                    958:     node_id = (cistpl_lan_node_id_t *)parse.funce.data;
                    959:     if (node_id->nb != 6) {
                    960:        printk(KNOT_XIRC "malformed node-id in CIS\n");
                    961:        goto failure;
                    962:     }
                    963:     for (i=0; i < 6; i++)
                    964:        dev->dev_addr[i] = node_id->id[i];
                    965: 
                    966:     /* Configure card */
                    967:     link->state |= DEV_CONFIG;
                    968: 
                    969:     link->io.IOAddrLines =10;
                    970:     link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
                    971:     link->irq.Attributes = IRQ_HANDLE_PRESENT;
                    972:     link->irq.IRQInfo1 = IRQ_INFO2_VALID | IRQ_LEVEL_ID;
                    973:     if (irq_list[0] == -1)
                    974:        link->irq.IRQInfo2 = irq_mask;
                    975:     else {
                    976:        for (i = 0; i < 4; i++)
                    977:            link->irq.IRQInfo2 |= 1 << irq_list[i];
                    978:     }
                    979:     if (local->modem) {
                    980:        int pass;
                    981: 
                    982:        if (do_sound) {
                    983:            link->conf.Attributes |= CONF_ENABLE_SPKR;
                    984:            link->conf.Status |= CCSR_AUDIO_ENA;
                    985:        }
                    986:        link->irq.Attributes |= IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED ;
                    987:        link->io.NumPorts2 = 8;
                    988:        link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
                    989:        if (local->dingo) {
                    990:            /* Take the Modem IO port from the CIS and scan for a free
                    991:             * Ethernet port */
                    992:            link->io.NumPorts1 = 16; /* no Mako stuff anymore */
                    993:            tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
                    994:            for (err = first_tuple(handle, &tuple, &parse); !err;
                    995:                                 err = next_tuple(handle, &tuple, &parse)) {
                    996:                if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8) {
                    997:                    for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
                    998:                        link->conf.ConfigIndex = cf->index ;
                    999:                        link->io.BasePort2 = cf->io.win[0].base;
                   1000:                        link->io.BasePort1 = ioaddr;
                   1001:                        if (!(err=CardServices(RequestIO, link->handle,
                   1002:                                                                &link->io)))
                   1003:                            goto port_found;
                   1004:                    }
                   1005:                }
                   1006:            }
                   1007:        } else {
                   1008:            link->io.NumPorts1 = 18;
                   1009:            /* We do 2 passes here: The first one uses the regular mapping and
                   1010:             * the second tries again, thereby considering that the 32 ports are
                   1011:             * mirrored every 32 bytes. Actually we use a mirrored port for
                   1012:             * the Mako if (on the first pass) the COR bit 5 is set.
                   1013:             */
                   1014:            for (pass=0; pass < 2; pass++) {
                   1015:                tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
                   1016:                for (err = first_tuple(handle, &tuple, &parse); !err;
                   1017:                                     err = next_tuple(handle, &tuple, &parse)){
                   1018:                    if (cf->io.nwin > 0  &&  (cf->io.win[0].base & 0xf) == 8){
                   1019:                        link->conf.ConfigIndex = cf->index ;
                   1020:                        link->io.BasePort2 = cf->io.win[0].base;
                   1021:                        link->io.BasePort1 = link->io.BasePort2
                   1022:                                    + (pass ? (cf->index & 0x20 ? -24:8)
                   1023:                                            : (cf->index & 0x20 ?   8:-24));
                   1024:                        if (!(err=CardServices(RequestIO, link->handle,
                   1025:                                                                &link->io)))
                   1026:                            goto port_found;
                   1027:                    }
                   1028:                }
                   1029:            }
                   1030:            /* if special option:
                   1031:             * try to configure as Ethernet only.
                   1032:             * .... */
                   1033:        }
                   1034:        printk(KNOT_XIRC "no ports available\n");
                   1035:     } else {
                   1036:        link->irq.Attributes |= IRQ_TYPE_EXCLUSIVE;
                   1037:        link->io.NumPorts1 = 16;
                   1038:        for (ioaddr = 0x300; ioaddr < 0x400; ioaddr += 0x10) {
                   1039:            link->io.BasePort1 = ioaddr;
                   1040:            if (!(err=CardServices(RequestIO, link->handle, &link->io)))
                   1041:                goto port_found;
                   1042:        }
                   1043:        link->io.BasePort1 = 0; /* let CS decide */
                   1044:        if ((err=CardServices(RequestIO, link->handle, &link->io))) {
                   1045:            cs_error(link->handle, RequestIO, err);
                   1046:            goto config_error;
                   1047:        }
                   1048:     }
                   1049:   port_found:
                   1050:     if (err)
                   1051:         goto config_error;
                   1052: 
                   1053:     /****************
                   1054:      * Now allocate an interrupt line. Note that this does not
                   1055:      * actually assign a handler to the interrupt.
                   1056:      */
                   1057:     if ((err=CardServices(RequestIRQ, link->handle, &link->irq))) {
                   1058:        cs_error(link->handle, RequestIRQ, err);
                   1059:        goto config_error;
                   1060:     }
                   1061: 
                   1062:     /****************
                   1063:      * This actually configures the PCMCIA socket -- setting up
                   1064:      * the I/O windows and the interrupt mapping.
                   1065:      */
                   1066:     if ((err=CardServices(RequestConfiguration,
                   1067:                          link->handle, &link->conf))) {
                   1068:        cs_error(link->handle, RequestConfiguration, err);
                   1069:        goto config_error;
                   1070:     }
                   1071: 
                   1072:     if (local->dingo) {
                   1073:        conf_reg_t reg;
                   1074:        win_req_t req;
                   1075:        memreq_t mem;
                   1076: 
                   1077:        /* Reset the modem's BAR to the correct value
                   1078:         * This is necessary because in the RequestConfiguration call,
                   1079:         * the base address of the ethernet port (BasePort1) is written
                   1080:         * to the BAR registers of the modem.
                   1081:         */
                   1082:        reg.Action = CS_WRITE;
                   1083:        reg.Offset = CISREG_IOBASE_0;
                   1084:        reg.Value = link->io.BasePort2 & 0xff;
                   1085:        if ((err = CardServices(AccessConfigurationRegister, link->handle,
                   1086:                                &reg))) {
                   1087:            cs_error(link->handle, AccessConfigurationRegister, err);
                   1088:            goto config_error;
                   1089:        }
                   1090:        reg.Action = CS_WRITE;
                   1091:        reg.Offset = CISREG_IOBASE_1;
                   1092:        reg.Value = (link->io.BasePort2 >> 8) & 0xff;
                   1093:        if ((err = CardServices(AccessConfigurationRegister, link->handle,
                   1094:                                &reg))) {
                   1095:            cs_error(link->handle, AccessConfigurationRegister, err);
                   1096:            goto config_error;
                   1097:        }
                   1098: 
                   1099:        /* There is no config entry for the Ethernet part which
                   1100:         * is at 0x0800. So we allocate a window into the attribute
                   1101:         * memory and write direct to the CIS registers
                   1102:         */
                   1103:        req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
                   1104:        req.Base = req.Size = 0;
                   1105:        req.AccessSpeed = 0;
                   1106:        link->win = (window_handle_t)link->handle;
                   1107:        if ((err = CardServices(RequestWindow, &link->win, &req))) {
                   1108:            cs_error(link->handle, RequestWindow, err);
                   1109:            goto config_error;
                   1110:        }
                   1111:        local->dingo_ccr = ioremap(req.Base,0x1000) + 0x0800;
                   1112:        mem.CardOffset = 0x0;
                   1113:        mem.Page = 0;
                   1114:        if ((err = CardServices(MapMemPage, link->win, &mem))) {
                   1115:            cs_error(link->handle, MapMemPage, err);
                   1116:            goto config_error;
                   1117:        }
                   1118: 
                   1119:        /* Setup the CCRs; there are no infos in the CIS about the Ethernet
                   1120:         * part.
                   1121:         */
                   1122:        writeb(0x47, local->dingo_ccr + CISREG_COR);
                   1123:        ioaddr = link->io.BasePort1;
                   1124:        writeb(ioaddr & 0xff      , local->dingo_ccr + CISREG_IOBASE_0);
                   1125:        writeb((ioaddr >> 8)&0xff , local->dingo_ccr + CISREG_IOBASE_1);
                   1126: 
                   1127:       #if 0
                   1128:        {
                   1129:            u_char tmp;
                   1130:            printk(KERN_INFO "ECOR:");
                   1131:            for (i=0; i < 7; i++) {
                   1132:                tmp = readb(local->dingo_ccr + i*2);
                   1133:                printk(" %02x", tmp);
                   1134:            }
                   1135:            printk("\n");
                   1136:            printk(KERN_INFO "DCOR:");
                   1137:            for (i=0; i < 4; i++) {
                   1138:                tmp = readb(local->dingo_ccr + 0x20 + i*2);
                   1139:                printk(" %02x", tmp);
                   1140:            }
                   1141:            printk("\n");
                   1142:            printk(KERN_INFO "SCOR:");
                   1143:            for (i=0; i < 10; i++) {
                   1144:                tmp = readb(local->dingo_ccr + 0x40 + i*2);
                   1145:                printk(" %02x", tmp);
                   1146:            }
                   1147:            printk("\n");
                   1148:        }
                   1149:       #endif
                   1150: 
                   1151:        writeb(0x01, local->dingo_ccr + 0x20);
                   1152:        writeb(0x0c, local->dingo_ccr + 0x22);
                   1153:        writeb(0x00, local->dingo_ccr + 0x24);
                   1154:        writeb(0x00, local->dingo_ccr + 0x26);
                   1155:        writeb(0x00, local->dingo_ccr + 0x28);
                   1156:     }
                   1157: 
                   1158:     /* The if_port symbol can be set when the module is loaded */
                   1159:     local->probe_port=0;
                   1160:     if (!if_port) {
                   1161:        local->probe_port = dev->if_port = 1;
                   1162:     } else if ((if_port >= 1 && if_port <= 2) ||
                   1163:               (local->mohawk && if_port==4))
                   1164:        dev->if_port = if_port;
                   1165:     else
                   1166:        printk(KNOT_XIRC "invalid if_port requested\n");
                   1167: 
                   1168:     /* we can now register the device with the net subsystem */
                   1169:     dev->irq = link->irq.AssignedIRQ;
                   1170:     dev->base_addr = link->io.BasePort1;
                   1171:     if ((err=register_netdev(dev))) {
                   1172:        printk(KNOT_XIRC "register_netdev() failed\n");
                   1173:        goto config_error;
                   1174:     }
                   1175: 
                   1176:     copy_dev_name(local->node, dev);
                   1177:     link->dev = &local->node;
                   1178:     link->state &= ~DEV_CONFIG_PENDING;
                   1179: 
                   1180:     if (local->dingo)
                   1181:        do_reset(dev, 1); /* a kludge to make the cem56 work */
                   1182: 
                   1183:     /* give some infos about the hardware */
                   1184:     printk(KERN_INFO "%s: %s: port %#3lx, irq %d, hwaddr",
                   1185:         dev->name, local->manf_str,(u_long)dev->base_addr, (int)dev->irq);
                   1186:     for (i = 0; i < 6; i++)
                   1187:        printk("%c%02X", i?':':' ', dev->dev_addr[i]);
                   1188:     printk("\n");
                   1189: 
                   1190:     return;
                   1191: 
                   1192:   config_error:
                   1193:     link->state &= ~DEV_CONFIG_PENDING;
                   1194:     xirc2ps_release((u_long)link);
                   1195:     return;
                   1196: 
                   1197:   cis_error:
                   1198:     printk(KNOT_XIRC "unable to parse CIS\n");
                   1199:   failure:
                   1200:     link->state &= ~DEV_CONFIG_PENDING;
                   1201: } /* xirc2ps_config */
                   1202: 
                   1203: /****************
                   1204:  * After a card is removed, xirc2ps_release() will unregister the net
                   1205:  * device, and release the PCMCIA configuration.  If the device is
                   1206:  * still open, this will be postponed until it is closed.
                   1207:  */
                   1208: static void
                   1209: xirc2ps_release(u_long arg)
                   1210: {
                   1211:     dev_link_t *link = (dev_link_t *) arg;
                   1212:     local_info_t *local = link->priv;
                   1213:     struct net_device *dev = &local->dev;
                   1214: 
                   1215:     DEBUG(0, "release(0x%p)\n", link);
                   1216: 
                   1217:     /*
                   1218:      * If the device is currently in use, we won't release until it
                   1219:      * is actually closed.
                   1220:      */
                   1221:     if (link->open) {
                   1222:        DEBUG(0, "release postponed, '%s' "
                   1223:              "still open\n", link->dev->dev_name);
                   1224:        link->state |= DEV_STALE_CONFIG;
                   1225:        return;
                   1226:     }
                   1227: 
                   1228:     if (link->win) {
                   1229:        local_info_t *local = dev->priv;
                   1230:        if (local->dingo)
                   1231:            iounmap(local->dingo_ccr - 0x0800);
                   1232:        CardServices(ReleaseWindow, link->win);
                   1233:     }
                   1234:     CardServices(ReleaseConfiguration, link->handle);
                   1235:     CardServices(ReleaseIO, link->handle, &link->io);
                   1236:     CardServices(ReleaseIRQ, link->handle, &link->irq);
                   1237:     link->state &= ~DEV_CONFIG;
                   1238: 
                   1239: } /* xirc2ps_release */
                   1240: 
                   1241: /*====================================================================*/
                   1242: 
                   1243: /****************
                   1244:  * The card status event handler.  Mostly, this schedules other
                   1245:  * stuff to run after an event is received.  A CARD_REMOVAL event
                   1246:  * also sets some flags to discourage the net drivers from trying
                   1247:  * to talk to the card any more.
                   1248:  *
                   1249:  * When a CARD_REMOVAL event is received, we immediately set a flag
                   1250:  * to block future accesses to this device.  All the functions that
                   1251:  * actually access the device should check this flag to make sure
                   1252:  * the card is still present.
                   1253:  */
                   1254: 
                   1255: static int
                   1256: xirc2ps_event(event_t event, int priority,
                   1257:              event_callback_args_t * args)
                   1258: {
                   1259:     dev_link_t *link = args->client_data;
                   1260:     local_info_t *lp = link->priv;
                   1261:     struct net_device *dev = &lp->dev;
                   1262: 
                   1263:     DEBUG(0, "event(%d)\n", (int)event);
                   1264: 
                   1265:     switch (event) {
                   1266:     case CS_EVENT_REGISTRATION_COMPLETE:
                   1267:        DEBUG(0, "registration complete\n");
                   1268:        break;
                   1269:     case CS_EVENT_CARD_REMOVAL:
                   1270:        link->state &= ~DEV_PRESENT;
                   1271:        if (link->state & DEV_CONFIG) {
                   1272:            netif_device_detach(dev);
                   1273:            mod_timer(&link->release, jiffies + HZ/20);
                   1274:        }
                   1275:        break;
                   1276:     case CS_EVENT_CARD_INSERTION:
                   1277:        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
                   1278:        xirc2ps_config(link);
                   1279:        break;
                   1280:     case CS_EVENT_PM_SUSPEND:
                   1281:        link->state |= DEV_SUSPEND;
                   1282:        /* Fall through... */
                   1283:     case CS_EVENT_RESET_PHYSICAL:
                   1284:        if (link->state & DEV_CONFIG) {
                   1285:            if (link->open) {
                   1286:                netif_device_detach(dev);
                   1287:                do_powerdown(dev);
                   1288:            }
                   1289:            CardServices(ReleaseConfiguration, link->handle);
                   1290:        }
                   1291:        break;
                   1292:     case CS_EVENT_PM_RESUME:
                   1293:        link->state &= ~DEV_SUSPEND;
                   1294:        /* Fall through... */
                   1295:     case CS_EVENT_CARD_RESET:
                   1296:        if (link->state & DEV_CONFIG) {
                   1297:            CardServices(RequestConfiguration, link->handle, &link->conf);
                   1298:            if (link->open) {
                   1299:                do_reset(dev,1);
                   1300:                netif_device_attach(dev);
                   1301:            }
                   1302:        }
                   1303:        break;
                   1304:     }
                   1305:     return 0;
                   1306: } /* xirc2ps_event */
                   1307: 
                   1308: /*====================================================================*/
                   1309: 
                   1310: /****************
                   1311:  * This is the Interrupt service route.
                   1312:  */
                   1313: static void
                   1314: xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                   1315: {
                   1316:     struct net_device *dev = (struct net_device *)dev_id;
                   1317:     local_info_t *lp = dev->priv;
                   1318:     ioaddr_t ioaddr;
                   1319:     u_char saved_page;
                   1320:     unsigned bytes_rcvd;
                   1321:     unsigned int_status, eth_status, rx_status, tx_status;
                   1322:     unsigned rsr, pktlen;
                   1323:     ulong start_ticks = jiffies; /* fixme: jiffies rollover every 497 days
                   1324:                                  * is this something to worry about?
                   1325:                                  * -- on a laptop?
                   1326:                                  */
                   1327: 
                   1328:     if (!netif_device_present(dev))
                   1329:        return;
                   1330: 
                   1331:     ioaddr = dev->base_addr;
                   1332:     if (lp->mohawk) { /* must disable the interrupt */
                   1333:        PutByte(XIRCREG_CR, 0);
                   1334:     }
                   1335: 
                   1336:     DEBUG(6, "%s: interrupt %d at %#x.\n", dev->name, irq, ioaddr);
                   1337: 
                   1338:     saved_page = GetByte(XIRCREG_PR);
                   1339:     /* Read the ISR to see whats the cause for the interrupt.
                   1340:      * This also clears the interrupt flags on CE2 cards
                   1341:      */
                   1342:     int_status = GetByte(XIRCREG_ISR);
                   1343:     bytes_rcvd = 0;
                   1344:   loop_entry:
                   1345:     if (int_status == 0xff) { /* card may be ejected */
                   1346:        DEBUG(3, "%s: interrupt %d for dead card\n", dev->name, irq);
                   1347:        goto leave;
                   1348:     }
                   1349:     eth_status = GetByte(XIRCREG_ESR);
                   1350: 
                   1351:     SelectPage(0x40);
                   1352:     rx_status  = GetByte(XIRCREG40_RXST0);
                   1353:     PutByte(XIRCREG40_RXST0, (~rx_status & 0xff));
                   1354:     tx_status = GetByte(XIRCREG40_TXST0);
                   1355:     tx_status |= GetByte(XIRCREG40_TXST1) << 8;
                   1356:     PutByte(XIRCREG40_TXST0, 0);
                   1357:     PutByte(XIRCREG40_TXST1, 0);
                   1358: 
                   1359:     DEBUG(3, "%s: ISR=%#2.2x ESR=%#2.2x RSR=%#2.2x TSR=%#4.4x\n",
                   1360:          dev->name, int_status, eth_status, rx_status, tx_status);
                   1361: 
                   1362:     /***** receive section ******/
                   1363:     SelectPage(0);
                   1364:     while (eth_status & FullPktRcvd) {
                   1365:        rsr = GetByte(XIRCREG0_RSR);
                   1366:        if (bytes_rcvd > maxrx_bytes && (rsr & PktRxOk)) {
                   1367:            /* too many bytes received during this int, drop the rest of the
                   1368:             * packets */
                   1369:            lp->stats.rx_dropped++;
                   1370:            DEBUG(2, "%s: RX drop, too much done\n", dev->name);
                   1371:        } else if (rsr & PktRxOk) {
                   1372:            struct sk_buff *skb;
                   1373: 
                   1374:            pktlen = GetWord(XIRCREG0_RBC);
                   1375:            bytes_rcvd += pktlen;
                   1376: 
                   1377:            DEBUG(5, "rsr=%#02x packet_length=%u\n", rsr, pktlen);
                   1378: 
                   1379:            skb = dev_alloc_skb(pktlen+3); /* 1 extra so we can use insw */
                   1380:            if (!skb) {
                   1381:                printk(KNOT_XIRC "low memory, packet dropped (size=%u)\n",
                   1382:                       pktlen);
                   1383:                lp->stats.rx_dropped++;
                   1384:            } else { /* okay get the packet */
                   1385:                skb_reserve(skb, 2);
                   1386:                if (lp->silicon == 0 ) { /* work around a hardware bug */
                   1387:                    unsigned rhsa; /* receive start address */
                   1388: 
                   1389:                    SelectPage(5);
                   1390:                    rhsa = GetWord(XIRCREG5_RHSA0);
                   1391:                    SelectPage(0);
                   1392:                    rhsa += 3; /* skip control infos */
                   1393:                    if (rhsa >= 0x8000)
                   1394:                        rhsa = 0;
                   1395:                    if (rhsa + pktlen > 0x8000) {
                   1396:                        unsigned i;
                   1397:                        u_char *buf = skb_put(skb, pktlen);
                   1398:                        for (i=0; i < pktlen ; i++, rhsa++) {
                   1399:                            buf[i] = GetByte(XIRCREG_EDP);
                   1400:                            if (rhsa == 0x8000) {
                   1401:                                rhsa = 0;
                   1402:                                i--;
                   1403:                            }
                   1404:                        }
                   1405:                    } else {
                   1406:                        insw(ioaddr+XIRCREG_EDP,
                   1407:                             skb_put(skb, pktlen), (pktlen+1)>>1);
                   1408:                    }
                   1409:                }
                   1410:              #if 0
                   1411:                else if (lp->mohawk) {
                   1412:                    /* To use this 32 bit access we should use
                   1413:                     * a manual optimized loop
                   1414:                     * Also the words are swapped, we can get more
                   1415:                     * performance by using 32 bit access and swapping
                   1416:                     * the words in a register. Will need this for cardbus
                   1417:                     *
                   1418:                     * Note: don't forget to change the ALLOC_SKB to .. +3
                   1419:                     */
                   1420:                    unsigned i;
                   1421:                    u_long *p = skb_put(skb, pktlen);
                   1422:                    register u_long a;
                   1423:                    ioaddr_t edpreg = ioaddr+XIRCREG_EDP-2;
                   1424:                    for (i=0; i < len ; i += 4, p++) {
                   1425:                        a = inl(edpreg);
                   1426:                        __asm__("rorl $16,%0\n\t"
                   1427:                                :"=q" (a)
                   1428:                                : "0" (a));
                   1429:                        *p = a;
                   1430:                    }
                   1431:                }
                   1432:              #endif
                   1433:                else {
                   1434:                    insw(ioaddr+XIRCREG_EDP, skb_put(skb, pktlen),
                   1435:                         (pktlen+1)>>1);
                   1436:                }
                   1437:                skb->protocol = eth_type_trans(skb, dev);
                   1438:                skb->dev = dev;
                   1439:                netif_rx(skb);
                   1440:                dev->last_rx = jiffies;
                   1441:                lp->stats.rx_packets++;
                   1442:                add_rx_bytes(&lp->stats, pktlen);
                   1443:                if (!(rsr & PhyPkt))
                   1444:                    lp->stats.multicast++;
                   1445:            }
                   1446:        } else { /* bad packet */
                   1447:            DEBUG(5, "rsr=%#02x\n", rsr);
                   1448:        }
                   1449:        if (rsr & PktTooLong) {
                   1450:            lp->stats.rx_frame_errors++;
                   1451:            DEBUG(3, "%s: Packet too long\n", dev->name);
                   1452:        }
                   1453:        if (rsr & CRCErr) {
                   1454:            lp->stats.rx_crc_errors++;
                   1455:            DEBUG(3, "%s: CRC error\n", dev->name);
                   1456:        }
                   1457:        if (rsr & AlignErr) {
                   1458:            lp->stats.rx_fifo_errors++; /* okay ? */
                   1459:            DEBUG(3, "%s: Alignment error\n", dev->name);
                   1460:        }
                   1461: 
                   1462:        /* clear the received/dropped/error packet */
                   1463:        PutWord(XIRCREG0_DO, 0x8000); /* issue cmd: skip_rx_packet */
                   1464: 
                   1465:        /* get the new ethernet status */
                   1466:        eth_status = GetByte(XIRCREG_ESR);
                   1467:     }
                   1468:     if (rx_status & 0x10) { /* Receive overrun */
                   1469:        lp->stats.rx_over_errors++;
                   1470:        PutByte(XIRCREG_CR, ClearRxOvrun);
                   1471:        DEBUG(3, "receive overrun cleared\n");
                   1472:     }
                   1473: 
                   1474:     /***** transmit section ******/
                   1475:     if (int_status & PktTxed) {
                   1476:        unsigned n, nn;
                   1477: 
                   1478:        n = lp->last_ptr_value;
                   1479:        nn = GetByte(XIRCREG0_PTR);
                   1480:        lp->last_ptr_value = nn;
                   1481:        if (nn < n) /* rollover */
                   1482:            lp->stats.tx_packets += 256 - n;
                   1483:        else if (n == nn) { /* happens sometimes - don't know why */
                   1484:            DEBUG(0, "PTR not changed?\n");
                   1485:        } else
                   1486:            lp->stats.tx_packets += lp->last_ptr_value - n;
                   1487:        netif_wake_queue(dev);
                   1488:     }
                   1489:     if (tx_status & 0x0002) {  /* Execessive collissions */
                   1490:        DEBUG(0, "tx restarted due to execssive collissions\n");
                   1491:        PutByte(XIRCREG_CR, RestartTx);  /* restart transmitter process */
                   1492:     }
                   1493:     if (tx_status & 0x0040)
                   1494:        lp->stats.tx_aborted_errors++;
                   1495: 
                   1496:     /* recalculate our work chunk so that we limit the duration of this
                   1497:      * ISR to about 1/10 of a second.
                   1498:      * Calculate only if we received a reasonable amount of bytes.
                   1499:      */
                   1500:     if (bytes_rcvd > 1000) {
                   1501:        u_long duration = jiffies - start_ticks;
                   1502: 
                   1503:        if (duration >= HZ/10) { /* if more than about 1/10 second */
                   1504:            maxrx_bytes = (bytes_rcvd * (HZ/10)) / duration;
                   1505:            if (maxrx_bytes < 2000)
                   1506:                maxrx_bytes = 2000;
                   1507:            else if (maxrx_bytes > 22000)
                   1508:                maxrx_bytes = 22000;
                   1509:            DEBUG(1, "set maxrx=%u (rcvd=%u ticks=%lu)\n",
                   1510:                  maxrx_bytes, bytes_rcvd, duration);
                   1511:        } else if (!duration && maxrx_bytes < 22000) {
                   1512:            /* now much faster */
                   1513:            maxrx_bytes += 2000;
                   1514:            if (maxrx_bytes > 22000)
                   1515:                maxrx_bytes = 22000;
                   1516:            DEBUG(1, "set maxrx=%u\n", maxrx_bytes);
                   1517:        }
                   1518:     }
                   1519: 
                   1520:   leave:
                   1521:     if (lockup_hack) {
                   1522:        if (int_status != 0xff && (int_status = GetByte(XIRCREG_ISR)) != 0)
                   1523:            goto loop_entry;
                   1524:     }
                   1525:     SelectPage(saved_page);
                   1526:     PutByte(XIRCREG_CR, EnableIntr);  /* re-enable interrupts */
                   1527:     /* Instead of dropping packets during a receive, we could
                   1528:      * force an interrupt with this command:
                   1529:      *   PutByte(XIRCREG_CR, EnableIntr|ForceIntr);
                   1530:      */
                   1531: } /* xirc2ps_interrupt */
                   1532: 
                   1533: /*====================================================================*/
                   1534: 
                   1535: static void
                   1536: do_tx_timeout(struct net_device *dev)
                   1537: {
                   1538:     local_info_t *lp = dev->priv;
                   1539:     printk(KERN_NOTICE "%s: transmit timed out\n", dev->name);
                   1540:     lp->stats.tx_errors++;
                   1541:     /* reset the card */
                   1542:     do_reset(dev,1);
                   1543:     dev->trans_start = jiffies;
                   1544:     netif_wake_queue(dev);
                   1545: }
                   1546: 
                   1547: static int
                   1548: do_start_xmit(struct sk_buff *skb, struct net_device *dev)
                   1549: {
                   1550:     local_info_t *lp = dev->priv;
                   1551:     ioaddr_t ioaddr = dev->base_addr;
                   1552:     int okay;
                   1553:     unsigned freespace;
                   1554:     unsigned pktlen = skb? skb->len : 0;
                   1555: 
                   1556:     DEBUG(1, "do_start_xmit(skb=%p, dev=%p) len=%u\n",
                   1557:          skb, dev, pktlen);
                   1558: 
                   1559:     tx_timeout_check(dev, do_tx_timeout);
                   1560:     skb_tx_check(dev, skb);
                   1561: 
                   1562:     /* adjust the packet length to min. required
                   1563:      * and hope that the buffer is large enough
                   1564:      * to provide some random data.
                   1565:      * fixme: For Mohawk we can change this by sending
                   1566:      * a larger packetlen than we actually have; the chip will
                   1567:      * pad this in his buffer with random bytes
                   1568:      */
                   1569:     if (pktlen < ETH_ZLEN)
                   1570:        pktlen = ETH_ZLEN;
                   1571: 
                   1572:     SelectPage(0);
                   1573:     PutWord(XIRCREG0_TRS, (u_short)pktlen+2);
                   1574:     freespace = GetWord(XIRCREG0_TSO);
                   1575:     okay = freespace & 0x8000;
                   1576:     freespace &= 0x7fff;
                   1577:     /* TRS doesn't work - (indeed it is eliminated with sil-rev 1) */
                   1578:     okay = pktlen +2 < freespace;
                   1579:     DEBUG(2 + (okay ? 2 : 0), "%s: avail. tx space=%u%s\n",
                   1580:          dev->name, freespace, okay ? " (okay)":" (not enough)");
                   1581:     if (!okay) { /* not enough space */
                   1582:        return 1;  /* upper layer may decide to requeue this packet */
                   1583:     }
                   1584:     /* send the packet */
                   1585:     PutWord(XIRCREG_EDP, (u_short)pktlen);
                   1586:     outsw(ioaddr+XIRCREG_EDP, skb->data, pktlen>>1);
                   1587:     if (pktlen & 1)
                   1588:        PutByte(XIRCREG_EDP, skb->data[pktlen-1]);
                   1589: 
                   1590:     if (lp->mohawk)
                   1591:        PutByte(XIRCREG_CR, TransmitPacket|EnableIntr);
                   1592: 
                   1593:     DEV_KFREE_SKB (skb);
                   1594:     dev->trans_start = jiffies;
                   1595:     add_tx_bytes(&lp->stats, pktlen);
                   1596:     netif_start_queue(dev);
                   1597:     return 0;
                   1598: }
                   1599: 
                   1600: static struct net_device_stats *
                   1601: do_get_stats(struct net_device *dev)
                   1602: {
                   1603:     local_info_t *lp = dev->priv;
                   1604: 
                   1605:     /* lp->stats.rx_missed_errors = GetByte(?) */
                   1606:     return &lp->stats;
                   1607: }
                   1608: 
                   1609: /****************
                   1610:  * Set all addresses: This first one is the individual address,
                   1611:  * the next 9 addresses are taken from the multicast list and
                   1612:  * the rest is filled with the individual address.
                   1613:  */
                   1614: static void
                   1615: set_addresses(struct net_device *dev)
                   1616: {
                   1617:     ioaddr_t ioaddr = dev->base_addr;
                   1618:     local_info_t *lp = dev->priv;
                   1619:     struct dev_mc_list *dmi = dev->mc_list;
                   1620:     char *addr;
                   1621:     int i,j,k,n;
                   1622: 
                   1623:     SelectPage(k=0x50);
                   1624:     for (i=0,j=8,n=0; ; i++, j++) {
                   1625:        if (i > 5) {
                   1626:            if (++n > 9)
                   1627:                break;
                   1628:            i = 0;
                   1629:        }
                   1630:        if (j > 15) {
                   1631:            j = 8;
                   1632:            k++;
                   1633:            SelectPage(k);
                   1634:        }
                   1635: 
                   1636:        if (n && n <= dev->mc_count && dmi) {
                   1637:            addr = dmi->dmi_addr;
                   1638:            dmi = dmi->next;
                   1639:        } else
                   1640:            addr = dev->dev_addr;
                   1641: 
                   1642:        if (lp->mohawk)
                   1643:            PutByte(j, addr[5-i]);
                   1644:        else
                   1645:            PutByte(j, addr[i]);
                   1646:     }
                   1647:     SelectPage(0);
                   1648: }
                   1649: 
                   1650: /****************
                   1651:  * Set or clear the multicast filter for this adaptor.
                   1652:  * We can filter up to 9 addresses, if more are requested we set
                   1653:  * multicast promiscuous mode.
                   1654:  */
                   1655: 
                   1656: static void
                   1657: set_multicast_list(struct net_device *dev)
                   1658: {
                   1659:     ioaddr_t ioaddr = dev->base_addr;
                   1660: 
                   1661:     SelectPage(0x42);
                   1662:     if (dev->flags & IFF_PROMISC) { /* snoop */
                   1663:        PutByte(XIRCREG42_SWC1, 0x06); /* set MPE and PME */
                   1664:     } else if (dev->mc_count > 9 || (dev->flags & IFF_ALLMULTI)) {
                   1665:        PutByte(XIRCREG42_SWC1, 0x06); /* set MPE */
                   1666:     } else if (dev->mc_count) {
                   1667:        /* the chip can filter 9 addresses perfectly */
                   1668:        PutByte(XIRCREG42_SWC1, 0x00);
                   1669:        SelectPage(0x40);
                   1670:        PutByte(XIRCREG40_CMD0, Offline);
                   1671:        set_addresses(dev);
                   1672:        SelectPage(0x40);
                   1673:        PutByte(XIRCREG40_CMD0, EnableRecv | Online);
                   1674:     } else { /* standard usage */
                   1675:        PutByte(XIRCREG42_SWC1, 0x00);
                   1676:     }
                   1677:     SelectPage(0);
                   1678: }
                   1679: 
                   1680: static int
                   1681: do_config(struct net_device *dev, struct ifmap *map)
                   1682: {
                   1683:     local_info_t *local = dev->priv;
                   1684: 
                   1685:     DEBUG(0, "do_config(%p)\n", dev);
                   1686:     if (map->port != 255 && map->port != dev->if_port) {
                   1687:        if (map->port > 4)
                   1688:            return -EINVAL;
                   1689:        if (!map->port) {
                   1690:            local->probe_port = 1;
                   1691:            dev->if_port = 1;
                   1692:        } else {
                   1693:            local->probe_port = 0;
                   1694:            dev->if_port = map->port;
                   1695:        }
                   1696:        printk(KERN_INFO "%s: switching to %s port\n",
                   1697:               dev->name, if_names[dev->if_port]);
                   1698:        do_reset(dev,1);  /* not the fine way :-) */
                   1699:     }
                   1700:     return 0;
                   1701: }
                   1702: 
                   1703: /****************
                   1704:  * Open the driver
                   1705:  */
                   1706: static int
                   1707: do_open(struct net_device *dev)
                   1708: {
                   1709:     local_info_t *lp = dev->priv;
                   1710:     dev_link_t *link = &lp->link;
                   1711: 
                   1712:     DEBUG(0, "do_open(%p)\n", dev);
                   1713: 
                   1714:     /* Check that the PCMCIA card is still here. */
                   1715:     /* Physical device present signature. */
                   1716:     if (!DEV_OK(link))
                   1717:        return -ENODEV;
                   1718: 
                   1719:     /* okay */
                   1720:     link->open++;
                   1721:     MOD_INC_USE_COUNT;
                   1722: 
                   1723:     netif_start_queue(dev);
                   1724:     netif_mark_up(dev);
                   1725:     do_reset(dev,1);
                   1726: 
                   1727:     return 0;
                   1728: }
                   1729: 
                   1730: static int
                   1731: do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                   1732: {
                   1733:     local_info_t *local = dev->priv;
                   1734:     ioaddr_t ioaddr = dev->base_addr;
                   1735:     u16 *data = (u16 *)&rq->ifr_data;
                   1736: 
                   1737:     DEBUG(1, "%s: ioctl(%-.6s, %#04x) %04x %04x %04x %04x\n",
                   1738:          dev->name, rq->ifr_ifrn.ifrn_name, cmd,
                   1739:          data[0], data[1], data[2], data[3]);
                   1740: 
                   1741:     if (!local->mohawk)
                   1742:        return -EOPNOTSUPP;
                   1743: 
                   1744:     switch(cmd) {
                   1745:       case SIOCDEVPRIVATE:     /* Get the address of the PHY in use. */
                   1746:        data[0] = 0;            /* we have only this address */
                   1747:        /* fall trough */
                   1748:       case SIOCDEVPRIVATE+1:   /* Read the specified MII register. */
                   1749:        data[3] = mii_rd(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
                   1750:        break;
                   1751:       case SIOCDEVPRIVATE+2:   /* Write the specified MII register */
                   1752:        if (!capable(CAP_NET_ADMIN))
                   1753:            return -EPERM;
                   1754:        mii_wr(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2], 16);
                   1755:        break;
                   1756:       default:
                   1757:        return -EOPNOTSUPP;
                   1758:     }
                   1759:     return 0;
                   1760: }
                   1761: 
                   1762: static void
                   1763: hardreset(struct net_device *dev)
                   1764: {
                   1765:     local_info_t *local = dev->priv;
                   1766:     ioaddr_t ioaddr = dev->base_addr;
                   1767: 
                   1768:     SelectPage(4);
                   1769:     udelay(1);
                   1770:     PutByte(XIRCREG4_GPR1, 0);      /* clear bit 0: power down */
                   1771:     busy_loop(HZ/25);               /* wait 40 msec */
                   1772:     if (local->mohawk)
                   1773:        PutByte(XIRCREG4_GPR1, 1);       /* set bit 0: power up */
                   1774:     else
                   1775:        PutByte(XIRCREG4_GPR1, 1 | 4);   /* set bit 0: power up, bit 2: AIC */
                   1776:     busy_loop(HZ/50);               /* wait 20 msec */
                   1777: }
                   1778: 
                   1779: static void
                   1780: do_reset(struct net_device *dev, int full)
                   1781: {
                   1782:     local_info_t *local = dev->priv;
                   1783:     ioaddr_t ioaddr = dev->base_addr;
                   1784:     unsigned value;
                   1785: 
                   1786:     DEBUG(0, "%s: do_reset(%p,%d)\n", dev? dev->name:"eth?", dev, full);
                   1787: 
                   1788:     hardreset(dev);
                   1789:     PutByte(XIRCREG_CR, SoftReset); /* set */
                   1790:     busy_loop(HZ/50);               /* wait 20 msec */
                   1791:     PutByte(XIRCREG_CR, 0);         /* clear */
                   1792:     busy_loop(HZ/25);               /* wait 40 msec */
                   1793:     if (local->mohawk) {
                   1794:        SelectPage(4);
                   1795:        /* set pin GP1 and GP2 to output  (0x0c)
                   1796:         * set GP1 to low to power up the ML6692 (0x00)
                   1797:         * set GP2 to high to power up the 10Mhz chip  (0x02)
                   1798:         */
                   1799:        PutByte(XIRCREG4_GPR0, 0x0e);
                   1800:     }
                   1801: 
                   1802:     /* give the circuits some time to power up */
                   1803:     busy_loop(HZ/2);           /* about 500ms */
                   1804: 
                   1805:     local->last_ptr_value = 0;
                   1806:     local->silicon = local->mohawk ? (GetByte(XIRCREG4_BOV) & 0x70) >> 4
                   1807:                                   : (GetByte(XIRCREG4_BOV) & 0x30) >> 4;
                   1808: 
                   1809:     if (local->probe_port) {
                   1810:        if (!local->mohawk) {
                   1811:            SelectPage(4);
                   1812:            PutByte(XIRCREG4_GPR0, 4);
                   1813:            local->probe_port = 0;
                   1814:        }
                   1815:     } else if (dev->if_port == 2) { /* enable 10Base2 */
                   1816:        SelectPage(0x42);
                   1817:        PutByte(XIRCREG42_SWC1, 0xC0);
                   1818:     } else { /* enable 10BaseT */
                   1819:        SelectPage(0x42);
                   1820:        PutByte(XIRCREG42_SWC1, 0x80);
                   1821:     }
                   1822:     busy_loop(HZ/25);               /* wait 40 msec to let it complete */
                   1823: 
                   1824:   #ifdef PCMCIA_DEBUG
                   1825:     if (pc_debug) {
                   1826:        SelectPage(0);
                   1827:        value = GetByte(XIRCREG_ESR);    /* read the ESR */
                   1828:        printk(KERN_DEBUG "%s: ESR is: %#02x\n", dev->name, value);
                   1829:     }
                   1830:   #endif
                   1831: 
                   1832:     /* setup the ECR */
                   1833:     SelectPage(1);
                   1834:     PutByte(XIRCREG1_IMR0, 0xff); /* allow all ints */
                   1835:     PutByte(XIRCREG1_IMR1, 1   ); /* and Set TxUnderrunDetect */
                   1836:     value = GetByte(XIRCREG1_ECR);
                   1837:   #if 0
                   1838:     if (local->mohawk)
                   1839:        value |= DisableLinkPulse;
                   1840:     PutByte(XIRCREG1_ECR, value);
                   1841:   #endif
                   1842:     DEBUG(0, "%s: ECR is: %#02x\n", dev->name, value);
                   1843: 
                   1844:     SelectPage(0x42);
                   1845:     PutByte(XIRCREG42_SWC0, 0x20); /* disable source insertion */
                   1846: 
                   1847:     if (local->silicon != 1) {
                   1848:        /* set the local memory dividing line.
                   1849:         * The comments in the sample code say that this is only
                   1850:         * settable with the scipper version 2 which is revision 0.
                   1851:         * Always for CE3 cards
                   1852:         */
                   1853:        SelectPage(2);
                   1854:        PutWord(XIRCREG2_RBS, 0x2000);
                   1855:     }
                   1856: 
                   1857:     if (full)
                   1858:        set_addresses(dev);
                   1859: 
                   1860:     /* Hardware workaround:
                   1861:      * The receive byte pointer after reset is off by 1 so we need
                   1862:      * to move the offset pointer back to 0.
                   1863:      */
                   1864:     SelectPage(0);
                   1865:     PutWord(XIRCREG0_DO, 0x2000); /* change offset command, off=0 */
                   1866: 
                   1867:     /* setup MAC IMRs and clear status registers */
                   1868:     SelectPage(0x40);               /* Bit 7 ... bit 0 */
                   1869:     PutByte(XIRCREG40_RMASK0, 0xff); /* ROK, RAB, rsv, RO, CRC, AE, PTL, MP */
                   1870:     PutByte(XIRCREG40_TMASK0, 0xff); /* TOK, TAB, SQE, LL, TU, JAB, EXC, CRS */
                   1871:     PutByte(XIRCREG40_TMASK1, 0xb0); /* rsv, rsv, PTD, EXT, rsv,rsv,rsv, rsv*/
                   1872:     PutByte(XIRCREG40_RXST0,  0x00); /* ROK, RAB, REN, RO, CRC, AE, PTL, MP */
                   1873:     PutByte(XIRCREG40_TXST0,  0x00); /* TOK, TAB, SQE, LL, TU, JAB, EXC, CRS */
                   1874:     PutByte(XIRCREG40_TXST1,  0x00); /* TEN, rsv, PTD, EXT, retry_counter:4  */
                   1875: 
                   1876:     if (full && local->mohawk && init_mii(dev)) {
                   1877:        if (dev->if_port == 4 || local->dingo || local->new_mii) {
                   1878:            printk(KERN_INFO "%s: MII selected\n", dev->name);
                   1879:            SelectPage(2);
                   1880:            PutByte(XIRCREG2_MSR, GetByte(XIRCREG2_MSR) | 0x08);
                   1881:            busy_loop(HZ/50);
                   1882:        } else {
                   1883:            printk(KERN_INFO "%s: MII detected; using 10mbs\n",
                   1884:                   dev->name);
                   1885:            SelectPage(0x42);
                   1886:            if (dev->if_port == 2) /* enable 10Base2 */
                   1887:                PutByte(XIRCREG42_SWC1, 0xC0);
                   1888:            else  /* enable 10BaseT */
                   1889:                PutByte(XIRCREG42_SWC1, 0x80);
                   1890:            busy_loop(HZ/25);   /* wait 40 msec to let it complete */
                   1891:        }
                   1892:        if (full_duplex)
                   1893:            PutByte(XIRCREG1_ECR, GetByte(XIRCREG1_ECR | FullDuplex));
                   1894:     } else {  /* No MII */
                   1895:        SelectPage(0);
                   1896:        value = GetByte(XIRCREG_ESR);    /* read the ESR */
                   1897:        dev->if_port = (value & MediaSelect) ? 1 : 2;
                   1898:     }
                   1899: 
                   1900:     /* configure the LEDs */
                   1901:     SelectPage(2);
                   1902:     if (dev->if_port == 1 || dev->if_port == 4) /* TP: Link and Activity */
                   1903:        PutByte(XIRCREG2_LED, 0x3b);
                   1904:     else                             /* Coax: Not-Collision and Activity */
                   1905:        PutByte(XIRCREG2_LED, 0x3a);
                   1906: 
                   1907:     if (local->dingo)
                   1908:        PutByte(0x0b, 0x04); /* 100 Mbit LED */
                   1909: 
                   1910:     /* enable receiver and put the mac online */
                   1911:     if (full) {
                   1912:        SelectPage(0x40);
                   1913:        PutByte(XIRCREG40_CMD0, EnableRecv | Online);
                   1914:     }
                   1915: 
                   1916:     /* setup Ethernet IMR and enable interrupts */
                   1917:     SelectPage(1);
                   1918:     PutByte(XIRCREG1_IMR0, 0xff);
                   1919:     udelay(1);
                   1920:     SelectPage(0);
                   1921:     PutByte(XIRCREG_CR, EnableIntr);
                   1922:     if (local->modem && !local->dingo) { /* do some magic */
                   1923:        if (!(GetByte(0x10) & 0x01))
                   1924:            PutByte(0x10, 0x11); /* unmask master-int bit */
                   1925:     }
                   1926: 
                   1927:     if (full)
                   1928:        printk(KERN_INFO "%s: media %s, silicon revision %d\n",
                   1929:               dev->name, if_names[dev->if_port], local->silicon);
                   1930:     /* We should switch back to page 0 to avoid a bug in revision 0
                   1931:      * where regs with offset below 8 can't be read after an access
                   1932:      * to the MAC registers */
                   1933:     SelectPage(0);
                   1934: }
                   1935: 
                   1936: /****************
                   1937:  * Initialize the Media-Independent-Interface
                   1938:  * Returns: True if we have a good MII
                   1939:  */
                   1940: static int
                   1941: init_mii(struct net_device *dev)
                   1942: {
                   1943:     local_info_t *local = dev->priv;
                   1944:     ioaddr_t ioaddr = dev->base_addr;
                   1945:     unsigned control, status, linkpartner;
                   1946:     int i;
                   1947: 
                   1948:     if (if_port == 4 || if_port == 1) { /* force 100BaseT or 10BaseT */
                   1949:        dev->if_port = if_port;
                   1950:        local->probe_port = 0;
                   1951:        return 1;
                   1952:     }
                   1953: 
                   1954:     status = mii_rd(ioaddr,  0, 1);
                   1955:     if ((status & 0xff00) != 0x7800)
                   1956:        return 0; /* No MII */
                   1957: 
                   1958:     local->new_mii = (mii_rd(ioaddr, 0, 2) != 0xffff);
                   1959:     
                   1960:     if (local->probe_port)
                   1961:        control = 0x1000; /* auto neg */
                   1962:     else if (dev->if_port == 4)
                   1963:        control = 0x2000; /* no auto neg, 100mbs mode */
                   1964:     else
                   1965:        control = 0x0000; /* no auto neg, 10mbs mode */
                   1966:     mii_wr(ioaddr,  0, 0, control, 16);
                   1967:     udelay(100);
                   1968:     control = mii_rd(ioaddr, 0, 0);
                   1969: 
                   1970:     if (control & 0x0400) {
                   1971:        printk(KERN_NOTICE "%s can't take PHY out of isolation mode\n",
                   1972:               dev->name);
                   1973:        local->probe_port = 0;
                   1974:        return 0;
                   1975:     }
                   1976: 
                   1977:     if (local->probe_port) {
                   1978:        /* according to the DP83840A specs the auto negotiation process
                   1979:         * may take up to 3.5 sec, so we use this also for our ML6692
                   1980:         * Fixme: Better to use a timer here!
                   1981:         */
                   1982:        for (i=0; i < 35; i++) {
                   1983:            busy_loop(HZ/10);    /* wait 100 msec */
                   1984:            status = mii_rd(ioaddr,  0, 1);
                   1985:            if ((status & 0x0020) && (status & 0x0004))
                   1986:                break;
                   1987:        }
                   1988: 
                   1989:        if (!(status & 0x0020)) {
                   1990:            printk(KERN_INFO "%s: autonegotiation failed;"
                   1991:                   " using 10mbs\n", dev->name);
                   1992:            if (!local->new_mii) {
                   1993:                control = 0x0000;
                   1994:                mii_wr(ioaddr,  0, 0, control, 16);
                   1995:                udelay(100);
                   1996:                SelectPage(0);
                   1997:                dev->if_port = (GetByte(XIRCREG_ESR) & MediaSelect) ? 1 : 2;
                   1998:            }
                   1999:        } else {
                   2000:            linkpartner = mii_rd(ioaddr, 0, 5);
                   2001:            printk(KERN_INFO "%s: MII link partner: %04x\n",
                   2002:                   dev->name, linkpartner);
                   2003:            if (linkpartner & 0x0080) {
                   2004:                dev->if_port = 4;
                   2005:            } else
                   2006:                dev->if_port = 1;
                   2007:        }
                   2008:     }
                   2009: 
                   2010:     return 1;
                   2011: }
                   2012: 
                   2013: static void
                   2014: do_powerdown(struct net_device *dev)
                   2015: {
                   2016: 
                   2017:     ioaddr_t ioaddr = dev->base_addr;
                   2018: 
                   2019:     DEBUG(0, "do_powerdown(%p)\n", dev);
                   2020: 
                   2021:     SelectPage(4);
                   2022:     PutByte(XIRCREG4_GPR1, 0);      /* clear bit 0: power down */
                   2023:     SelectPage(0);
                   2024: }
                   2025: 
                   2026: static int
                   2027: do_stop(struct net_device *dev)
                   2028: {
                   2029:     ioaddr_t ioaddr = dev->base_addr;
                   2030:     local_info_t *lp = dev->priv;
                   2031:     dev_link_t *link = &lp->link;
                   2032: 
                   2033:     DEBUG(0, "do_stop(%p)\n", dev);
                   2034: 
                   2035:     if (!link)
                   2036:        return -ENODEV;
                   2037: 
                   2038:     netif_stop_queue(dev);
                   2039:     netif_mark_down(dev);
                   2040: 
                   2041:     SelectPage(0);
                   2042:     PutByte(XIRCREG_CR, 0);  /* disable interrupts */
                   2043:     SelectPage(0x01);
                   2044:     PutByte(XIRCREG1_IMR0, 0x00); /* forbid all ints */
                   2045:     SelectPage(4);
                   2046:     PutByte(XIRCREG4_GPR1, 0); /* clear bit 0: power down */
                   2047:     SelectPage(0);
                   2048: 
                   2049:     link->open--;
                   2050:     if (link->state & DEV_STALE_CONFIG)
                   2051:        mod_timer(&link->release, jiffies + HZ/20);
                   2052: 
                   2053:     MOD_DEC_USE_COUNT;
                   2054: 
                   2055:     return 0;
                   2056: }
                   2057: 
                   2058: static int __init
                   2059: init_xirc2ps_cs(void)
                   2060: {
                   2061:     servinfo_t serv;
                   2062: 
                   2063:     printk(KERN_INFO "%s\n", version);
                   2064:     if (lockup_hack)
                   2065:        printk(KINF_XIRC "lockup hack is enabled\n");
                   2066:     CardServices(GetCardServicesInfo, &serv);
                   2067:     if (serv.Revision != CS_RELEASE_CODE) {
                   2068:        printk(KNOT_XIRC "Card Services release does not match!\n");
                   2069:        return -EINVAL;
                   2070:     }
                   2071:     DEBUG(0, "pc_debug=%d\n", pc_debug);
                   2072:     register_pccard_driver(&dev_info, &xirc2ps_attach, &xirc2ps_detach);
                   2073:     return 0;
                   2074: }
                   2075: 
                   2076: static void __exit
                   2077: exit_xirc2ps_cs(void)
                   2078: {
                   2079:     DEBUG(0, "unloading\n");
                   2080:     unregister_pccard_driver(&dev_info);
                   2081:     while (dev_list) {
                   2082:        if (dev_list->state & DEV_CONFIG)
                   2083:            xirc2ps_release((u_long)dev_list);
                   2084:        if (dev_list)   /* xirc2ps_release() might already have detached... */
                   2085:            xirc2ps_detach(dev_list);
                   2086:     }
                   2087: }
                   2088: 
                   2089: module_init(init_xirc2ps_cs);
                   2090: module_exit(exit_xirc2ps_cs);
                   2091: 

unix.superglobalmegacorp.com

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