|
|
1.1 ! root 1: /*------------------------------------------------------------------------ ! 2: . smc9194.c ! 3: . This is a driver for SMC's 9000 series of Ethernet cards. ! 4: . ! 5: . Copyright (C) 1996 by Erik Stahlman ! 6: . This software may be used and distributed according to the terms ! 7: . of the GNU Public License, incorporated herein by reference. ! 8: . ! 9: . "Features" of the SMC chip: ! 10: . 4608 byte packet memory. ( for the 91C92. Others have more ) ! 11: . EEPROM for configuration ! 12: . AUI/TP selection ( mine has 10Base2/10BaseT select ) ! 13: . ! 14: . Arguments: ! 15: . io = for the base address ! 16: . irq = for the IRQ ! 17: . ifport = 0 for autodetect, 1 for TP, 2 for AUI ( or 10base2 ) ! 18: . ! 19: . author: ! 20: . Erik Stahlman ( [email protected] ) ! 21: . ! 22: . Hardware multicast code from Peter Cammaert ( [email protected] ) ! 23: . ! 24: . Sources: ! 25: . o SMC databook ! 26: . o skeleton.c by Donald Becker ( [email protected] ) ! 27: . o ( a LOT of advice from Becker as well ) ! 28: . ! 29: . History: ! 30: . 12/07/95 Erik Stahlman written, got receive/xmit handled ! 31: . 01/03/96 Erik Stahlman worked out some bugs, actually usable!!! :-) ! 32: . 01/06/96 Erik Stahlman cleaned up some, better testing, etc ! 33: . 01/29/96 Erik Stahlman fixed autoirq, added multicast ! 34: . 02/01/96 Erik Stahlman 1. disabled all interrupts in smc_reset ! 35: . 2. got rid of post-decrementing bug -- UGH. ! 36: . 02/13/96 Erik Stahlman Tried to fix autoirq failure. Added more ! 37: . descriptive error messages. ! 38: . 02/15/96 Erik Stahlman Fixed typo that caused detection failure ! 39: . 02/23/96 Erik Stahlman Modified it to fit into kernel tree ! 40: . Added support to change hardware address ! 41: . Cleared stats on opens ! 42: . 02/26/96 Erik Stahlman Trial support for Kernel 1.2.13 ! 43: . Kludge for automatic IRQ detection ! 44: . 03/04/96 Erik Stahlman Fixed kernel 1.3.70 + ! 45: . Fixed bug reported by Gardner Buchanan in ! 46: . smc_enable, with outw instead of outb ! 47: . 03/06/96 Erik Stahlman Added hardware multicast from Peter Cammaert ! 48: ----------------------------------------------------------------------------*/ ! 49: ! 50: static const char *version = ! 51: "smc9194.c:v0.12 03/06/96 by Erik Stahlman ([email protected])\n"; ! 52: ! 53: #ifdef MODULE ! 54: #include <linux/module.h> ! 55: #include <linux/version.h> ! 56: #endif ! 57: ! 58: #include <linux/kernel.h> ! 59: #include <linux/sched.h> ! 60: #include <linux/types.h> ! 61: #include <linux/fcntl.h> ! 62: #include <linux/interrupt.h> ! 63: #include <linux/ptrace.h> ! 64: #include <linux/ioport.h> ! 65: #include <linux/in.h> ! 66: #include <linux/malloc.h> ! 67: #include <linux/string.h> ! 68: #include <linux/ioport.h> ! 69: #include <asm/bitops.h> ! 70: #include <asm/io.h> ! 71: #include <linux/errno.h> ! 72: ! 73: #include <linux/netdevice.h> ! 74: #include <linux/etherdevice.h> ! 75: #include <linux/skbuff.h> ! 76: ! 77: #include "smc9194.h" ! 78: /*------------------------------------------------------------------------ ! 79: . ! 80: . Configuration options, for the experienced user to change. ! 81: . ! 82: -------------------------------------------------------------------------*/ ! 83: ! 84: /* ! 85: . this is for kernels > 1.2.70 ! 86: */ ! 87: #define REALLY_NEW_KERNEL ! 88: #ifndef REALLY_NEW_KERNEL ! 89: #define free_irq( x, y ) free_irq( x ) ! 90: #define request_irq( x, y, z, u, v ) request_irq( x, y, z, u ) ! 91: #endif ! 92: ! 93: /* ! 94: . Do you want to use this with old kernels. ! 95: . WARNING: this is not well tested. ! 96: #define SUPPORT_OLD_KERNEL ! 97: */ ! 98: ! 99: ! 100: /* ! 101: . Do you want to use 32 bit xfers? This should work on all chips, as ! 102: . the chipset is designed to accommodate them. ! 103: */ ! 104: #define USE_32_BIT 1 ! 105: ! 106: /* ! 107: .the SMC9194 can be at any of the following port addresses. To change, ! 108: .for a slightly different card, you can add it to the array. Keep in ! 109: .mind that the array must end in zero. ! 110: */ ! 111: static unsigned int smc_portlist[] = ! 112: { 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, ! 113: 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x3E0, 0}; ! 114: ! 115: /* ! 116: . Wait time for memory to be free. This probably shouldn't be ! 117: . tuned that much, as waiting for this means nothing else happens ! 118: . in the system ! 119: */ ! 120: #define MEMORY_WAIT_TIME 16 ! 121: ! 122: /* ! 123: . DEBUGGING LEVELS ! 124: . ! 125: . 0 for normal operation ! 126: . 1 for slightly more details ! 127: . >2 for various levels of increasingly useless information ! 128: . 2 for interrupt tracking, status flags ! 129: . 3 for packet dumps, etc. ! 130: */ ! 131: #define SMC_DEBUG 0 ! 132: ! 133: #if (SMC_DEBUG > 2 ) ! 134: #define PRINTK3(x) printk x ! 135: #else ! 136: #define PRINTK3(x) ! 137: #endif ! 138: ! 139: #if SMC_DEBUG > 1 ! 140: #define PRINTK2(x) printk x ! 141: #else ! 142: #define PRINTK2(x) ! 143: #endif ! 144: ! 145: #ifdef SMC_DEBUG ! 146: #define PRINTK(x) printk x ! 147: #else ! 148: #define PRINTK(x) ! 149: #endif ! 150: ! 151: ! 152: /* the older versions of the kernel cannot support autoprobing */ ! 153: #ifdef SUPPORT_OLD_KERNEL ! 154: #define NO_AUTOPROBE ! 155: #endif ! 156: ! 157: ! 158: /*------------------------------------------------------------------------ ! 159: . ! 160: . The internal workings of the driver. If you are changing anything ! 161: . here with the SMC stuff, you should have the datasheet and known ! 162: . what you are doing. ! 163: . ! 164: -------------------------------------------------------------------------*/ ! 165: #define CARDNAME "SMC9194" ! 166: ! 167: #ifdef SUPPORT_OLD_KERNEL ! 168: char kernel_version[] = UTS_RELEASE; ! 169: #endif ! 170: ! 171: /* store this information for the driver.. */ ! 172: struct smc_local { ! 173: /* ! 174: these are things that the kernel wants me to keep, so users ! 175: can find out semi-useless statistics of how well the card is ! 176: performing ! 177: */ ! 178: struct enet_statistics stats; ! 179: ! 180: /* ! 181: If I have to wait until memory is available to send ! 182: a packet, I will store the skbuff here, until I get the ! 183: desired memory. Then, I'll send it out and free it. ! 184: */ ! 185: struct sk_buff * saved_skb; ! 186: ! 187: /* ! 188: . This keeps track of how many packets that I have ! 189: . sent out. When an TX_EMPTY interrupt comes, I know ! 190: . that all of these have been sent. ! 191: */ ! 192: int packets_waiting; ! 193: }; ! 194: ! 195: ! 196: /*----------------------------------------------------------------- ! 197: . ! 198: . The driver can be entered at any of the following entry points. ! 199: . ! 200: .------------------------------------------------------------------ */ ! 201: ! 202: /* ! 203: . This is called by register_netdev(). It is responsible for ! 204: . checking the portlist for the SMC9000 series chipset. If it finds ! 205: . one, then it will initialize the device, find the hardware information, ! 206: . and sets up the appropriate device parameters. ! 207: . NOTE: Interrupts are *OFF* when this procedure is called. ! 208: . ! 209: . NB:This shouldn't be static since it is referred to externally. ! 210: */ ! 211: int smc_init(struct device *dev); ! 212: ! 213: /* ! 214: . The kernel calls this function when someone wants to use the device, ! 215: . typically 'ifconfig ethX up'. ! 216: */ ! 217: static int smc_open(struct device *dev); ! 218: ! 219: /* ! 220: . This is called by the kernel to send a packet out into the net. it's ! 221: . responsible for doing a best-effort send, but if it's simply not possible ! 222: . to send it, the packet gets dropped. ! 223: */ ! 224: static int smc_send_packet(struct sk_buff *skb, struct device *dev); ! 225: ! 226: /* ! 227: . This is called by the kernel in response to 'ifconfig ethX down'. It ! 228: . is responsible for cleaning up everything that the open routine ! 229: . does, and maybe putting the card into a powerdown state. ! 230: */ ! 231: static int smc_close(struct device *dev); ! 232: ! 233: /* ! 234: . This routine allows the proc file system to query the driver's ! 235: . statistics. ! 236: */ ! 237: static struct enet_statistics * smc_query_statistics( struct device *dev); ! 238: ! 239: /* ! 240: . Finally, a call to set promiscuous mode ( for TCPDUMP and related ! 241: . programs ) and multicast modes. ! 242: */ ! 243: #ifdef SUPPORT_OLD_KERNEL ! 244: static void smc_set_multicast_list(struct device *dev, int num_addrs, ! 245: void *addrs); ! 246: #else ! 247: static void smc_set_multicast_list(struct device *dev); ! 248: #endif ! 249: ! 250: /*--------------------------------------------------------------- ! 251: . ! 252: . Interrupt level calls.. ! 253: . ! 254: ----------------------------------------------------------------*/ ! 255: ! 256: /* ! 257: . Handles the actual interrupt ! 258: */ ! 259: #ifdef REALLY_NEW_KERNEL ! 260: static void smc_interrupt(int irq, void *, struct pt_regs *regs); ! 261: #else ! 262: static void smc_interrupt(int irq, struct pt_regs *regs); ! 263: #endif ! 264: /* ! 265: . This is a separate procedure to handle the receipt of a packet, to ! 266: . leave the interrupt code looking slightly cleaner ! 267: */ ! 268: inline static void smc_rcv( struct device *dev ); ! 269: /* ! 270: . This handles a TX interrupt, which is only called when an error ! 271: . relating to a packet is sent. ! 272: */ ! 273: inline static void smc_tx( struct device * dev ); ! 274: ! 275: /* ! 276: ------------------------------------------------------------ ! 277: . ! 278: . Internal routines ! 279: . ! 280: ------------------------------------------------------------ ! 281: */ ! 282: ! 283: /* ! 284: . Test if a given location contains a chip, trying to cause as ! 285: . little damage as possible if it's not a SMC chip. ! 286: */ ! 287: static int smc_probe( int ioaddr ); ! 288: ! 289: /* ! 290: . this routine initializes the cards hardware, prints out the configuration ! 291: . to the system log as well as the vanity message, and handles the setup ! 292: . of a device parameter. ! 293: . It will give an error if it can't initialize the card. ! 294: */ ! 295: static int smc_initcard( struct device *, int ioaddr ); ! 296: ! 297: /* ! 298: . A rather simple routine to print out a packet for debugging purposes. ! 299: */ ! 300: #if SMC_DEBUG > 2 ! 301: static void print_packet( byte *, int ); ! 302: #endif ! 303: ! 304: #define tx_done(dev) 1 ! 305: ! 306: /* this is called to actually send the packet to the chip */ ! 307: static void smc_hardware_send_packet( struct device * dev ); ! 308: ! 309: /* Since I am not sure if I will have enough room in the chip's ram ! 310: . to store the packet, I call this routine, which either sends it ! 311: . now, or generates an interrupt when the card is ready for the ! 312: . packet */ ! 313: static int smc_wait_to_send_packet( struct sk_buff * skb, struct device *dev ); ! 314: ! 315: /* this does a soft reset on the device */ ! 316: static void smc_reset( int ioaddr ); ! 317: ! 318: /* Enable Interrupts, Receive, and Transmit */ ! 319: static void smc_enable( int ioaddr ); ! 320: ! 321: /* this puts the device in an inactive state */ ! 322: static void smc_shutdown( int ioaddr ); ! 323: ! 324: #ifndef NO_AUTOPROBE ! 325: /* This routine will find the IRQ of the driver if one is not ! 326: . specified in the input to the device. */ ! 327: static int smc_findirq( int ioaddr ); ! 328: #endif ! 329: ! 330: /* ! 331: this routine will set the hardware multicast table to the specified ! 332: values given it by the higher level routines ! 333: */ ! 334: #ifndef SUPPORT_OLD_KERNEL ! 335: static void smc_setmulticast( int ioaddr, int count, struct dev_mc_list * ); ! 336: static int crc32( char *, int ); ! 337: #endif ! 338: ! 339: #ifdef SUPPORT_OLD_KERNEL ! 340: extern struct device *init_etherdev(struct device *dev, int sizeof_private, ! 341: unsigned long *mem_startp ); ! 342: #endif ! 343: ! 344: /* ! 345: . Function: smc_reset( int ioaddr ) ! 346: . Purpose: ! 347: . This sets the SMC91xx chip to its normal state, hopefully from whatever ! 348: . mess that any other DOS driver has put it in. ! 349: . ! 350: . Maybe I should reset more registers to defaults in here? SOFTRESET should ! 351: . do that for me. ! 352: . ! 353: . Method: ! 354: . 1. send a SOFT RESET ! 355: . 2. wait for it to finish ! 356: . 3. enable autorelease mode ! 357: . 4. reset the memory management unit ! 358: . 5. clear all interrupts ! 359: . ! 360: */ ! 361: static void smc_reset( int ioaddr ) ! 362: { ! 363: /* This resets the registers mostly to defaults, but doesn't ! 364: affect EEPROM. That seems unnecessary */ ! 365: SMC_SELECT_BANK( 0 ); ! 366: outw( RCR_SOFTRESET, ioaddr + RCR ); ! 367: ! 368: /* this should pause enough for the chip to be happy */ ! 369: SMC_DELAY( ); ! 370: ! 371: /* Set the transmit and receive configuration registers to ! 372: default values */ ! 373: outw( RCR_CLEAR, ioaddr + RCR ); ! 374: outw( TCR_CLEAR, ioaddr + TCR ); ! 375: ! 376: /* set the control register to automatically ! 377: release successfully transmitted packets, to make the best ! 378: use out of our limited memory */ ! 379: SMC_SELECT_BANK( 1 ); ! 380: outw( inw( ioaddr + CONTROL ) | CTL_AUTO_RELEASE , ioaddr + CONTROL ); ! 381: ! 382: /* Reset the MMU */ ! 383: SMC_SELECT_BANK( 2 ); ! 384: outw( MC_RESET, ioaddr + MMU_CMD ); ! 385: ! 386: /* Note: It doesn't seem that waiting for the MMU busy is needed here, ! 387: but this is a place where future chipsets _COULD_ break. Be wary ! 388: of issuing another MMU command right after this */ ! 389: ! 390: outb( 0, ioaddr + INT_MASK ); ! 391: } ! 392: ! 393: /* ! 394: . Function: smc_enable ! 395: . Purpose: let the chip talk to the outside work ! 396: . Method: ! 397: . 1. Enable the transmitter ! 398: . 2. Enable the receiver ! 399: . 3. Enable interrupts ! 400: */ ! 401: static void smc_enable( int ioaddr ) ! 402: { ! 403: SMC_SELECT_BANK( 0 ); ! 404: /* see the header file for options in TCR/RCR NORMAL*/ ! 405: outw( TCR_NORMAL, ioaddr + TCR ); ! 406: outw( RCR_NORMAL, ioaddr + RCR ); ! 407: ! 408: /* now, enable interrupts */ ! 409: SMC_SELECT_BANK( 2 ); ! 410: outb( SMC_INTERRUPT_MASK, ioaddr + INT_MASK ); ! 411: } ! 412: ! 413: /* ! 414: . Function: smc_shutdown ! 415: . Purpose: closes down the SMC91xxx chip. ! 416: . Method: ! 417: . 1. zero the interrupt mask ! 418: . 2. clear the enable receive flag ! 419: . 3. clear the enable xmit flags ! 420: . ! 421: . TODO: ! 422: . (1) maybe utilize power down mode. ! 423: . Why not yet? Because while the chip will go into power down mode, ! 424: . the manual says that it will wake up in response to any I/O requests ! 425: . in the register space. Empirical results do not show this working. ! 426: */ ! 427: static void smc_shutdown( int ioaddr ) ! 428: { ! 429: /* no more interrupts for me */ ! 430: SMC_SELECT_BANK( 2 ); ! 431: outb( 0, ioaddr + INT_MASK ); ! 432: ! 433: /* and tell the card to stay away from that nasty outside world */ ! 434: SMC_SELECT_BANK( 0 ); ! 435: outb( RCR_CLEAR, ioaddr + RCR ); ! 436: outb( TCR_CLEAR, ioaddr + TCR ); ! 437: #if 0 ! 438: /* finally, shut the chip down */ ! 439: SMC_SELECT_BANK( 1 ); ! 440: outw( inw( ioaddr + CONTROL ), CTL_POWERDOWN, ioaddr + CONTROL ); ! 441: #endif ! 442: } ! 443: ! 444: ! 445: #ifndef SUPPORT_OLD_KERNEL ! 446: /* ! 447: . Function: smc_setmulticast( int ioaddr, int count, dev_mc_list * adds ) ! 448: . Purpose: ! 449: . This sets the internal hardware table to filter out unwanted multicast ! 450: . packets before they take up memory. ! 451: . ! 452: . The SMC chip uses a hash table where the high 6 bits of the CRC of ! 453: . address are the offset into the table. If that bit is 1, then the ! 454: . multicast packet is accepted. Otherwise, it's dropped silently. ! 455: . ! 456: . To use the 6 bits as an offset into the table, the high 3 bits are the ! 457: . number of the 8 bit register, while the low 3 bits are the bit within ! 458: . that register. ! 459: . ! 460: . This routine is based very heavily on the one provided by Peter Cammaert. ! 461: */ ! 462: ! 463: ! 464: static void smc_setmulticast( int ioaddr, int count, struct dev_mc_list * addrs ) { ! 465: int i; ! 466: unsigned char multicast_table[ 8 ]; ! 467: struct dev_mc_list * cur_addr; ! 468: /* table for flipping the order of 3 bits */ ! 469: unsigned char invert3[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; ! 470: ! 471: /* start with a table of all zeros: reject all */ ! 472: memset( multicast_table, 0, sizeof( multicast_table ) ); ! 473: ! 474: cur_addr = addrs; ! 475: for ( i = 0; i < count ; i ++, cur_addr = cur_addr->next ) { ! 476: int position; ! 477: ! 478: /* do we have a pointer here? */ ! 479: if ( !cur_addr ) ! 480: break; ! 481: /* make sure this is a multicast address - shouldn't this ! 482: be a given if we have it here ? */ ! 483: if ( !( *cur_addr->dmi_addr & 1 ) ) ! 484: continue; ! 485: ! 486: /* only use the low order bits */ ! 487: position = crc32( cur_addr->dmi_addr, 6 ) & 0x3f; ! 488: ! 489: /* do some messy swapping to put the bit in the right spot */ ! 490: multicast_table[invert3[position&7]] |= ! 491: (1<<invert3[(position>>3)&7]); ! 492: ! 493: } ! 494: /* now, the table can be loaded into the chipset */ ! 495: SMC_SELECT_BANK( 3 ); ! 496: ! 497: for ( i = 0; i < 8 ; i++ ) { ! 498: outb( multicast_table[i], ioaddr + MULTICAST1 + i ); ! 499: } ! 500: } ! 501: ! 502: /* ! 503: Finds the CRC32 of a set of bytes. ! 504: Again, from Peter Cammaert's code. ! 505: */ ! 506: static int crc32( char * s, int length ) { ! 507: /* indices */ ! 508: int perByte; ! 509: int perBit; ! 510: /* crc polynomial for Ethernet */ ! 511: const unsigned long poly = 0xedb88320; ! 512: /* crc value - preinitialized to all 1's */ ! 513: unsigned long crc_value = 0xffffffff; ! 514: ! 515: for ( perByte = 0; perByte < length; perByte ++ ) { ! 516: unsigned char c; ! 517: ! 518: c = *(s++); ! 519: for ( perBit = 0; perBit < 8; perBit++ ) { ! 520: crc_value = (crc_value>>1)^ ! 521: (((crc_value^c)&0x01)?poly:0); ! 522: c >>= 1; ! 523: } ! 524: } ! 525: return crc_value; ! 526: } ! 527: ! 528: #endif ! 529: ! 530: ! 531: /* ! 532: . Function: smc_wait_to_send_packet( struct sk_buff * skb, struct device * ) ! 533: . Purpose: ! 534: . Attempt to allocate memory for a packet, if chip-memory is not ! 535: . available, then tell the card to generate an interrupt when it ! 536: . is available. ! 537: . ! 538: . Algorithm: ! 539: . ! 540: . o if the saved_skb is not currently null, then drop this packet ! 541: . on the floor. This should never happen, because of TBUSY. ! 542: . o if the saved_skb is null, then replace it with the current packet, ! 543: . o See if I can sending it now. ! 544: . o (NO): Enable interrupts and let the interrupt handler deal with it. ! 545: . o (YES):Send it now. ! 546: */ ! 547: static int smc_wait_to_send_packet( struct sk_buff * skb, struct device * dev ) ! 548: { ! 549: struct smc_local *lp = (struct smc_local *)dev->priv; ! 550: unsigned short ioaddr = dev->base_addr; ! 551: word length; ! 552: unsigned short numPages; ! 553: word time_out; ! 554: ! 555: if ( lp->saved_skb) { ! 556: /* THIS SHOULD NEVER HAPPEN. */ ! 557: lp->stats.tx_aborted_errors++; ! 558: printk(CARDNAME": Bad Craziness - sent packet while busy.\n" ); ! 559: return 1; ! 560: } ! 561: lp->saved_skb = skb; ! 562: ! 563: length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ! 564: ! 565: /* ! 566: . the MMU wants the number of pages to be the number of 256 bytes ! 567: . 'pages', minus 1 ( since a packet can't ever have 0 pages :) ) ! 568: */ ! 569: numPages = length / 256; ! 570: ! 571: if (numPages > 7 ) { ! 572: printk(CARDNAME": Far too big packet error. \n"); ! 573: /* freeing the packet is a good thing here... but should ! 574: . any packets of this size get down here? */ ! 575: dev_kfree_skb (skb, FREE_WRITE); ! 576: lp->saved_skb = NULL; ! 577: /* this IS an error, but, i don't want the skb saved */ ! 578: return 0; ! 579: } ! 580: /* either way, a packet is waiting now */ ! 581: lp->packets_waiting++; ! 582: ! 583: /* now, try to allocate the memory */ ! 584: SMC_SELECT_BANK( 2 ); ! 585: outw( MC_ALLOC | numPages, ioaddr + MMU_CMD ); ! 586: /* ! 587: . Performance Hack ! 588: . ! 589: . wait a short amount of time.. if I can send a packet now, I send ! 590: . it now. Otherwise, I enable an interrupt and wait for one to be ! 591: . available. ! 592: . ! 593: . I could have handled this a slightly different way, by checking to ! 594: . see if any memory was available in the FREE MEMORY register. However, ! 595: . either way, I need to generate an allocation, and the allocation works ! 596: . no matter what, so I saw no point in checking free memory. ! 597: */ ! 598: time_out = MEMORY_WAIT_TIME; ! 599: do { ! 600: word status; ! 601: ! 602: status = inb( ioaddr + INTERRUPT ); ! 603: if ( status & IM_ALLOC_INT ) { ! 604: /* acknowledge the interrupt */ ! 605: outb( IM_ALLOC_INT, ioaddr + INTERRUPT ); ! 606: break; ! 607: } ! 608: } while ( -- time_out ); ! 609: ! 610: if ( !time_out ) { ! 611: /* oh well, wait until the chip finds memory later */ ! 612: SMC_ENABLE_INT( IM_ALLOC_INT ); ! 613: PRINTK2((CARDNAME": memory allocation deferred. \n")); ! 614: /* it's deferred, but I'll handle it later */ ! 615: return 0; ! 616: } ! 617: /* or YES! I can send the packet now.. */ ! 618: smc_hardware_send_packet(dev); ! 619: ! 620: return 0; ! 621: } ! 622: ! 623: /* ! 624: . Function: smc_hardware_send_packet(struct device * ) ! 625: . Purpose: ! 626: . This sends the actual packet to the SMC9xxx chip. ! 627: . ! 628: . Algorithm: ! 629: . First, see if a saved_skb is available. ! 630: . ( this should NOT be called if there is no 'saved_skb' ! 631: . Now, find the packet number that the chip allocated ! 632: . Point the data pointers at it in memory ! 633: . Set the length word in the chip's memory ! 634: . Dump the packet to chip memory ! 635: . Check if a last byte is needed ( odd length packet ) ! 636: . if so, set the control flag right ! 637: . Tell the card to send it ! 638: . Enable the transmit interrupt, so I know if it failed ! 639: . Free the kernel data if I actually sent it. ! 640: */ ! 641: static void smc_hardware_send_packet( struct device * dev ) ! 642: { ! 643: struct smc_local *lp = (struct smc_local *)dev->priv; ! 644: byte packet_no; ! 645: struct sk_buff * skb = lp->saved_skb; ! 646: word length; ! 647: unsigned short ioaddr; ! 648: byte * buf; ! 649: ! 650: ioaddr = dev->base_addr; ! 651: ! 652: if ( !skb ) { ! 653: PRINTK((CARDNAME": In XMIT with no packet to send \n")); ! 654: return; ! 655: } ! 656: length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; ! 657: buf = skb->data; ! 658: ! 659: /* If I get here, I _know_ there is a packet slot waiting for me */ ! 660: packet_no = inb( ioaddr + PNR_ARR + 1 ); ! 661: if ( packet_no & 0x80 ) { ! 662: /* or isn't there? BAD CHIP! */ ! 663: printk(KERN_DEBUG CARDNAME": Memory allocation failed. \n"); ! 664: kfree(skb); ! 665: lp->saved_skb = NULL; ! 666: dev->tbusy = 0; ! 667: return; ! 668: } ! 669: ! 670: /* we have a packet address, so tell the card to use it */ ! 671: outb( packet_no, ioaddr + PNR_ARR ); ! 672: ! 673: /* point to the beginning of the packet */ ! 674: outw( PTR_AUTOINC , ioaddr + POINTER ); ! 675: ! 676: PRINTK3((CARDNAME": Trying to xmit packet of length %x\n", length )); ! 677: #if SMC_DEBUG > 2 ! 678: print_packet( buf, length ); ! 679: #endif ! 680: ! 681: /* send the packet length ( +6 for status, length and ctl byte ) ! 682: and the status word ( set to zeros ) */ ! 683: #ifdef USE_32_BIT ! 684: outl( (length +6 ) << 16 , ioaddr + DATA_1 ); ! 685: #else ! 686: outw( 0, ioaddr + DATA_1 ); ! 687: /* send the packet length ( +6 for status words, length, and ctl*/ ! 688: outb( (length+6) & 0xFF,ioaddr + DATA_1 ); ! 689: outb( (length+6) >> 8 , ioaddr + DATA_1 ); ! 690: #endif ! 691: ! 692: /* send the actual data ! 693: . I _think_ it's faster to send the longs first, and then ! 694: . mop up by sending the last word. It depends heavily ! 695: . on alignment, at least on the 486. Maybe it would be ! 696: . a good idea to check which is optimal? But that could take ! 697: . almost as much time as is saved? ! 698: */ ! 699: #ifdef USE_32_BIT ! 700: if ( length & 0x2 ) { ! 701: outsl(ioaddr + DATA_1, buf, length >> 2 ); ! 702: outw( *((word *)(buf + (length & 0xFFFFFFFC))),ioaddr +DATA_1); ! 703: } ! 704: else ! 705: outsl(ioaddr + DATA_1, buf, length >> 2 ); ! 706: #else ! 707: outsw(ioaddr + DATA_1 , buf, (length ) >> 1); ! 708: #endif ! 709: /* Send the last byte, if there is one. */ ! 710: ! 711: if ( (length & 1) == 0 ) { ! 712: outw( 0, ioaddr + DATA_1 ); ! 713: } else { ! 714: outb( buf[length -1 ], ioaddr + DATA_1 ); ! 715: outb( 0x20, ioaddr + DATA_1); ! 716: } ! 717: ! 718: /* enable the interrupts */ ! 719: SMC_ENABLE_INT( (IM_TX_INT | IM_TX_EMPTY_INT) ); ! 720: ! 721: /* and let the chipset deal with it */ ! 722: outw( MC_ENQUEUE , ioaddr + MMU_CMD ); ! 723: ! 724: PRINTK2((CARDNAME": Sent packet of length %d \n",length)); ! 725: ! 726: lp->saved_skb = NULL; ! 727: dev_kfree_skb (skb, FREE_WRITE); ! 728: ! 729: dev->trans_start = jiffies; ! 730: ! 731: /* we can send another packet */ ! 732: dev->tbusy = 0; ! 733: ! 734: ! 735: return; ! 736: } ! 737: ! 738: /*------------------------------------------------------------------------- ! 739: | ! 740: | smc_init( struct device * dev ) ! 741: | Input parameters: ! 742: | dev->base_addr == 0, try to find all possible locations ! 743: | dev->base_addr == 1, return failure code ! 744: | dev->base_addr == 2, always allocate space, and return success ! 745: | dev->base_addr == <anything else> this is the address to check ! 746: | ! 747: | Output: ! 748: | 0 --> there is a device ! 749: | anything else, error ! 750: | ! 751: --------------------------------------------------------------------------- ! 752: */ ! 753: int smc_init(struct device *dev) ! 754: { ! 755: int i; ! 756: int base_addr = dev ? dev->base_addr : 0; ! 757: ! 758: /* try a specific location */ ! 759: if (base_addr > 0x1ff) { ! 760: int error; ! 761: error = smc_probe(base_addr); ! 762: if ( 0 == error ) { ! 763: return smc_initcard( dev, base_addr ); ! 764: } ! 765: return error; ! 766: } else { ! 767: if ( 0 != base_addr ) { ! 768: return -ENXIO; ! 769: } ! 770: } ! 771: ! 772: /* check every ethernet address */ ! 773: for (i = 0; smc_portlist[i]; i++) { ! 774: int ioaddr = smc_portlist[i]; ! 775: ! 776: /* check if the area is available */ ! 777: if (check_region( ioaddr , SMC_IO_EXTENT)) ! 778: continue; ! 779: ! 780: /* check this specific address */ ! 781: if ( smc_probe( ioaddr ) == 0) { ! 782: return smc_initcard( dev, ioaddr ); ! 783: } ! 784: } ! 785: ! 786: /* couldn't find anything */ ! 787: return -ENODEV; ! 788: } ! 789: ! 790: #ifndef NO_AUTOPROBE ! 791: /*---------------------------------------------------------------------- ! 792: . smc_findirq ! 793: . ! 794: . This routine has a simple purpose -- make the SMC chip generate an ! 795: . interrupt, so an auto-detect routine can detect it, and find the IRQ, ! 796: ------------------------------------------------------------------------ ! 797: */ ! 798: int smc_findirq( int ioaddr ) ! 799: { ! 800: int timeout = 20; ! 801: ! 802: ! 803: /* I have to do a STI() here, because this is called from ! 804: a routine that does an CLI during this process, making it ! 805: rather difficult to get interrupts for auto detection */ ! 806: sti(); ! 807: ! 808: autoirq_setup( 0 ); ! 809: ! 810: /* ! 811: * What I try to do here is trigger an ALLOC_INT. This is done ! 812: * by allocating a small chunk of memory, which will give an interrupt ! 813: * when done. ! 814: */ ! 815: ! 816: ! 817: SMC_SELECT_BANK(2); ! 818: /* enable ALLOCation interrupts ONLY */ ! 819: outb( IM_ALLOC_INT, ioaddr + INT_MASK ); ! 820: ! 821: /* ! 822: . Allocate 512 bytes of memory. Note that the chip was just ! 823: . reset so all the memory is available ! 824: */ ! 825: outw( MC_ALLOC | 1, ioaddr + MMU_CMD ); ! 826: ! 827: /* ! 828: . Wait until positive that the interrupt has been generated ! 829: */ ! 830: while ( timeout ) { ! 831: byte int_status; ! 832: ! 833: int_status = inb( ioaddr + INTERRUPT ); ! 834: ! 835: if ( int_status & IM_ALLOC_INT ) ! 836: break; /* got the interrupt */ ! 837: timeout--; ! 838: } ! 839: /* there is really nothing that I can do here if timeout fails, ! 840: as autoirq_report will return a 0 anyway, which is what I ! 841: want in this case. Plus, the clean up is needed in both ! 842: cases. */ ! 843: ! 844: /* DELAY HERE! ! 845: On a fast machine, the status might change before the interrupt ! 846: is given to the processor. This means that the interrupt was ! 847: never detected, and autoirq_report fails to report anything. ! 848: This should fix autoirq_* problems. ! 849: */ ! 850: SMC_DELAY(); ! 851: SMC_DELAY(); ! 852: ! 853: /* and disable all interrupts again */ ! 854: outb( 0, ioaddr + INT_MASK ); ! 855: ! 856: /* clear hardware interrupts again, because that's how it ! 857: was when I was called... */ ! 858: cli(); ! 859: ! 860: /* and return what I found */ ! 861: return autoirq_report( 0 ); ! 862: } ! 863: #endif ! 864: ! 865: /*---------------------------------------------------------------------- ! 866: . Function: smc_probe( int ioaddr ) ! 867: . ! 868: . Purpose: ! 869: . Tests to see if a given ioaddr points to an SMC9xxx chip. ! 870: . Returns a 0 on success ! 871: . ! 872: . Algorithm: ! 873: . (1) see if the high byte of BANK_SELECT is 0x33 ! 874: . (2) compare the ioaddr with the base register's address ! 875: . (3) see if I recognize the chip ID in the appropriate register ! 876: . ! 877: .--------------------------------------------------------------------- ! 878: */ ! 879: ! 880: static int smc_probe( int ioaddr ) ! 881: { ! 882: unsigned int bank; ! 883: word revision_register; ! 884: word base_address_register; ! 885: ! 886: /* First, see if the high byte is 0x33 */ ! 887: bank = inw( ioaddr + BANK_SELECT ); ! 888: if ( (bank & 0xFF00) != 0x3300 ) { ! 889: return -ENODEV; ! 890: } ! 891: /* The above MIGHT indicate a device, but I need to write to further ! 892: test this. */ ! 893: outw( 0x0, ioaddr + BANK_SELECT ); ! 894: bank = inw( ioaddr + BANK_SELECT ); ! 895: if ( (bank & 0xFF00 ) != 0x3300 ) { ! 896: return -ENODEV; ! 897: } ! 898: /* well, we've already written once, so hopefully another time won't ! 899: hurt. This time, I need to switch the bank register to bank 1, ! 900: so I can access the base address register */ ! 901: SMC_SELECT_BANK(1); ! 902: base_address_register = inw( ioaddr + BASE ); ! 903: if ( ioaddr != ( base_address_register >> 3 & 0x3E0 ) ) { ! 904: printk(CARDNAME ": IOADDR %x doesn't match configuration (%x)." ! 905: "Probably not a SMC chip\n", ! 906: ioaddr, base_address_register >> 3 & 0x3E0 ); ! 907: /* well, the base address register didn't match. Must not have ! 908: been a SMC chip after all. */ ! 909: return -ENODEV; ! 910: } ! 911: ! 912: /* check if the revision register is something that I recognize. ! 913: These might need to be added to later, as future revisions ! 914: could be added. */ ! 915: SMC_SELECT_BANK(3); ! 916: revision_register = inw( ioaddr + REVISION ); ! 917: if ( !chip_ids[ ( revision_register >> 4 ) & 0xF ] ) { ! 918: /* I don't recognize this chip, so... */ ! 919: printk(CARDNAME ": IO %x: Unrecognized revision register:" ! 920: " %x, Contact author. \n", ioaddr, revision_register ); ! 921: ! 922: return -ENODEV; ! 923: } ! 924: ! 925: /* at this point I'll assume that the chip is an SMC9xxx. ! 926: It might be prudent to check a listing of MAC addresses ! 927: against the hardware address, or do some other tests. */ ! 928: return 0; ! 929: } ! 930: ! 931: /*--------------------------------------------------------------- ! 932: . Here I do typical initialization tasks. ! 933: . ! 934: . o Initialize the structure if needed ! 935: . o print out my vanity message if not done so already ! 936: . o print out what type of hardware is detected ! 937: . o print out the ethernet address ! 938: . o find the IRQ ! 939: . o set up my private data ! 940: . o configure the dev structure with my subroutines ! 941: . o actually GRAB the irq. ! 942: . o GRAB the region ! 943: .----------------------------------------------------------------- ! 944: */ ! 945: static int smc_initcard(struct device *dev, int ioaddr) ! 946: { ! 947: int i; ! 948: ! 949: static unsigned version_printed = 0; ! 950: ! 951: /* registers */ ! 952: word revision_register; ! 953: word configuration_register; ! 954: word memory_info_register; ! 955: word memory_cfg_register; ! 956: ! 957: const char * version_string; ! 958: const char * if_string; ! 959: int memory; ! 960: ! 961: int irqval; ! 962: ! 963: /* see if I need to initialize the ethernet card structure */ ! 964: if (dev == NULL) { ! 965: #ifdef SUPPORT_OLD_KERNEL ! 966: #ifndef MODULE ! 967: /* note: the old module interface does not support this call */ ! 968: dev = init_etherdev( 0, sizeof( struct smc_local ), 0 ); ! 969: #endif ! 970: #else ! 971: dev = init_etherdev(0, 0); ! 972: #endif ! 973: if (dev == NULL) ! 974: return -ENOMEM; ! 975: } ! 976: ! 977: if (version_printed++ == 0) ! 978: printk("%s", version); ! 979: ! 980: /* fill in some of the fields */ ! 981: dev->base_addr = ioaddr; ! 982: ! 983: /* ! 984: . Get the MAC address ( bank 1, regs 4 - 9 ) ! 985: */ ! 986: SMC_SELECT_BANK( 1 ); ! 987: for ( i = 0; i < 6; i += 2 ) { ! 988: word address; ! 989: ! 990: address = inw( ioaddr + ADDR0 + i ); ! 991: dev->dev_addr[ i + 1] = address >> 8; ! 992: dev->dev_addr[ i ] = address & 0xFF; ! 993: } ! 994: ! 995: /* get the memory information */ ! 996: ! 997: SMC_SELECT_BANK( 0 ); ! 998: memory_info_register = inw( ioaddr + MIR ); ! 999: memory_cfg_register = inw( ioaddr + MCR ); ! 1000: memory = ( memory_cfg_register >> 9 ) & 0x7; /* multiplier */ ! 1001: memory *= 256 * ( memory_info_register & 0xFF ); ! 1002: ! 1003: /* ! 1004: Now, I want to find out more about the chip. This is sort of ! 1005: redundant, but it's cleaner to have it in both, rather than having ! 1006: one VERY long probe procedure. ! 1007: */ ! 1008: SMC_SELECT_BANK(3); ! 1009: revision_register = inw( ioaddr + REVISION ); ! 1010: version_string = chip_ids[ ( revision_register >> 4 ) & 0xF ]; ! 1011: if ( !version_string ) { ! 1012: /* I shouldn't get here because this call was done before.... */ ! 1013: return -ENODEV; ! 1014: } ! 1015: ! 1016: /* is it using AUI or 10BaseT ? */ ! 1017: if ( dev->if_port == 0 ) { ! 1018: SMC_SELECT_BANK(1); ! 1019: configuration_register = inw( ioaddr + CONFIG ); ! 1020: if ( configuration_register & CFG_AUI_SELECT ) ! 1021: dev->if_port = 2; ! 1022: else ! 1023: dev->if_port = 1; ! 1024: } ! 1025: if_string = interfaces[ dev->if_port - 1 ]; ! 1026: ! 1027: /* now, reset the chip, and put it into a known state */ ! 1028: smc_reset( ioaddr ); ! 1029: ! 1030: /* ! 1031: . If dev->irq is 0, then the device has to be banged on to see ! 1032: . what the IRQ is. ! 1033: . ! 1034: . This banging doesn't always detect the IRQ, for unknown reasons. ! 1035: . a workaround is to reset the chip and try again. ! 1036: . ! 1037: . Interestingly, the DOS packet driver *SETS* the IRQ on the card to ! 1038: . be what is requested on the command line. I don't do that, mostly ! 1039: . because the card that I have uses a non-standard method of accessing ! 1040: . the IRQs, and because this _should_ work in most configurations. ! 1041: . ! 1042: . Specifying an IRQ is done with the assumption that the user knows ! 1043: . what (s)he is doing. No checking is done!!!! ! 1044: . ! 1045: */ ! 1046: #ifndef NO_AUTOPROBE ! 1047: if ( dev->irq < 2 ) { ! 1048: int trials; ! 1049: ! 1050: trials = 3; ! 1051: while ( trials-- ) { ! 1052: dev->irq = smc_findirq( ioaddr ); ! 1053: if ( dev->irq ) ! 1054: break; ! 1055: /* kick the card and try again */ ! 1056: smc_reset( ioaddr ); ! 1057: } ! 1058: } ! 1059: if (dev->irq == 0 ) { ! 1060: printk(CARDNAME": Couldn't autodetect your IRQ. Use irq=xx.\n"); ! 1061: return -ENODEV; ! 1062: } ! 1063: #else ! 1064: if (dev->irq == 0 ) { ! 1065: printk(CARDNAME ! 1066: ": Autoprobing IRQs is not supported for old kernels.\n"); ! 1067: return -ENODEV; ! 1068: } ! 1069: #endif ! 1070: if (dev->irq == 2) { ! 1071: /* Fixup for users that don't know that IRQ 2 is really IRQ 9, ! 1072: * or don't know which one to set. ! 1073: */ ! 1074: dev->irq = 9; ! 1075: } ! 1076: ! 1077: /* now, print out the card info, in a short format.. */ ! 1078: ! 1079: printk(CARDNAME ": %s(r:%d) at %#3x IRQ:%d INTF:%s MEM:%db ", ! 1080: version_string, revision_register & 0xF, ioaddr, dev->irq, ! 1081: if_string, memory ); ! 1082: /* ! 1083: . Print the Ethernet address ! 1084: */ ! 1085: printk("ADDR: "); ! 1086: for (i = 0; i < 5; i++) ! 1087: printk("%2.2x:", dev->dev_addr[i] ); ! 1088: printk("%2.2x \n", dev->dev_addr[5] ); ! 1089: ! 1090: ! 1091: /* Initialize the private structure. */ ! 1092: if (dev->priv == NULL) { ! 1093: dev->priv = kmalloc(sizeof(struct smc_local), GFP_KERNEL); ! 1094: if (dev->priv == NULL) ! 1095: return -ENOMEM; ! 1096: } ! 1097: /* set the private data to zero by default */ ! 1098: memset(dev->priv, 0, sizeof(struct smc_local)); ! 1099: ! 1100: /* Fill in the fields of the device structure with ethernet values. */ ! 1101: ether_setup(dev); ! 1102: ! 1103: /* Grab the IRQ */ ! 1104: irqval = request_irq(dev->irq, &smc_interrupt, 0, CARDNAME, NULL); ! 1105: if (irqval) { ! 1106: printk(CARDNAME": unable to get IRQ %d (irqval=%d).\n", ! 1107: dev->irq, irqval); ! 1108: return -EAGAIN; ! 1109: } ! 1110: irq2dev_map[dev->irq] = dev; ! 1111: ! 1112: /* Grab the region so that no one else tries to probe our ioports. */ ! 1113: request_region(ioaddr, SMC_IO_EXTENT, CARDNAME); ! 1114: ! 1115: dev->open = smc_open; ! 1116: dev->stop = smc_close; ! 1117: dev->hard_start_xmit = smc_send_packet; ! 1118: dev->get_stats = smc_query_statistics; ! 1119: #ifdef HAVE_MULTICAST ! 1120: dev->set_multicast_list = &smc_set_multicast_list; ! 1121: #endif ! 1122: ! 1123: return 0; ! 1124: } ! 1125: ! 1126: #if SMC_DEBUG > 2 ! 1127: static void print_packet( byte * buf, int length ) ! 1128: { ! 1129: #if 0 ! 1130: int i; ! 1131: int remainder; ! 1132: int lines; ! 1133: ! 1134: printk("Packet of length %d \n", length ); ! 1135: lines = length / 16; ! 1136: remainder = length % 16; ! 1137: ! 1138: for ( i = 0; i < lines ; i ++ ) { ! 1139: int cur; ! 1140: ! 1141: for ( cur = 0; cur < 8; cur ++ ) { ! 1142: byte a, b; ! 1143: ! 1144: a = *(buf ++ ); ! 1145: b = *(buf ++ ); ! 1146: printk("%02x%02x ", a, b ); ! 1147: } ! 1148: printk("\n"); ! 1149: } ! 1150: for ( i = 0; i < remainder/2 ; i++ ) { ! 1151: byte a, b; ! 1152: ! 1153: a = *(buf ++ ); ! 1154: b = *(buf ++ ); ! 1155: printk("%02x%02x ", a, b ); ! 1156: } ! 1157: printk("\n"); ! 1158: #endif ! 1159: } ! 1160: #endif ! 1161: ! 1162: ! 1163: /* ! 1164: * Open and Initialize the board ! 1165: * ! 1166: * Set up everything, reset the card, etc .. ! 1167: * ! 1168: */ ! 1169: static int smc_open(struct device *dev) ! 1170: { ! 1171: int ioaddr = dev->base_addr; ! 1172: ! 1173: int i; /* used to set hw ethernet address */ ! 1174: ! 1175: /* clear out all the junk that was put here before... */ ! 1176: memset(dev->priv, 0, sizeof(struct smc_local)); ! 1177: ! 1178: dev->tbusy = 0; ! 1179: dev->interrupt = 0; ! 1180: dev->start = 1; ! 1181: #ifdef MODULE ! 1182: MOD_INC_USE_COUNT; ! 1183: #endif ! 1184: ! 1185: /* reset the hardware */ ! 1186: ! 1187: smc_reset( ioaddr ); ! 1188: smc_enable( ioaddr ); ! 1189: ! 1190: /* Select which interface to use */ ! 1191: ! 1192: SMC_SELECT_BANK( 1 ); ! 1193: if ( dev->if_port == 1 ) { ! 1194: outw( inw( ioaddr + CONFIG ) & ~CFG_AUI_SELECT, ! 1195: ioaddr + CONFIG ); ! 1196: } ! 1197: else if ( dev->if_port == 2 ) { ! 1198: outw( inw( ioaddr + CONFIG ) | CFG_AUI_SELECT, ! 1199: ioaddr + CONFIG ); ! 1200: } ! 1201: ! 1202: /* ! 1203: According to Becker, I have to set the hardware address ! 1204: at this point, because the (l)user can set it with an ! 1205: ioctl. Easily done... ! 1206: */ ! 1207: SMC_SELECT_BANK( 1 ); ! 1208: for ( i = 0; i < 6; i += 2 ) { ! 1209: word address; ! 1210: ! 1211: address = dev->dev_addr[ i + 1 ] << 8 ; ! 1212: address |= dev->dev_addr[ i ]; ! 1213: outw( address, ioaddr + ADDR0 + i ); ! 1214: } ! 1215: return 0; ! 1216: } ! 1217: ! 1218: /*-------------------------------------------------------- ! 1219: . Called by the kernel to send a packet out into the void ! 1220: . of the net. This routine is largely based on ! 1221: . skeleton.c, from Becker. ! 1222: .-------------------------------------------------------- ! 1223: */ ! 1224: static int smc_send_packet(struct sk_buff *skb, struct device *dev) ! 1225: { ! 1226: if (dev->tbusy) { ! 1227: /* If we get here, some higher level has decided we are broken. ! 1228: There should really be a "kick me" function call instead. */ ! 1229: int tickssofar = jiffies - dev->trans_start; ! 1230: if (tickssofar < 5) ! 1231: return 1; ! 1232: printk(KERN_WARNING CARDNAME": transmit timed out, %s?\n", ! 1233: tx_done(dev) ? "IRQ conflict" : ! 1234: "network cable problem"); ! 1235: /* "kick" the adaptor */ ! 1236: smc_reset( dev->base_addr ); ! 1237: smc_enable( dev->base_addr ); ! 1238: ! 1239: dev->tbusy = 0; ! 1240: dev->trans_start = jiffies; ! 1241: /* clear anything saved */ ! 1242: ((struct smc_local *)dev->priv)->saved_skb = NULL; ! 1243: } ! 1244: ! 1245: /* If some higher layer thinks we've missed an tx-done interrupt ! 1246: we are passed NULL. Caution: dev_tint() handles the cli()/sti() ! 1247: itself. */ ! 1248: if (skb == NULL) { ! 1249: dev_tint(dev); ! 1250: return 0; ! 1251: } ! 1252: ! 1253: /* Block a timer-based transmit from overlapping. This could better be ! 1254: done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */ ! 1255: if (set_bit(0, (void*)&dev->tbusy) != 0) { ! 1256: printk(KERN_WARNING CARDNAME": Transmitter access conflict.\n"); ! 1257: dev_kfree_skb (skb, FREE_WRITE); ! 1258: } else { ! 1259: /* Well, I want to send the packet.. but I don't know ! 1260: if I can send it right now... */ ! 1261: return smc_wait_to_send_packet( skb, dev ); ! 1262: } ! 1263: return 0; ! 1264: } ! 1265: ! 1266: /*-------------------------------------------------------------------- ! 1267: . ! 1268: . This is the main routine of the driver, to handle the device when ! 1269: . it needs some attention. ! 1270: . ! 1271: . So: ! 1272: . first, save state of the chipset ! 1273: . branch off into routines to handle each case, and acknowledge ! 1274: . each to the interrupt register ! 1275: . and finally restore state. ! 1276: . ! 1277: ---------------------------------------------------------------------*/ ! 1278: #ifdef REALLY_NEW_KERNEL ! 1279: static void smc_interrupt(int irq, void * dev_id, struct pt_regs * regs) ! 1280: #else ! 1281: static void smc_interrupt(int irq, struct pt_regs * regs) ! 1282: #endif ! 1283: { ! 1284: struct device *dev = (struct device *)(irq2dev_map[irq]); ! 1285: int ioaddr = dev->base_addr; ! 1286: struct smc_local *lp = (struct smc_local *)dev->priv; ! 1287: ! 1288: byte status; ! 1289: word card_stats; ! 1290: byte mask; ! 1291: int timeout; ! 1292: /* state registers */ ! 1293: word saved_bank; ! 1294: word saved_pointer; ! 1295: ! 1296: ! 1297: ! 1298: PRINTK3((CARDNAME": SMC interrupt started \n")); ! 1299: ! 1300: if (dev == NULL) { ! 1301: printk(KERN_WARNING CARDNAME": irq %d for unknown device.\n", ! 1302: irq); ! 1303: return; ! 1304: } ! 1305: ! 1306: /* will Linux let this happen ?? If not, this costs some speed */ ! 1307: if ( dev->interrupt ) { ! 1308: printk(KERN_WARNING CARDNAME": interrupt inside interrupt.\n"); ! 1309: return; ! 1310: } ! 1311: ! 1312: dev->interrupt = 1; ! 1313: ! 1314: saved_bank = inw( ioaddr + BANK_SELECT ); ! 1315: ! 1316: SMC_SELECT_BANK(2); ! 1317: saved_pointer = inw( ioaddr + POINTER ); ! 1318: ! 1319: mask = inb( ioaddr + INT_MASK ); ! 1320: /* clear all interrupts */ ! 1321: outb( 0, ioaddr + INT_MASK ); ! 1322: ! 1323: ! 1324: /* set a timeout value, so I don't stay here forever */ ! 1325: timeout = 4; ! 1326: ! 1327: PRINTK2((KERN_WARNING CARDNAME ": MASK IS %x \n", mask )); ! 1328: do { ! 1329: /* read the status flag, and mask it */ ! 1330: status = inb( ioaddr + INTERRUPT ) & mask; ! 1331: if (!status ) ! 1332: break; ! 1333: ! 1334: PRINTK3((KERN_WARNING CARDNAME ! 1335: ": Handling interrupt status %x \n", status )); ! 1336: ! 1337: if (status & IM_RCV_INT) { ! 1338: /* Got a packet(s). */ ! 1339: PRINTK2((KERN_WARNING CARDNAME ! 1340: ": Receive Interrupt\n")); ! 1341: smc_rcv(dev); ! 1342: } else if (status & IM_TX_INT ) { ! 1343: PRINTK2((KERN_WARNING CARDNAME ! 1344: ": TX ERROR handled\n")); ! 1345: smc_tx(dev); ! 1346: outb(IM_TX_INT, ioaddr + INTERRUPT ); ! 1347: } else if (status & IM_TX_EMPTY_INT ) { ! 1348: /* update stats */ ! 1349: SMC_SELECT_BANK( 0 ); ! 1350: card_stats = inw( ioaddr + COUNTER ); ! 1351: /* single collisions */ ! 1352: lp->stats.collisions += card_stats & 0xF; ! 1353: card_stats >>= 4; ! 1354: /* multiple collisions */ ! 1355: lp->stats.collisions += card_stats & 0xF; ! 1356: ! 1357: /* these are for when linux supports these statistics */ ! 1358: #if 0 ! 1359: card_stats >>= 4; ! 1360: /* deferred */ ! 1361: card_stats >>= 4; ! 1362: /* excess deferred */ ! 1363: #endif ! 1364: SMC_SELECT_BANK( 2 ); ! 1365: PRINTK2((KERN_WARNING CARDNAME ! 1366: ": TX_BUFFER_EMPTY handled\n")); ! 1367: outb( IM_TX_EMPTY_INT, ioaddr + INTERRUPT ); ! 1368: mask &= ~IM_TX_EMPTY_INT; ! 1369: lp->stats.tx_packets += lp->packets_waiting; ! 1370: lp->packets_waiting = 0; ! 1371: ! 1372: } else if (status & IM_ALLOC_INT ) { ! 1373: PRINTK2((KERN_DEBUG CARDNAME ! 1374: ": Allocation interrupt \n")); ! 1375: /* clear this interrupt so it doesn't happen again */ ! 1376: mask &= ~IM_ALLOC_INT; ! 1377: ! 1378: smc_hardware_send_packet( dev ); ! 1379: ! 1380: /* enable xmit interrupts based on this */ ! 1381: mask |= ( IM_TX_EMPTY_INT | IM_TX_INT ); ! 1382: ! 1383: /* and let the card send more packets to me */ ! 1384: mark_bh( NET_BH ); ! 1385: ! 1386: PRINTK2((CARDNAME": Handoff done successfully.\n")); ! 1387: } else if (status & IM_RX_OVRN_INT ) { ! 1388: lp->stats.rx_errors++; ! 1389: lp->stats.rx_fifo_errors++; ! 1390: outb( IM_RX_OVRN_INT, ioaddr + INTERRUPT ); ! 1391: } else if (status & IM_EPH_INT ) { ! 1392: PRINTK((CARDNAME ": UNSUPPORTED: EPH INTERRUPT \n")); ! 1393: } else if (status & IM_ERCV_INT ) { ! 1394: PRINTK((CARDNAME ": UNSUPPORTED: ERCV INTERRUPT \n")); ! 1395: outb( IM_ERCV_INT, ioaddr + INTERRUPT ); ! 1396: } ! 1397: } while ( timeout -- ); ! 1398: ! 1399: ! 1400: /* restore state register */ ! 1401: SMC_SELECT_BANK( 2 ); ! 1402: outb( mask, ioaddr + INT_MASK ); ! 1403: ! 1404: PRINTK3(( KERN_WARNING CARDNAME ": MASK is now %x \n", mask )); ! 1405: outw( saved_pointer, ioaddr + POINTER ); ! 1406: ! 1407: SMC_SELECT_BANK( saved_bank ); ! 1408: ! 1409: dev->interrupt = 0; ! 1410: PRINTK3((CARDNAME ": Interrupt done\n")); ! 1411: return; ! 1412: } ! 1413: ! 1414: /*------------------------------------------------------------- ! 1415: . ! 1416: . smc_rcv - receive a packet from the card ! 1417: . ! 1418: . There is ( at least ) a packet waiting to be read from ! 1419: . chip-memory. ! 1420: . ! 1421: . o Read the status ! 1422: . o If an error, record it ! 1423: . o otherwise, read in the packet ! 1424: -------------------------------------------------------------- ! 1425: */ ! 1426: static void smc_rcv(struct device *dev) ! 1427: { ! 1428: struct smc_local *lp = (struct smc_local *)dev->priv; ! 1429: int ioaddr = dev->base_addr; ! 1430: int packet_number; ! 1431: word status; ! 1432: word packet_length; ! 1433: ! 1434: /* assume bank 2 */ ! 1435: ! 1436: packet_number = inw( ioaddr + FIFO_PORTS ); ! 1437: ! 1438: if ( packet_number & FP_RXEMPTY ) { ! 1439: /* we got called , but nothing was on the FIFO */ ! 1440: PRINTK((CARDNAME ": WARNING: smc_rcv with nothing on FIFO. \n")); ! 1441: /* don't need to restore anything */ ! 1442: return; ! 1443: } ! 1444: ! 1445: /* start reading from the start of the packet */ ! 1446: outw( PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER ); ! 1447: ! 1448: /* First two words are status and packet_length */ ! 1449: status = inw( ioaddr + DATA_1 ); ! 1450: packet_length = inw( ioaddr + DATA_1 ); ! 1451: ! 1452: packet_length &= 0x07ff; /* mask off top bits */ ! 1453: ! 1454: PRINTK2(("RCV: STATUS %4x LENGTH %4x\n", status, packet_length )); ! 1455: /* ! 1456: . the packet length contains 3 extra words : ! 1457: . status, length, and a extra word with an odd byte . ! 1458: */ ! 1459: packet_length -= 6; ! 1460: ! 1461: if ( !(status & RS_ERRORS ) ){ ! 1462: /* do stuff to make a new packet */ ! 1463: struct sk_buff * skb; ! 1464: byte * data; ! 1465: ! 1466: /* read one extra byte */ ! 1467: if ( status & RS_ODDFRAME ) ! 1468: packet_length++; ! 1469: ! 1470: /* set multicast stats */ ! 1471: if ( status & RS_MULTICAST ) ! 1472: lp->stats.multicast++; ! 1473: ! 1474: #ifdef SUPPORT_OLD_KERNEL ! 1475: skb = alloc_skb( packet_length + 5, GFP_ATOMIC ); ! 1476: #else ! 1477: skb = dev_alloc_skb( packet_length + 5); ! 1478: #endif ! 1479: ! 1480: if ( skb == NULL ) { ! 1481: printk(KERN_NOTICE CARDNAME ! 1482: ": Low memory, packet dropped.\n"); ! 1483: lp->stats.rx_dropped++; ! 1484: } ! 1485: ! 1486: /* ! 1487: ! This should work without alignment, but it could be ! 1488: ! in the worse case ! 1489: */ ! 1490: #ifndef SUPPORT_OLD_KERNEL ! 1491: /* TODO: Should I use 32bit alignment here ? */ ! 1492: skb_reserve( skb, 2 ); /* 16 bit alignment */ ! 1493: #endif ! 1494: ! 1495: skb->dev = dev; ! 1496: #ifdef SUPPORT_OLD_KERNEL ! 1497: skb->len = packet_length; ! 1498: data = skb->data; ! 1499: #else ! 1500: data = skb_put( skb, packet_length); ! 1501: #endif ! 1502: #ifdef USE_32_BIT ! 1503: /* QUESTION: Like in the TX routine, do I want ! 1504: to send the DWORDs or the bytes first, or some ! 1505: mixture. A mixture might improve already slow PIO ! 1506: performance */ ! 1507: PRINTK3((" Reading %d dwords (and %d bytes) \n", ! 1508: packet_length >> 2, packet_length & 3 )); ! 1509: insl(ioaddr + DATA_1 , data, packet_length >> 2 ); ! 1510: /* read the left over bytes */ ! 1511: insb( ioaddr + DATA_1, data + (packet_length & 0xFFFFFC), ! 1512: packet_length & 0x3 ); ! 1513: #else ! 1514: PRINTK3((" Reading %d words and %d byte(s) \n", ! 1515: (packet_length >> 1 ), packet_length & 1 ); ! 1516: if ( packet_length & 1 ) ! 1517: *(data++) = inb( ioaddr + DATA_1 ); ! 1518: insw(ioaddr + DATA_1 , data, (packet_length + 1 ) >> 1); ! 1519: if ( packet_length & 1 ) { ! 1520: data += packet_length & ~1; ! 1521: *((data++) = inb( ioaddr + DATA_1 ); ! 1522: } ! 1523: #endif ! 1524: #if SMC_DEBUG > 2 ! 1525: print_packet( data, packet_length ); ! 1526: #endif ! 1527: ! 1528: #ifndef SUPPORT_OLD_KERNEL ! 1529: skb->protocol = eth_type_trans(skb, dev ); ! 1530: #endif ! 1531: netif_rx(skb); ! 1532: lp->stats.rx_packets++; ! 1533: } else { ! 1534: /* error ... */ ! 1535: lp->stats.rx_errors++; ! 1536: ! 1537: if ( status & RS_ALGNERR ) lp->stats.rx_frame_errors++; ! 1538: if ( status & (RS_TOOSHORT | RS_TOOLONG ) ) ! 1539: lp->stats.rx_length_errors++; ! 1540: if ( status & RS_BADCRC) lp->stats.rx_crc_errors++; ! 1541: } ! 1542: /* error or good, tell the card to get rid of this packet */ ! 1543: outw( MC_RELEASE, ioaddr + MMU_CMD ); ! 1544: ! 1545: ! 1546: return; ! 1547: } ! 1548: ! 1549: ! 1550: /************************************************************************* ! 1551: . smc_tx ! 1552: . ! 1553: . Purpose: Handle a transmit error message. This will only be called ! 1554: . when an error, because of the AUTO_RELEASE mode. ! 1555: . ! 1556: . Algorithm: ! 1557: . Save pointer and packet no ! 1558: . Get the packet no from the top of the queue ! 1559: . check if it's valid ( if not, is this an error??? ) ! 1560: . read the status word ! 1561: . record the error ! 1562: . ( resend? Not really, since we don't want old packets around ) ! 1563: . Restore saved values ! 1564: ************************************************************************/ ! 1565: static void smc_tx( struct device * dev ) ! 1566: { ! 1567: int ioaddr = dev->base_addr; ! 1568: struct smc_local *lp = (struct smc_local *)dev->priv; ! 1569: byte saved_packet; ! 1570: byte packet_no; ! 1571: word tx_status; ! 1572: ! 1573: ! 1574: /* assume bank 2 */ ! 1575: ! 1576: saved_packet = inb( ioaddr + PNR_ARR ); ! 1577: packet_no = inw( ioaddr + FIFO_PORTS ); ! 1578: packet_no &= 0x7F; ! 1579: ! 1580: /* select this as the packet to read from */ ! 1581: outb( packet_no, ioaddr + PNR_ARR ); ! 1582: ! 1583: /* read the first word from this packet */ ! 1584: outw( PTR_AUTOINC | PTR_READ, ioaddr + POINTER ); ! 1585: ! 1586: tx_status = inw( ioaddr + DATA_1 ); ! 1587: PRINTK3((CARDNAME": TX DONE STATUS: %4x \n", tx_status )); ! 1588: ! 1589: lp->stats.tx_errors++; ! 1590: if ( tx_status & TS_LOSTCAR ) lp->stats.tx_carrier_errors++; ! 1591: if ( tx_status & TS_LATCOL ) { ! 1592: printk(KERN_DEBUG CARDNAME ! 1593: ": Late collision occurred on last xmit.\n"); ! 1594: lp->stats.tx_window_errors++; ! 1595: } ! 1596: #if 0 ! 1597: if ( tx_status & TS_16COL ) { ... } ! 1598: #endif ! 1599: ! 1600: if ( tx_status & TS_SUCCESS ) { ! 1601: printk(CARDNAME": Successful packet caused interrupt \n"); ! 1602: } ! 1603: /* re-enable transmit */ ! 1604: SMC_SELECT_BANK( 0 ); ! 1605: outw( inw( ioaddr + TCR ) | TCR_ENABLE, ioaddr + TCR ); ! 1606: ! 1607: /* kill the packet */ ! 1608: SMC_SELECT_BANK( 2 ); ! 1609: outw( MC_FREEPKT, ioaddr + MMU_CMD ); ! 1610: ! 1611: /* one less packet waiting for me */ ! 1612: lp->packets_waiting--; ! 1613: ! 1614: outb( saved_packet, ioaddr + PNR_ARR ); ! 1615: return; ! 1616: } ! 1617: ! 1618: /*---------------------------------------------------- ! 1619: . smc_close ! 1620: . ! 1621: . this makes the board clean up everything that it can ! 1622: . and not talk to the outside world. Caused by ! 1623: . an 'ifconfig ethX down' ! 1624: . ! 1625: -----------------------------------------------------*/ ! 1626: static int smc_close(struct device *dev) ! 1627: { ! 1628: dev->tbusy = 1; ! 1629: dev->start = 0; ! 1630: ! 1631: /* clear everything */ ! 1632: smc_shutdown( dev->base_addr ); ! 1633: ! 1634: /* Update the statistics here. */ ! 1635: #ifdef MODULE ! 1636: MOD_DEC_USE_COUNT; ! 1637: #endif ! 1638: ! 1639: return 0; ! 1640: } ! 1641: ! 1642: /*------------------------------------------------------------ ! 1643: . Get the current statistics. ! 1644: . This may be called with the card open or closed. ! 1645: .-------------------------------------------------------------*/ ! 1646: static struct enet_statistics * smc_query_statistics(struct device *dev) { ! 1647: struct smc_local *lp = (struct smc_local *)dev->priv; ! 1648: ! 1649: return &lp->stats; ! 1650: } ! 1651: ! 1652: /*----------------------------------------------------------- ! 1653: . smc_set_multicast_list ! 1654: . ! 1655: . This routine will, depending on the values passed to it, ! 1656: . either make it accept multicast packets, go into ! 1657: . promiscuous mode ( for TCPDUMP and cousins ) or accept ! 1658: . a select set of multicast packets ! 1659: */ ! 1660: #ifdef SUPPORT_OLD_KERNEL ! 1661: static void smc_set_multicast_list( struct device * dev, ! 1662: int num_addrs, void * addrs ) ! 1663: #else ! 1664: static void smc_set_multicast_list(struct device *dev) ! 1665: #endif ! 1666: { ! 1667: short ioaddr = dev->base_addr; ! 1668: ! 1669: SMC_SELECT_BANK(0); ! 1670: #ifdef SUPPORT_OLD_KERNEL ! 1671: if ( num_addrs < 0 ) ! 1672: #else ! 1673: if ( dev->flags & IFF_PROMISC ) ! 1674: #endif ! 1675: outw( inw(ioaddr + RCR ) | RCR_PROMISC, ioaddr + RCR ); ! 1676: ! 1677: /* BUG? I never disable promiscuous mode if multicasting was turned on. ! 1678: Now, I turn off promiscuous mode, but I don't do anything to multicasting ! 1679: when promiscuous mode is turned on. ! 1680: */ ! 1681: ! 1682: /* Here, I am setting this to accept all multicast packets. ! 1683: I don't need to zero the multicast table, because the flag is ! 1684: checked before the table is ! 1685: */ ! 1686: #ifdef SUPPORT_OLD_KERNEL ! 1687: else if ( num_addrs > 20 ) /* arbitrary constant */ ! 1688: #else ! 1689: else if (dev->flags & IFF_ALLMULTI) ! 1690: #endif ! 1691: outw( inw(ioaddr + RCR ) | RCR_ALMUL, ioaddr + RCR ); ! 1692: ! 1693: /* We just get all multicast packets even if we only want them ! 1694: . from one source. This will be changed at some future ! 1695: . point. */ ! 1696: #ifdef SUPPORT_OLD_KERNEL ! 1697: else if (num_addrs > 0 ) { ! 1698: /* the old kernel support will not have hardware multicast support. It would ! 1699: involve more kludges, and make the multicast setting code even worse. ! 1700: Instead, just use the ALMUL method. This is reasonable, considering that ! 1701: it is seldom used ! 1702: */ ! 1703: outw( inw( ioaddr + RCR ) & ~RCR_PROMISC, ioaddr + RCR ); ! 1704: outw( inw( ioadddr + RCR ) | RCR_ALMUL, ioadddr + RCR ); ! 1705: } ! 1706: #else ! 1707: else if (dev->mc_count ) { ! 1708: /* support hardware multicasting */ ! 1709: ! 1710: /* be sure I get rid of flags I might have set */ ! 1711: outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL), ! 1712: ioaddr + RCR ); ! 1713: /* NOTE: this has to set the bank, so make sure it is the ! 1714: last thing called. The bank is set to zero at the top */ ! 1715: smc_setmulticast( ioaddr, dev->mc_count, dev->mc_list ); ! 1716: } ! 1717: #endif ! 1718: else { ! 1719: outw( inw( ioaddr + RCR ) & ~(RCR_PROMISC | RCR_ALMUL), ! 1720: ioaddr + RCR ); ! 1721: ! 1722: /* ! 1723: since I'm disabling all multicast entirely, I need to ! 1724: clear the multicast list ! 1725: */ ! 1726: SMC_SELECT_BANK( 3 ); ! 1727: outw( 0, ioaddr + MULTICAST1 ); ! 1728: outw( 0, ioaddr + MULTICAST2 ); ! 1729: outw( 0, ioaddr + MULTICAST3 ); ! 1730: outw( 0, ioaddr + MULTICAST4 ); ! 1731: } ! 1732: } ! 1733: ! 1734: #ifdef MODULE ! 1735: ! 1736: static char devicename[9] = { 0, }; ! 1737: static struct device devSMC9194 = { ! 1738: devicename, /* device name is inserted by linux/drivers/net/net_init.c */ ! 1739: 0, 0, 0, 0, ! 1740: 0, 0, /* I/O address, IRQ */ ! 1741: 0, 0, 0, NULL, smc_init }; ! 1742: ! 1743: int io = 0; ! 1744: int irq = 0; ! 1745: int ifport = 0; ! 1746: ! 1747: int init_module(void) ! 1748: { ! 1749: int result; ! 1750: ! 1751: if (io == 0) ! 1752: printk(KERN_WARNING ! 1753: CARDNAME": You shouldn't use auto-probing with insmod!\n" ); ! 1754: ! 1755: /* copy the parameters from insmod into the device structure */ ! 1756: devSMC9194.base_addr = io; ! 1757: devSMC9194.irq = irq; ! 1758: devSMC9194.if_port = ifport; ! 1759: if ((result = register_netdev(&devSMC9194)) != 0) ! 1760: return result; ! 1761: ! 1762: return 0; ! 1763: } ! 1764: ! 1765: void cleanup_module(void) ! 1766: { ! 1767: /* No need to check MOD_IN_USE, as sys_delete_module() checks. */ ! 1768: unregister_netdev(&devSMC9194); ! 1769: ! 1770: free_irq(devSMC9194.irq, NULL ); ! 1771: irq2dev_map[devSMC9194.irq] = NULL; ! 1772: release_region(devSMC9194.base_addr, SMC_IO_EXTENT); ! 1773: ! 1774: if (devSMC9194.priv) ! 1775: kfree_s(devSMC9194.priv, sizeof(struct smc_local)); ! 1776: } ! 1777: ! 1778: #endif /* MODULE */ ! 1779:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.