|
|
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: ®))) { ! 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: ®))) { ! 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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.