|
|
1.1 ! root 1: /* ! 2: ** hp100.c ! 3: ** HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters ! 4: ** ! 5: ** $Id: hp100.c,v 1.1 1999/04/26 05:52:18 tb Exp $ ! 6: ** ! 7: ** Based on the HP100 driver written by Jaroslav Kysela <[email protected]> ! 8: ** Extended for new busmaster capable chipsets by ! 9: ** Siegfried "Frieder" Loeffler (dg1sek) <[email protected]> ! 10: ** ! 11: ** Maintained by: Jaroslav Kysela <[email protected]> ! 12: ** ! 13: ** This driver has only been tested with ! 14: ** -- HP J2585B 10/100 Mbit/s PCI Busmaster ! 15: ** -- HP J2585A 10/100 Mbit/s PCI ! 16: ** -- HP J2970 10 Mbit/s PCI Combo 10base-T/BNC ! 17: ** -- HP J2973 10 Mbit/s PCI 10base-T ! 18: ** -- HP J2573 10/100 ISA ! 19: ** -- Compex ReadyLink ENET100-VG4 10/100 Mbit/s PCI / EISA ! 20: ** -- Compex FreedomLine 100/VG 10/100 Mbit/s ISA / EISA / PCI ! 21: ** ! 22: ** but it should also work with the other CASCADE based adapters. ! 23: ** ! 24: ** TODO: ! 25: ** - J2573 seems to hang sometimes when in shared memory mode. ! 26: ** - Mode for Priority TX ! 27: ** - Check PCI registers, performance might be improved? ! 28: ** - To reduce interrupt load in busmaster, one could switch off ! 29: ** the interrupts that are used to refill the queues whenever the ! 30: ** queues are filled up to more than a certain threshold. ! 31: ** - some updates for EISA version of card ! 32: ** ! 33: ** ! 34: ** This source/code is public free; you can distribute it and/or modify ! 35: ** it under terms of the GNU General Public License (published by the ! 36: ** Free Software Foundation) either version two of this License, or any ! 37: ** later version. ! 38: ** ! 39: ** 1.55 -> 1.56 ! 40: ** - removed printk in misc. interrupt and update statistics to allow ! 41: ** monitoring of card status ! 42: ** - timing changes in xmit routines, relogin to 100VG hub added when ! 43: ** driver does reset ! 44: ** - included fix for Compex FreedomLine PCI adapter ! 45: ** ! 46: ** 1.54 -> 1.55 ! 47: ** - fixed bad initialization in init_module ! 48: ** - added Compex FreedomLine adapter ! 49: ** - some fixes in card initialization ! 50: ** ! 51: ** 1.53 -> 1.54 ! 52: ** - added hardware multicast filter support (doesn't work) ! 53: ** - little changes in hp100_sense_lan routine ! 54: ** - added support for Coax and AUI (J2970) ! 55: ** - fix for multiple cards and hp100_mode parameter (insmod) ! 56: ** - fix for shared IRQ ! 57: ** ! 58: ** 1.52 -> 1.53 ! 59: ** - fixed bug in multicast support ! 60: ** ! 61: */ ! 62: ! 63: #define HP100_DEFAULT_PRIORITY_TX 0 ! 64: ! 65: #undef HP100_DEBUG ! 66: #undef HP100_DEBUG_B /* Trace */ ! 67: #undef HP100_DEBUG_BM /* Debug busmaster code (PDL stuff) */ ! 68: ! 69: #undef HP100_DEBUG_TRAINING /* Debug login-to-hub procedure */ ! 70: #undef HP100_DEBUG_TX ! 71: #undef HP100_DEBUG_IRQ ! 72: #undef HP100_DEBUG_RX ! 73: ! 74: #undef HP100_MULTICAST_FILTER /* Need to be debugged... */ ! 75: ! 76: #include <linux/version.h> ! 77: #include <linux/module.h> ! 78: #include <linux/kernel.h> ! 79: #include <linux/sched.h> ! 80: #include <linux/string.h> ! 81: #include <linux/errno.h> ! 82: #include <linux/ioport.h> ! 83: #include <linux/malloc.h> ! 84: #include <linux/interrupt.h> ! 85: #include <linux/pci.h> ! 86: #include <linux/bios32.h> ! 87: #include <asm/bitops.h> ! 88: #include <asm/io.h> ! 89: ! 90: #include <linux/netdevice.h> ! 91: #include <linux/etherdevice.h> ! 92: #include <linux/skbuff.h> ! 93: ! 94: #include <linux/types.h> ! 95: #include <linux/config.h> /* for CONFIG_PCI */ ! 96: #include <linux/delay.h> ! 97: ! 98: #if LINUX_VERSION_CODE < 0x020100 ! 99: #define ioremap vremap ! 100: #define iounmap vfree ! 101: typedef struct enet_statistics hp100_stats_t; ! 102: #else ! 103: #define LINUX_2_1 ! 104: typedef struct net_device_stats hp100_stats_t; ! 105: #endif ! 106: ! 107: #ifndef __initfunc ! 108: #define __initfunc(__initarg) __initarg ! 109: #else ! 110: #include <linux/init.h> ! 111: #endif ! 112: ! 113: #include "hp100.h" ! 114: ! 115: /* ! 116: * defines ! 117: */ ! 118: ! 119: #define HP100_BUS_ISA 0 ! 120: #define HP100_BUS_EISA 1 ! 121: #define HP100_BUS_PCI 2 ! 122: ! 123: #ifndef PCI_DEVICE_ID_HP_J2585B ! 124: #define PCI_DEVICE_ID_HP_J2585B 0x1031 ! 125: #endif ! 126: #ifndef PCI_VENDOR_ID_COMPEX ! 127: #define PCI_VENDOR_ID_COMPEX 0x11f6 ! 128: #endif ! 129: #ifndef PCI_DEVICE_ID_COMPEX_ENET100VG4 ! 130: #define PCI_DEVICE_ID_COMPEX_ENET100VG4 0x0112 ! 131: #endif ! 132: #ifndef PCI_VENDOR_ID_COMPEX2 ! 133: #define PCI_VENDOR_ID_COMPEX2 0x101a ! 134: #endif ! 135: #ifndef PCI_DEVICE_ID_COMPEX2_100VG ! 136: #define PCI_DEVICE_ID_COMPEX2_100VG 0x0005 ! 137: #endif ! 138: ! 139: #define HP100_REGION_SIZE 0x20 /* for ioports */ ! 140: ! 141: #define HP100_MAX_PACKET_SIZE (1536+4) ! 142: #define HP100_MIN_PACKET_SIZE 60 ! 143: ! 144: #ifndef HP100_DEFAULT_RX_RATIO ! 145: /* default - 75% onboard memory on the card are used for RX packets */ ! 146: #define HP100_DEFAULT_RX_RATIO 75 ! 147: #endif ! 148: ! 149: #ifndef HP100_DEFAULT_PRIORITY_TX ! 150: /* default - don't enable transmit outgoing packets as priority */ ! 151: #define HP100_DEFAULT_PRIORITY_TX 0 ! 152: #endif ! 153: ! 154: /* ! 155: * structures ! 156: */ ! 157: ! 158: struct hp100_eisa_id { ! 159: u_int id; ! 160: const char *name; ! 161: u_char bus; ! 162: }; ! 163: ! 164: struct hp100_pci_id { ! 165: u_short vendor; ! 166: u_short device; ! 167: }; ! 168: ! 169: struct hp100_private { ! 170: struct hp100_eisa_id *id; ! 171: u_short chip; ! 172: u_short soft_model; ! 173: u_int memory_size; ! 174: u_int virt_memory_size; ! 175: u_short rx_ratio; /* 1 - 99 */ ! 176: u_short priority_tx; /* != 0 - priority tx */ ! 177: u_short mode; /* PIO, Shared Mem or Busmaster */ ! 178: u_char bus; ! 179: u_char pci_bus; ! 180: u_char pci_device_fn; ! 181: short mem_mapped; /* memory mapped access */ ! 182: u_int *mem_ptr_virt; /* virtual memory mapped area, maybe NULL */ ! 183: u_int *mem_ptr_phys; /* physical memory mapped area */ ! 184: short lan_type; /* 10Mb/s, 100Mb/s or -1 (error) */ ! 185: int hub_status; /* was login to hub successful? */ ! 186: u_char mac1_mode; ! 187: u_char mac2_mode; ! 188: u_char hash_bytes[ 8 ]; ! 189: hp100_stats_t stats; ! 190: ! 191: /* Rings for busmaster mode: */ ! 192: hp100_ring_t *rxrhead; /* Head (oldest) index into rxring */ ! 193: hp100_ring_t *rxrtail; /* Tail (newest) index into rxring */ ! 194: hp100_ring_t *txrhead; /* Head (oldest) index into txring */ ! 195: hp100_ring_t *txrtail; /* Tail (newest) index into txring */ ! 196: ! 197: hp100_ring_t rxring[ MAX_RX_PDL ]; ! 198: hp100_ring_t txring[ MAX_TX_PDL ]; ! 199: ! 200: u_int *page_vaddr; /* Virtual address of allocated page */ ! 201: u_int *page_vaddr_algn; /* Aligned virtual address of allocated page */ ! 202: int rxrcommit; /* # Rx PDLs commited to adapter */ ! 203: int txrcommit; /* # Tx PDLs commited to adapter */ ! 204: }; ! 205: ! 206: /* ! 207: * variables ! 208: */ ! 209: ! 210: static struct hp100_eisa_id hp100_eisa_ids[] = { ! 211: ! 212: /* 10/100 EISA card with revision A Cascade chip */ ! 213: { 0x80F1F022, "HP J2577 rev A", HP100_BUS_EISA }, ! 214: ! 215: /* 10/100 ISA card with revision A Cascade chip */ ! 216: { 0x50F1F022, "HP J2573 rev A", HP100_BUS_ISA }, ! 217: ! 218: /* 10 only EISA card with Cascade chip */ ! 219: { 0x2019F022, "HP 27248B", HP100_BUS_EISA }, ! 220: ! 221: /* 10/100 EISA card with Cascade chip */ ! 222: { 0x4019F022, "HP J2577", HP100_BUS_EISA }, ! 223: ! 224: /* 10/100 ISA card with Cascade chip */ ! 225: { 0x5019F022, "HP J2573", HP100_BUS_ISA }, ! 226: ! 227: /* 10/100 PCI card - old J2585A */ ! 228: { 0x1030103c, "HP J2585A", HP100_BUS_PCI }, ! 229: ! 230: /* 10/100 PCI card - new J2585B - master capable */ ! 231: { 0x1041103c, "HP J2585B", HP100_BUS_PCI }, ! 232: ! 233: /* 10 Mbit Combo Adapter */ ! 234: { 0x1042103c, "HP J2970", HP100_BUS_PCI }, ! 235: ! 236: /* 10 Mbit 10baseT Adapter */ ! 237: { 0x1040103c, "HP J2973", HP100_BUS_PCI }, ! 238: ! 239: /* 10/100 EISA card from Compex */ ! 240: { 0x0103180e, "ReadyLink ENET100-VG4", HP100_BUS_EISA }, ! 241: ! 242: /* 10/100 EISA card from Compex - FreedomLine (sq5bpf) */ ! 243: /* Note: [email protected] reported that same ID have ISA */ ! 244: /* version of adapter, too... */ ! 245: { 0x0104180e, "FreedomLine 100/VG", HP100_BUS_EISA }, ! 246: ! 247: /* 10/100 PCI card from Compex - FreedomLine ! 248: * ! 249: * I think this card doesn't like aic7178 scsi controller, but ! 250: * I haven't tested this much. It works fine on diskless machines. ! 251: * Jacek Lipkowski <[email protected]> ! 252: */ ! 253: { 0x021211f6, "FreedomLine 100/VG", HP100_BUS_PCI }, ! 254: ! 255: /* 10/100 PCI card from Compex (J2585A compatible) */ ! 256: { 0x011211f6, "ReadyLink ENET100-VG4", HP100_BUS_PCI } ! 257: ! 258: }; ! 259: ! 260: #define HP100_EISA_IDS_SIZE (sizeof(hp100_eisa_ids)/sizeof(struct hp100_eisa_id)) ! 261: ! 262: static struct hp100_pci_id hp100_pci_ids[] = { ! 263: { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A }, ! 264: { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B }, ! 265: { PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4 }, ! 266: { PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG } ! 267: }; ! 268: ! 269: #define HP100_PCI_IDS_SIZE (sizeof(hp100_pci_ids)/sizeof(struct hp100_pci_id)) ! 270: ! 271: static int hp100_rx_ratio = HP100_DEFAULT_RX_RATIO; ! 272: static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX; ! 273: static int hp100_mode = 1; ! 274: ! 275: #ifdef LINUX_2_1 ! 276: MODULE_PARM( hp100_rx_ratio, "1i" ); ! 277: MODULE_PARM( hp100_priority_tx, "1i" ); ! 278: MODULE_PARM( hp100_mode, "1i" ); ! 279: #endif ! 280: ! 281: /* ! 282: * prototypes ! 283: */ ! 284: ! 285: static int hp100_probe1( struct device *dev, int ioaddr, u_char bus, u_char pci_bus, u_char pci_device_fn ); ! 286: static int hp100_open( struct device *dev ); ! 287: static int hp100_close( struct device *dev ); ! 288: static int hp100_start_xmit( struct sk_buff *skb, struct device *dev ); ! 289: static int hp100_start_xmit_bm (struct sk_buff *skb, struct device *dev ); ! 290: static void hp100_rx( struct device *dev ); ! 291: static hp100_stats_t *hp100_get_stats( struct device *dev ); ! 292: static void hp100_misc_interrupt( struct device *dev ); ! 293: static void hp100_update_stats( struct device *dev ); ! 294: static void hp100_clear_stats( int ioaddr ); ! 295: static void hp100_set_multicast_list( struct device *dev); ! 296: static void hp100_interrupt( int irq, void *dev_id, struct pt_regs *regs ); ! 297: static void hp100_start_interface( struct device *dev ); ! 298: static void hp100_stop_interface( struct device *dev ); ! 299: static void hp100_load_eeprom( struct device *dev, u_short ioaddr ); ! 300: static int hp100_sense_lan( struct device *dev ); ! 301: static int hp100_login_to_vg_hub( struct device *dev, u_short force_relogin ); ! 302: static int hp100_down_vg_link( struct device *dev ); ! 303: static void hp100_cascade_reset( struct device *dev, u_short enable ); ! 304: static void hp100_BM_shutdown( struct device *dev ); ! 305: static void hp100_mmuinit( struct device *dev ); ! 306: static void hp100_init_pdls( struct device *dev ); ! 307: static int hp100_init_rxpdl( struct device *dev, register hp100_ring_t *ringptr, register u_int *pdlptr); ! 308: static int hp100_init_txpdl( struct device *dev, register hp100_ring_t *ringptr, register u_int *pdlptr); ! 309: static void hp100_rxfill( struct device *dev ); ! 310: static void hp100_hwinit( struct device *dev ); ! 311: static void hp100_clean_txring( struct device *dev ); ! 312: #ifdef HP100_DEBUG ! 313: static void hp100_RegisterDump( struct device *dev ); ! 314: #endif ! 315: ! 316: /* TODO: This function should not really be needed in a good design... */ ! 317: static void wait( void ) ! 318: { ! 319: udelay( 1000 ); ! 320: } ! 321: ! 322: /* ! 323: * probe functions ! 324: * These functions should - if possible - avoid doing write operations ! 325: * since this could cause problems when the card is not installed. ! 326: */ ! 327: ! 328: __initfunc(int hp100_probe( struct device *dev )) ! 329: { ! 330: int base_addr = dev ? dev -> base_addr : 0; ! 331: int ioaddr = 0; ! 332: #ifdef CONFIG_PCI ! 333: int pci_start_index = 0; ! 334: #endif ! 335: ! 336: #ifdef HP100_DEBUG_B ! 337: hp100_outw( 0x4200, TRACE ); ! 338: printk( "hp100: %s: probe\n", dev->name ); ! 339: #endif ! 340: ! 341: if ( base_addr > 0xff ) /* Check a single specified location. */ ! 342: { ! 343: if ( check_region( base_addr, HP100_REGION_SIZE ) ) return -EINVAL; ! 344: if ( base_addr < 0x400 ) ! 345: return hp100_probe1( dev, base_addr, HP100_BUS_ISA, 0, 0 ); ! 346: if ( EISA_bus && base_addr >= 0x1c38 && ( (base_addr - 0x1c38) & 0x3ff ) == 0 ) ! 347: return hp100_probe1( dev, base_addr, HP100_BUS_EISA, 0, 0 ); ! 348: #ifdef CONFIG_PCI ! 349: printk( "hp100: %s: You may specify card # in i/o address parameter for PCI bus...", dev->name ); ! 350: return hp100_probe1( dev, base_addr, HP100_BUS_PCI, 0, 0 ); ! 351: #else ! 352: return -ENODEV; ! 353: #endif ! 354: } ! 355: else ! 356: #ifdef CONFIG_PCI ! 357: if ( base_addr > 0 && base_addr < 8 + 1 ) ! 358: pci_start_index = 0x100 | ( base_addr - 1 ); ! 359: else ! 360: #endif ! 361: if ( base_addr != 0 ) return -ENXIO; ! 362: ! 363: /* at first - scan PCI bus(es) */ ! 364: ! 365: #ifdef CONFIG_PCI ! 366: if ( pcibios_present() ) ! 367: { ! 368: int pci_index; ! 369: ! 370: #ifdef HP100_DEBUG_PCI ! 371: printk( "hp100: %s: PCI BIOS is present, checking for devices..\n", dev->name ); ! 372: #endif ! 373: for ( pci_index = pci_start_index & 7; pci_index < 8; pci_index++ ) ! 374: { ! 375: u_char pci_bus, pci_device_fn; ! 376: u_short pci_command; ! 377: int pci_id_index; ! 378: ! 379: for ( pci_id_index = 0; pci_id_index < HP100_PCI_IDS_SIZE; pci_id_index++ ) ! 380: if ( pcibios_find_device( hp100_pci_ids[ pci_id_index ].vendor, ! 381: hp100_pci_ids[ pci_id_index ].device, ! 382: pci_index, &pci_bus, ! 383: &pci_device_fn ) == 0 ) goto __pci_found; ! 384: break; ! 385: ! 386: __pci_found: ! 387: pcibios_read_config_dword( pci_bus, pci_device_fn, ! 388: PCI_BASE_ADDRESS_0, &ioaddr ); ! 389: ! 390: ioaddr &= ~3; /* remove I/O space marker in bit 0. */ ! 391: ! 392: if ( check_region( ioaddr, HP100_REGION_SIZE ) ) continue; ! 393: ! 394: pcibios_read_config_word( pci_bus, pci_device_fn, ! 395: PCI_COMMAND, &pci_command ); ! 396: if ( !( pci_command & PCI_COMMAND_IO ) ) ! 397: { ! 398: #ifdef HP100_DEBUG ! 399: printk( "hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name ); ! 400: #endif ! 401: pci_command |= PCI_COMMAND_IO; ! 402: pcibios_write_config_word( pci_bus, pci_device_fn, ! 403: PCI_COMMAND, pci_command ); ! 404: } ! 405: if ( !( pci_command & PCI_COMMAND_MASTER ) ) ! 406: { ! 407: #ifdef HP100_DEBUG ! 408: printk( "hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name ); ! 409: #endif ! 410: pci_command |= PCI_COMMAND_MASTER; ! 411: pcibios_write_config_word( pci_bus, pci_device_fn, ! 412: PCI_COMMAND, pci_command ); ! 413: } ! 414: #ifdef HP100_DEBUG ! 415: printk( "hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr ); ! 416: #endif ! 417: if ( hp100_probe1( dev, ioaddr, HP100_BUS_PCI, pci_bus, pci_device_fn ) == 0 ) ! 418: return 0; ! 419: } ! 420: } ! 421: if ( pci_start_index > 0 ) return -ENODEV; ! 422: #endif /* CONFIG_PCI */ ! 423: ! 424: /* Second: Probe all EISA possible port regions (if EISA bus present) */ ! 425: for ( ioaddr = 0x1c38; EISA_bus && ioaddr < 0x10000; ioaddr += 0x400 ) ! 426: { ! 427: if ( check_region( ioaddr, HP100_REGION_SIZE ) ) continue; ! 428: if ( hp100_probe1( dev, ioaddr, HP100_BUS_EISA, 0, 0 ) == 0 ) return 0; ! 429: } ! 430: ! 431: /* Third Probe all ISA possible port regions */ ! 432: for ( ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x20 ) ! 433: { ! 434: if ( check_region( ioaddr, HP100_REGION_SIZE ) ) continue; ! 435: if ( hp100_probe1( dev, ioaddr, HP100_BUS_ISA, 0, 0 ) == 0 ) return 0; ! 436: } ! 437: ! 438: return -ENODEV; ! 439: } ! 440: ! 441: ! 442: __initfunc(static int hp100_probe1( struct device *dev, int ioaddr, u_char bus, u_char pci_bus, u_char pci_device_fn )) ! 443: { ! 444: int i; ! 445: ! 446: u_char uc, uc_1; ! 447: u_int eisa_id; ! 448: u_int chip; ! 449: u_int memory_size = 0, virt_memory_size = 0; ! 450: u_short local_mode, lsw; ! 451: short mem_mapped; ! 452: u_int *mem_ptr_phys, *mem_ptr_virt; ! 453: struct hp100_private *lp; ! 454: struct hp100_eisa_id *eid; ! 455: ! 456: #ifdef HP100_DEBUG_B ! 457: hp100_outw( 0x4201, TRACE ); ! 458: printk("hp100: %s: probe1\n",dev->name); ! 459: #endif ! 460: ! 461: if ( dev == NULL ) ! 462: { ! 463: #ifdef HP100_DEBUG ! 464: printk( "hp100_probe1: %s: dev == NULL ?\n", dev->name ); ! 465: #endif ! 466: return EIO; ! 467: } ! 468: ! 469: if ( hp100_inw( HW_ID ) != HP100_HW_ID_CASCADE ) ! 470: { ! 471: return -ENODEV; ! 472: } ! 473: else ! 474: { ! 475: chip = hp100_inw( PAGING ) & HP100_CHIPID_MASK; ! 476: #ifdef HP100_DEBUG ! 477: if ( chip == HP100_CHIPID_SHASTA ) ! 478: printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name); ! 479: else if ( chip == HP100_CHIPID_RAINIER ) ! 480: printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name); ! 481: else if ( chip == HP100_CHIPID_LASSEN ) ! 482: printk("hp100: %s: Lassen Chip detected.\n", dev->name); ! 483: else ! 484: printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n",dev->name,chip); ! 485: #endif ! 486: } ! 487: ! 488: dev->base_addr = ioaddr; ! 489: ! 490: hp100_page( ID_MAC_ADDR ); ! 491: for ( i = uc = eisa_id = 0; i < 4; i++ ) ! 492: { ! 493: eisa_id >>= 8; ! 494: uc_1 = hp100_inb( BOARD_ID + i ); ! 495: eisa_id |= uc_1 << 24; ! 496: uc += uc_1; ! 497: } ! 498: uc += hp100_inb( BOARD_ID + 4 ); ! 499: ! 500: if ( uc != 0xff ) /* bad checksum? */ ! 501: { ! 502: printk("hp100_probe: %s: bad EISA ID checksum at base port 0x%x\n", dev->name, ioaddr ); ! 503: return -ENODEV; ! 504: } ! 505: ! 506: for ( i=0; i < HP100_EISA_IDS_SIZE; i++) ! 507: if ( hp100_eisa_ids[ i ].id == eisa_id ) ! 508: break; ! 509: if ( i >= HP100_EISA_IDS_SIZE ) { ! 510: for ( i = 0; i < HP100_EISA_IDS_SIZE; i++) ! 511: if ( ( hp100_eisa_ids[ i ].id & 0xf0ffffff ) == ( eisa_id & 0xf0ffffff ) ) ! 512: break; ! 513: if ( i >= HP100_EISA_IDS_SIZE ) { ! 514: printk( "hp100_probe: %s: card at port 0x%x isn't known (id = 0x%x)\n", dev -> name, ioaddr, eisa_id ); ! 515: return -ENODEV; ! 516: } ! 517: } ! 518: eid = &hp100_eisa_ids[ i ]; ! 519: if ( ( eid->id & 0x0f000000 ) < ( eisa_id & 0x0f000000 ) ) ! 520: { ! 521: printk( "hp100_probe: %s: newer version of card %s at port 0x%x - unsupported\n", ! 522: dev->name, eid->name, ioaddr ); ! 523: return -ENODEV; ! 524: } ! 525: ! 526: for ( i = uc = 0; i < 7; i++ ) ! 527: uc += hp100_inb( LAN_ADDR + i ); ! 528: if ( uc != 0xff ) ! 529: { ! 530: printk("hp100_probe: %s: bad lan address checksum (card %s at port 0x%x)\n", ! 531: dev->name, eid->name, ioaddr ); ! 532: return -EIO; ! 533: } ! 534: ! 535: /* Make sure, that all registers are correctly updated... */ ! 536: ! 537: hp100_load_eeprom( dev, ioaddr ); ! 538: wait(); ! 539: ! 540: /* ! 541: * Determine driver operation mode ! 542: * ! 543: * Use the variable "hp100_mode" upon insmod or as kernel parameter to ! 544: * force driver modes: ! 545: * hp100_mode=1 -> default, use busmaster mode if configured. ! 546: * hp100_mode=2 -> enable shared memory mode ! 547: * hp100_mode=3 -> force use of i/o mapped mode. ! 548: * hp100_mode=4 -> same as 1, but re-set the enable bit on the card. ! 549: */ ! 550: ! 551: /* ! 552: * LSW values: ! 553: * 0x2278 -> J2585B, PnP shared memory mode ! 554: * 0x2270 -> J2585B, shared memory mode, 0xdc000 ! 555: * 0xa23c -> J2585B, I/O mapped mode ! 556: * 0x2240 -> EISA COMPEX, BusMaster (Shasta Chip) ! 557: * 0x2220 -> EISA HP, I/O (Shasta Chip) ! 558: * 0x2260 -> EISA HP, BusMaster (Shasta Chip) ! 559: */ ! 560: ! 561: #if 0 ! 562: local_mode = 0x2270; ! 563: hp100_outw(0xfefe,OPTION_LSW); ! 564: hp100_outw(local_mode|HP100_SET_LB|HP100_SET_HB,OPTION_LSW); ! 565: #endif ! 566: ! 567: /* hp100_mode value maybe used in future by another card */ ! 568: local_mode=hp100_mode; ! 569: if ( local_mode < 1 || local_mode > 4 ) ! 570: local_mode = 1; /* default */ ! 571: #ifdef HP100_DEBUG ! 572: printk( "hp100: %s: original LSW = 0x%x\n", dev->name, hp100_inw(OPTION_LSW) ); ! 573: #endif ! 574: ! 575: if(local_mode==3) ! 576: { ! 577: hp100_outw(HP100_MEM_EN|HP100_RESET_LB, OPTION_LSW); ! 578: hp100_outw(HP100_IO_EN|HP100_SET_LB, OPTION_LSW); ! 579: hp100_outw(HP100_BM_WRITE|HP100_BM_READ|HP100_RESET_HB, OPTION_LSW); ! 580: printk("hp100: %s: IO mapped mode forced.\n", dev->name); ! 581: } ! 582: else if(local_mode==2) ! 583: { ! 584: hp100_outw(HP100_MEM_EN|HP100_SET_LB, OPTION_LSW); ! 585: hp100_outw(HP100_IO_EN |HP100_SET_LB, OPTION_LSW); ! 586: hp100_outw(HP100_BM_WRITE|HP100_BM_READ|HP100_RESET_HB, OPTION_LSW); ! 587: printk("hp100: %s: Shared memory mode requested.\n", dev->name); ! 588: } ! 589: else if(local_mode==4) ! 590: { ! 591: if(chip==HP100_CHIPID_LASSEN) ! 592: { ! 593: hp100_outw(HP100_BM_WRITE| ! 594: HP100_BM_READ | HP100_SET_HB, OPTION_LSW); ! 595: hp100_outw(HP100_IO_EN | ! 596: HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW); ! 597: printk("hp100: %s: Busmaster mode requested.\n",dev->name); ! 598: } ! 599: local_mode=1; ! 600: } ! 601: ! 602: if(local_mode==1) /* default behaviour */ ! 603: { ! 604: lsw = hp100_inw(OPTION_LSW); ! 605: ! 606: if ( (lsw & HP100_IO_EN) && ! 607: (~lsw & HP100_MEM_EN) && ! 608: (~lsw & (HP100_BM_WRITE|HP100_BM_READ)) ) ! 609: { ! 610: #ifdef HP100_DEBUG ! 611: printk("hp100: %s: IO_EN bit is set on card.\n",dev->name); ! 612: #endif ! 613: local_mode=3; ! 614: } ! 615: else if ( chip == HP100_CHIPID_LASSEN && ! 616: ( lsw & (HP100_BM_WRITE|HP100_BM_READ) ) == ! 617: (HP100_BM_WRITE|HP100_BM_READ) ) ! 618: { ! 619: printk("hp100: %s: Busmaster mode enabled.\n",dev->name); ! 620: hp100_outw(HP100_MEM_EN|HP100_IO_EN|HP100_RESET_LB, OPTION_LSW); ! 621: } ! 622: else ! 623: { ! 624: #ifdef HP100_DEBUG ! 625: printk("hp100: %s: Card not configured for BM or BM not supported with this card.\n", dev->name ); ! 626: printk("hp100: %s: Trying shared memory mode.\n", dev->name); ! 627: #endif ! 628: /* In this case, try shared memory mode */ ! 629: local_mode=2; ! 630: hp100_outw(HP100_MEM_EN|HP100_SET_LB, OPTION_LSW); ! 631: /* hp100_outw(HP100_IO_EN|HP100_RESET_LB, OPTION_LSW); */ ! 632: } ! 633: } ! 634: ! 635: #ifdef HP100_DEBUG ! 636: printk( "hp100: %s: new LSW = 0x%x\n", dev->name, hp100_inw(OPTION_LSW) ); ! 637: #endif ! 638: ! 639: /* Check for shared memory on the card, eventually remap it */ ! 640: hp100_page( HW_MAP ); ! 641: mem_mapped = (( hp100_inw( OPTION_LSW ) & ( HP100_MEM_EN ) ) != 0); ! 642: mem_ptr_phys = mem_ptr_virt = NULL; ! 643: memory_size = (8192<<( (hp100_inb(SRAM)>>5)&0x07)); ! 644: virt_memory_size = 0; ! 645: ! 646: /* For memory mapped or busmaster mode, we want the memory address */ ! 647: if ( mem_mapped || (local_mode==1)) ! 648: { ! 649: mem_ptr_phys = (u_int *)( hp100_inw( MEM_MAP_LSW ) | ! 650: ( hp100_inw( MEM_MAP_MSW ) << 16 ) ); ! 651: (u_int)mem_ptr_phys &= ~0x1fff; /* 8k alignment */ ! 652: ! 653: if ( bus == HP100_BUS_ISA && ( (u_long)mem_ptr_phys & ~0xfffff ) != 0 ) ! 654: { ! 655: printk("hp100: %s: Can only use programmed i/o mode.\n", dev->name); ! 656: mem_ptr_phys = NULL; ! 657: mem_mapped = 0; ! 658: local_mode=3; /* Use programmed i/o */ ! 659: } ! 660: ! 661: /* We do not need access to shared memory in busmaster mode */ ! 662: /* However in slave mode we need to remap high (>1GB) card memory */ ! 663: if(local_mode!=1) /* = not busmaster */ ! 664: { ! 665: if ( bus == HP100_BUS_PCI && mem_ptr_phys >= (u_int *)0x100000 ) ! 666: { ! 667: /* We try with smaller memory sizes, if ioremap fails */ ! 668: for(virt_memory_size = memory_size; virt_memory_size>16383; virt_memory_size>>=1) ! 669: { ! 670: if((mem_ptr_virt=ioremap((u_long)mem_ptr_phys,virt_memory_size))==NULL) ! 671: { ! 672: #ifdef HP100_DEBUG ! 673: printk( "hp100: %s: ioremap for 0x%x bytes high PCI memory at 0x%lx failed\n", dev->name, virt_memory_size, (u_long)mem_ptr_phys ); ! 674: #endif ! 675: } ! 676: else ! 677: { ! 678: #ifdef HP100_DEBUG ! 679: printk( "hp100: %s: remapped 0x%x bytes high PCI memory at 0x%lx to 0x%lx.\n", dev->name, virt_memory_size, (u_long)mem_ptr_phys, (u_long)mem_ptr_virt); ! 680: #endif ! 681: break; ! 682: } ! 683: } ! 684: ! 685: if(mem_ptr_virt==NULL) /* all ioremap tries failed */ ! 686: { ! 687: printk("hp100: %s: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n", dev->name); ! 688: local_mode=3; ! 689: virt_memory_size = 0; ! 690: } ! 691: } ! 692: } ! 693: ! 694: } ! 695: ! 696: if(local_mode==3) /* io mapped forced */ ! 697: { ! 698: mem_mapped = 0; ! 699: mem_ptr_phys = mem_ptr_virt = NULL; ! 700: printk("hp100: %s: Using (slow) programmed i/o mode.\n", dev->name); ! 701: } ! 702: ! 703: /* Initialise the "private" data structure for this card. */ ! 704: if ( (dev->priv=kmalloc(sizeof(struct hp100_private), GFP_KERNEL)) == NULL) ! 705: return -ENOMEM; ! 706: memset( dev->priv, 0, sizeof(struct hp100_private) ); ! 707: ! 708: lp = (struct hp100_private *)dev->priv; ! 709: lp->id = eid; ! 710: lp->chip = chip; ! 711: lp->mode = local_mode; ! 712: lp->pci_bus = pci_bus; ! 713: lp->bus = bus; ! 714: lp->pci_device_fn = pci_device_fn; ! 715: lp->priority_tx = hp100_priority_tx; ! 716: lp->rx_ratio = hp100_rx_ratio; ! 717: lp->mem_ptr_phys = mem_ptr_phys; ! 718: lp->mem_ptr_virt = mem_ptr_virt; ! 719: hp100_page( ID_MAC_ADDR ); ! 720: lp->soft_model = hp100_inb( SOFT_MODEL ); ! 721: lp->mac1_mode = HP100_MAC1MODE3; ! 722: lp->mac2_mode = HP100_MAC2MODE3; ! 723: memset( &lp->hash_bytes, 0x00, 8 ); ! 724: ! 725: dev->base_addr = ioaddr; ! 726: ! 727: lp->memory_size = memory_size; ! 728: lp->virt_memory_size = virt_memory_size; ! 729: lp->rx_ratio = hp100_rx_ratio; /* can be conf'd with insmod */ ! 730: ! 731: /* memory region for programmed i/o */ ! 732: request_region( dev->base_addr, HP100_REGION_SIZE, eid->name ); ! 733: ! 734: dev->open = hp100_open; ! 735: dev->stop = hp100_close; ! 736: ! 737: if (lp->mode==1) /* busmaster */ ! 738: dev->hard_start_xmit = hp100_start_xmit_bm; ! 739: else ! 740: dev->hard_start_xmit = hp100_start_xmit; ! 741: ! 742: dev->get_stats = hp100_get_stats; ! 743: dev->set_multicast_list = &hp100_set_multicast_list; ! 744: ! 745: /* Ask the card for which IRQ line it is configured */ ! 746: hp100_page( HW_MAP ); ! 747: dev->irq = hp100_inb( IRQ_CHANNEL ) & HP100_IRQMASK; ! 748: if ( dev->irq == 2 ) ! 749: dev->irq = 9; ! 750: ! 751: if(lp->mode==1) /* busmaster */ ! 752: dev->dma=4; ! 753: ! 754: /* Ask the card for its MAC address and store it for later use. */ ! 755: hp100_page( ID_MAC_ADDR ); ! 756: for ( i = uc = 0; i < 6; i++ ) ! 757: dev->dev_addr[ i ] = hp100_inb( LAN_ADDR + i ); ! 758: ! 759: /* Reset statistics (counters) */ ! 760: hp100_clear_stats( ioaddr ); ! 761: ! 762: ether_setup( dev ); ! 763: ! 764: /* If busmaster mode is wanted, a dma-capable memory area is needed for ! 765: * the rx and tx PDLs ! 766: * PCI cards can access the whole PC memory. Therefore GFP_DMA is not ! 767: * needed for the allocation of the memory area. ! 768: */ ! 769: ! 770: /* TODO: We do not need this with old cards, where PDLs are stored ! 771: * in the cards shared memory area. But currently, busmaster has been ! 772: * implemented/tested only with the lassen chip anyway... */ ! 773: if(lp->mode==1) /* busmaster */ ! 774: { ! 775: /* Get physically continous memory for TX & RX PDLs */ ! 776: if ( (lp->page_vaddr=kmalloc(MAX_RINGSIZE+0x0f,GFP_KERNEL) ) == NULL) ! 777: return -ENOMEM; ! 778: lp->page_vaddr_algn=((u_int *) ( ((u_int)(lp->page_vaddr)+0x0f) &~0x0f)); ! 779: memset(lp->page_vaddr, 0, MAX_RINGSIZE+0x0f); ! 780: ! 781: #ifdef HP100_DEBUG_BM ! 782: printk("hp100: %s: Reserved DMA memory from 0x%x to 0x%x\n", ! 783: dev->name, ! 784: (u_int)lp->page_vaddr_algn, ! 785: (u_int)lp->page_vaddr_algn+MAX_RINGSIZE); ! 786: #endif ! 787: lp->rxrcommit = lp->txrcommit = 0; ! 788: lp->rxrhead = lp->rxrtail = &(lp->rxring[0]); ! 789: lp->txrhead = lp->txrtail = &(lp->txring[0]); ! 790: } ! 791: ! 792: /* Initialise the card. */ ! 793: /* (I'm not really sure if it's a good idea to do this during probing, but ! 794: * like this it's assured that the lan connection type can be sensed ! 795: * correctly) ! 796: */ ! 797: hp100_hwinit( dev ); ! 798: ! 799: /* Try to find out which kind of LAN the card is connected to. */ ! 800: lp->lan_type = hp100_sense_lan( dev ); ! 801: ! 802: /* Print out a message what about what we think we have probed. */ ! 803: printk( "hp100: %s: %s at 0x%x, IRQ %d, ", ! 804: dev->name, lp->id->name, ioaddr, dev->irq ); ! 805: switch ( bus ) { ! 806: case HP100_BUS_EISA: printk( "EISA" ); break; ! 807: case HP100_BUS_PCI: printk( "PCI" ); break; ! 808: default: printk( "ISA" ); break; ! 809: } ! 810: printk( " bus, %dk SRAM (rx/tx %d%%).\n", ! 811: lp->memory_size >> 10, lp->rx_ratio ); ! 812: ! 813: if ( lp->mode==2 ) /* memory mapped */ ! 814: { ! 815: printk( "hp100: %s: Memory area at 0x%lx-0x%lx", ! 816: dev->name,(u_long)mem_ptr_phys, ! 817: ((u_long)mem_ptr_phys+(mem_ptr_phys>(u_int *)0x100000?(u_long)lp->memory_size:16*1024))-1 ); ! 818: if ( mem_ptr_virt ) ! 819: printk( " (virtual base 0x%lx)", (u_long)mem_ptr_virt ); ! 820: printk( ".\n" ); ! 821: ! 822: /* Set for info when doing ifconfig */ ! 823: dev->mem_start = (u_long)mem_ptr_phys; ! 824: dev->mem_end = (u_long)mem_ptr_phys+(u_long)lp->memory_size; ! 825: } ! 826: printk( "hp100: %s: ", dev->name ); ! 827: if ( lp->lan_type != HP100_LAN_ERR ) ! 828: printk( "Adapter is attached to " ); ! 829: switch ( lp->lan_type ) { ! 830: case HP100_LAN_100: ! 831: printk( "100Mb/s Voice Grade AnyLAN network.\n" ); ! 832: break; ! 833: case HP100_LAN_10: ! 834: printk( "10Mb/s network.\n" ); ! 835: break; ! 836: default: ! 837: printk( "Warning! Link down.\n" ); ! 838: } ! 839: ! 840: return 0; ! 841: } ! 842: ! 843: ! 844: /* This procedure puts the card into a stable init state */ ! 845: static void hp100_hwinit( struct device *dev ) ! 846: { ! 847: int ioaddr = dev->base_addr; ! 848: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 849: ! 850: #ifdef HP100_DEBUG_B ! 851: hp100_outw( 0x4202, TRACE ); ! 852: printk("hp100: %s: hwinit\n", dev->name); ! 853: #endif ! 854: ! 855: /* Initialise the card. -------------------------------------------- */ ! 856: ! 857: /* Clear all pending Ints and disable Ints */ ! 858: hp100_page( PERFORMANCE ); ! 859: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 860: hp100_outw( 0xffff, IRQ_STATUS ); /* clear all pending ints */ ! 861: ! 862: hp100_outw( HP100_INT_EN | HP100_RESET_LB, OPTION_LSW ); ! 863: hp100_outw( HP100_TRI_INT | HP100_SET_HB, OPTION_LSW ); ! 864: ! 865: if(lp->mode==1) ! 866: { ! 867: hp100_BM_shutdown( dev ); /* disables BM, puts cascade in reset */ ! 868: wait(); ! 869: } ! 870: else ! 871: { ! 872: hp100_outw( HP100_INT_EN | HP100_RESET_LB, OPTION_LSW ); ! 873: hp100_cascade_reset( dev, TRUE ); ! 874: hp100_page( MAC_CTRL ); ! 875: hp100_andb( ~(HP100_RX_EN|HP100_TX_EN), MAC_CFG_1); ! 876: } ! 877: ! 878: /* Initiate EEPROM reload */ ! 879: hp100_load_eeprom( dev, 0 ); ! 880: ! 881: wait(); ! 882: ! 883: /* Go into reset again. */ ! 884: hp100_cascade_reset( dev, TRUE ); ! 885: ! 886: /* Set Option Registers to a safe state */ ! 887: hp100_outw( HP100_DEBUG_EN | ! 888: HP100_RX_HDR | ! 889: HP100_EE_EN | ! 890: HP100_BM_WRITE | ! 891: HP100_BM_READ | HP100_RESET_HB | ! 892: HP100_FAKE_INT | ! 893: HP100_INT_EN | ! 894: HP100_MEM_EN | ! 895: HP100_IO_EN | HP100_RESET_LB, OPTION_LSW); ! 896: ! 897: hp100_outw( HP100_TRI_INT | ! 898: HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW ); ! 899: ! 900: hp100_outb( HP100_PRIORITY_TX | ! 901: HP100_ADV_NXT_PKT | ! 902: HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW ); ! 903: ! 904: /* TODO: Configure MMU for Ram Test. */ ! 905: /* TODO: Ram Test. */ ! 906: ! 907: /* Re-check if adapter is still at same i/o location */ ! 908: /* (If the base i/o in eeprom has been changed but the */ ! 909: /* registers had not been changed, a reload of the eeprom */ ! 910: /* would move the adapter to the address stored in eeprom */ ! 911: ! 912: /* TODO: Code to implement. */ ! 913: ! 914: /* Until here it was code from HWdiscover procedure. */ ! 915: /* Next comes code from mmuinit procedure of SCO BM driver which is ! 916: * called from HWconfigure in the SCO driver. */ ! 917: ! 918: /* Initialise MMU, eventually switch on Busmaster Mode, initialise ! 919: * multicast filter... ! 920: */ ! 921: hp100_mmuinit( dev ); ! 922: ! 923: /* We don't turn the interrupts on here - this is done by start_interface. */ ! 924: wait(); /* TODO: Do we really need this? */ ! 925: ! 926: /* Enable Hardware (e.g. unreset) */ ! 927: hp100_cascade_reset( dev, FALSE ); ! 928: ! 929: /* ------- initialisation complete ----------- */ ! 930: ! 931: /* Finally try to log in the Hub if there may be a VG connection. */ ! 932: if( lp->lan_type != HP100_LAN_10 ) ! 933: hp100_login_to_vg_hub( dev, FALSE ); /* relogin */ ! 934: } ! 935: ! 936: ! 937: /* ! 938: * mmuinit - Reinitialise Cascade MMU and MAC settings. ! 939: * Note: Must already be in reset and leaves card in reset. ! 940: */ ! 941: static void hp100_mmuinit( struct device *dev ) ! 942: { ! 943: int ioaddr = dev->base_addr; ! 944: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 945: int i; ! 946: ! 947: #ifdef HP100_DEBUG_B ! 948: hp100_outw( 0x4203, TRACE ); ! 949: printk("hp100: %s: mmuinit\n",dev->name); ! 950: #endif ! 951: ! 952: #ifdef HP100_DEBUG ! 953: if( 0!=(hp100_inw(OPTION_LSW)&HP100_HW_RST) ) ! 954: { ! 955: printk("hp100: %s: Not in reset when entering mmuinit. Fix me.\n",dev->name); ! 956: return; ! 957: } ! 958: #endif ! 959: ! 960: /* Make sure IRQs are masked off and ack'ed. */ ! 961: hp100_page( PERFORMANCE ); ! 962: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 963: hp100_outw( 0xffff, IRQ_STATUS ); /* ack IRQ */ ! 964: ! 965: /* ! 966: * Enable Hardware ! 967: * - Clear Debug En, Rx Hdr Pipe, EE En, I/O En, Fake Int and Intr En ! 968: * - Set Tri-State Int, Bus Master Rd/Wr, and Mem Map Disable ! 969: * - Clear Priority, Advance Pkt and Xmit Cmd ! 970: */ ! 971: ! 972: hp100_outw( HP100_DEBUG_EN | ! 973: HP100_RX_HDR | ! 974: HP100_EE_EN | HP100_RESET_HB | ! 975: HP100_IO_EN | ! 976: HP100_FAKE_INT | ! 977: HP100_INT_EN | HP100_RESET_LB, OPTION_LSW ); ! 978: ! 979: hp100_outw( HP100_TRI_INT | HP100_SET_HB, OPTION_LSW); ! 980: ! 981: if(lp->mode==1) /* busmaster */ ! 982: { ! 983: hp100_outw( HP100_BM_WRITE | ! 984: HP100_BM_READ | ! 985: HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW ); ! 986: } ! 987: else if(lp->mode==2) /* memory mapped */ ! 988: { ! 989: hp100_outw( HP100_BM_WRITE | ! 990: HP100_BM_READ | HP100_RESET_HB, OPTION_LSW ); ! 991: hp100_outw( HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW ); ! 992: hp100_outw( HP100_MEM_EN | HP100_SET_LB, OPTION_LSW ); ! 993: hp100_outw( HP100_IO_EN | HP100_SET_LB, OPTION_LSW ); ! 994: } ! 995: else if( lp->mode==3 ) /* i/o mapped mode */ ! 996: { ! 997: hp100_outw( HP100_MMAP_DIS | HP100_SET_HB | ! 998: HP100_IO_EN | HP100_SET_LB, OPTION_LSW ); ! 999: } ! 1000: ! 1001: hp100_page( HW_MAP ); ! 1002: hp100_outb( 0, EARLYRXCFG ); ! 1003: hp100_outw( 0, EARLYTXCFG ); ! 1004: ! 1005: /* ! 1006: * Enable Bus Master mode ! 1007: */ ! 1008: if(lp->mode==1) /* busmaster */ ! 1009: { ! 1010: /* Experimental: Set some PCI configuration bits */ ! 1011: hp100_page( HW_MAP ); ! 1012: hp100_andb( ~HP100_PDL_USE3, MODECTRL1 ); /* BM engine read maximum */ ! 1013: hp100_andb( ~HP100_TX_DUALQ, MODECTRL1 ); /* No Queue for Priority TX */ ! 1014: ! 1015: /* PCI Bus failures should result in a Misc. Interrupt */ ! 1016: hp100_orb( HP100_EN_BUS_FAIL, MODECTRL2); ! 1017: ! 1018: hp100_outw( HP100_BM_READ | HP100_BM_WRITE | HP100_SET_HB, OPTION_LSW ); ! 1019: hp100_page( HW_MAP ); ! 1020: /* Use Burst Mode and switch on PAGE_CK */ ! 1021: hp100_orb( HP100_BM_BURST_RD | ! 1022: HP100_BM_BURST_WR, BM); ! 1023: if((lp->chip==HP100_CHIPID_RAINIER)||(lp->chip==HP100_CHIPID_SHASTA)) ! 1024: hp100_orb( HP100_BM_PAGE_CK, BM ); ! 1025: hp100_orb( HP100_BM_MASTER, BM ); ! 1026: } ! 1027: else /* not busmaster */ ! 1028: { ! 1029: hp100_page(HW_MAP); ! 1030: hp100_andb(~HP100_BM_MASTER, BM ); ! 1031: } ! 1032: ! 1033: /* ! 1034: * Divide card memory into regions for Rx, Tx and, if non-ETR chip, PDLs ! 1035: */ ! 1036: hp100_page( MMU_CFG ); ! 1037: if(lp->mode==1) /* only needed for Busmaster */ ! 1038: { ! 1039: int xmit_stop, recv_stop; ! 1040: ! 1041: if((lp->chip==HP100_CHIPID_RAINIER)||(lp->chip==HP100_CHIPID_SHASTA)) ! 1042: { ! 1043: int pdl_stop; ! 1044: ! 1045: /* ! 1046: * Each pdl is 508 bytes long. (63 frags * 4 bytes for address and ! 1047: * 4 bytes for header). We will leave NUM_RXPDLS * 508 (rounded ! 1048: * to the next higher 1k boundary) bytes for the rx-pdl's ! 1049: * Note: For non-etr chips the transmit stop register must be ! 1050: * programmed on a 1k boundary, i.e. bits 9:0 must be zero. ! 1051: */ ! 1052: pdl_stop = lp->memory_size; ! 1053: xmit_stop = ( pdl_stop-508*(MAX_RX_PDL)-16 )& ~(0x03ff); ! 1054: recv_stop = ( xmit_stop * (lp->rx_ratio)/100 ) &~(0x03ff); ! 1055: hp100_outw( (pdl_stop>>4)-1, PDL_MEM_STOP ); ! 1056: #ifdef HP100_DEBUG_BM ! 1057: printk("hp100: %s: PDL_STOP = 0x%x\n", dev->name, pdl_stop); ! 1058: #endif ! 1059: } ! 1060: else /* ETR chip (Lassen) in busmaster mode */ ! 1061: { ! 1062: xmit_stop = ( lp->memory_size ) - 1; ! 1063: recv_stop = ( ( lp->memory_size * lp->rx_ratio ) / 100 ) & ~(0x03ff); ! 1064: } ! 1065: ! 1066: hp100_outw( xmit_stop>>4 , TX_MEM_STOP ); ! 1067: hp100_outw( recv_stop>>4 , RX_MEM_STOP ); ! 1068: #ifdef HP100_DEBUG_BM ! 1069: printk("hp100: %s: TX_STOP = 0x%x\n",dev->name,xmit_stop>>4); ! 1070: printk("hp100: %s: RX_STOP = 0x%x\n",dev->name,recv_stop>>4); ! 1071: #endif ! 1072: } ! 1073: else /* Slave modes (memory mapped and programmed io) */ ! 1074: { ! 1075: hp100_outw( (((lp->memory_size*lp->rx_ratio)/100)>>4), RX_MEM_STOP ); ! 1076: hp100_outw( ((lp->memory_size - 1 )>>4), TX_MEM_STOP ); ! 1077: #ifdef HP100_DEBUG ! 1078: printk("hp100: %s: TX_MEM_STOP: 0x%x\n", dev->name,hp100_inw(TX_MEM_STOP)); ! 1079: printk("hp100: %s: RX_MEM_STOP: 0x%x\n", dev->name,hp100_inw(RX_MEM_STOP)); ! 1080: #endif ! 1081: } ! 1082: ! 1083: /* Write MAC address into page 1 */ ! 1084: hp100_page( MAC_ADDRESS ); ! 1085: for ( i = 0; i < 6; i++ ) ! 1086: hp100_outb( dev->dev_addr[ i ], MAC_ADDR + i ); ! 1087: ! 1088: /* Zero the multicast hash registers */ ! 1089: for ( i = 0; i < 8; i++ ) ! 1090: hp100_outb( 0x0, HASH_BYTE0 + i ); ! 1091: ! 1092: /* Set up MAC defaults */ ! 1093: hp100_page( MAC_CTRL ); ! 1094: ! 1095: /* Go to LAN Page and zero all filter bits */ ! 1096: /* Zero accept error, accept multicast, accept broadcast and accept */ ! 1097: /* all directed packet bits */ ! 1098: hp100_andb( ~(HP100_RX_EN| ! 1099: HP100_TX_EN| ! 1100: HP100_ACC_ERRORED| ! 1101: HP100_ACC_MC| ! 1102: HP100_ACC_BC| ! 1103: HP100_ACC_PHY), MAC_CFG_1 ); ! 1104: ! 1105: hp100_outb( 0x00, MAC_CFG_2 ); ! 1106: ! 1107: /* Zero the frame format bit. This works around a training bug in the */ ! 1108: /* new hubs. */ ! 1109: hp100_outb( 0x00, VG_LAN_CFG_2); /* (use 802.3) */ ! 1110: ! 1111: if(lp->priority_tx) ! 1112: hp100_outb( HP100_PRIORITY_TX | HP100_SET_LB, OPTION_MSW ); ! 1113: else ! 1114: hp100_outb( HP100_PRIORITY_TX | HP100_RESET_LB, OPTION_MSW ); ! 1115: ! 1116: hp100_outb( HP100_ADV_NXT_PKT | ! 1117: HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW ); ! 1118: ! 1119: /* If busmaster, initialize the PDLs */ ! 1120: if(lp->mode==1) ! 1121: hp100_init_pdls( dev ); ! 1122: ! 1123: /* Go to performance page and initalize isr and imr registers */ ! 1124: hp100_page( PERFORMANCE ); ! 1125: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 1126: hp100_outw( 0xffff, IRQ_STATUS ); /* ack IRQ */ ! 1127: } ! 1128: ! 1129: ! 1130: /* ! 1131: * open/close functions ! 1132: */ ! 1133: ! 1134: static int hp100_open( struct device *dev ) ! 1135: { ! 1136: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1137: #ifdef HP100_DEBUG_B ! 1138: int ioaddr=dev->base_addr; ! 1139: #endif ! 1140: ! 1141: #ifdef HP100_DEBUG_B ! 1142: hp100_outw( 0x4204, TRACE ); ! 1143: printk("hp100: %s: open\n",dev->name); ! 1144: #endif ! 1145: ! 1146: /* New: if bus is PCI or EISA, interrupts might be shared interrupts */ ! 1147: if ( request_irq(dev->irq, hp100_interrupt, ! 1148: lp->bus==HP100_BUS_PCI||lp->bus==HP100_BUS_EISA?SA_SHIRQ:SA_INTERRUPT, ! 1149: lp->id->name, dev)) ! 1150: { ! 1151: printk( "hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq ); ! 1152: return -EAGAIN; ! 1153: } ! 1154: ! 1155: MOD_INC_USE_COUNT; ! 1156: ! 1157: dev->tbusy = 0; ! 1158: dev->trans_start = jiffies; ! 1159: dev->interrupt = 0; ! 1160: dev->start = 1; ! 1161: ! 1162: lp->lan_type = hp100_sense_lan( dev ); ! 1163: lp->mac1_mode = HP100_MAC1MODE3; ! 1164: lp->mac2_mode = HP100_MAC2MODE3; ! 1165: memset( &lp->hash_bytes, 0x00, 8 ); ! 1166: ! 1167: hp100_stop_interface( dev ); ! 1168: ! 1169: hp100_hwinit( dev ); ! 1170: ! 1171: hp100_start_interface( dev ); /* sets mac modes, enables interrupts */ ! 1172: ! 1173: return 0; ! 1174: } ! 1175: ! 1176: ! 1177: /* The close function is called when the interface is to be brought down */ ! 1178: static int hp100_close( struct device *dev ) ! 1179: { ! 1180: int ioaddr = dev->base_addr; ! 1181: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1182: ! 1183: #ifdef HP100_DEBUG_B ! 1184: hp100_outw( 0x4205, TRACE ); ! 1185: printk("hp100: %s: close\n", dev->name); ! 1186: #endif ! 1187: ! 1188: hp100_page( PERFORMANCE ); ! 1189: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all IRQs */ ! 1190: ! 1191: hp100_stop_interface( dev ); ! 1192: ! 1193: if ( lp->lan_type == HP100_LAN_100 ) ! 1194: lp->hub_status=hp100_login_to_vg_hub( dev, FALSE ); ! 1195: ! 1196: dev->tbusy = 1; ! 1197: dev->start = 0; ! 1198: ! 1199: free_irq( dev->irq, dev ); ! 1200: ! 1201: #ifdef HP100_DEBUG ! 1202: printk( "hp100: %s: close LSW = 0x%x\n", dev->name, hp100_inw(OPTION_LSW) ); ! 1203: #endif ! 1204: ! 1205: MOD_DEC_USE_COUNT; ! 1206: return 0; ! 1207: } ! 1208: ! 1209: ! 1210: /* ! 1211: * Configure the PDL Rx rings and LAN ! 1212: */ ! 1213: static void hp100_init_pdls( struct device *dev ) ! 1214: { ! 1215: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1216: hp100_ring_t *ringptr; ! 1217: u_int *pageptr; ! 1218: int i; ! 1219: ! 1220: #ifdef HP100_DEBUG_B ! 1221: int ioaddr = dev->base_addr; ! 1222: #endif ! 1223: ! 1224: #ifdef HP100_DEBUG_B ! 1225: hp100_outw( 0x4206, TRACE ); ! 1226: printk("hp100: %s: init pdls\n", dev->name); ! 1227: #endif ! 1228: ! 1229: if(0==lp->page_vaddr_algn) ! 1230: printk("hp100: %s: Warning: lp->page_vaddr_algn not initialised!\n",dev->name); ! 1231: else ! 1232: { ! 1233: /* pageptr shall point into the DMA accessible memory region */ ! 1234: /* we use this pointer to status the upper limit of allocated */ ! 1235: /* memory in the allocated page. */ ! 1236: /* note: align the pointers to the pci cache line size */ ! 1237: memset(lp->page_vaddr_algn, 0, MAX_RINGSIZE); /* Zero Rx/Tx ring page */ ! 1238: pageptr=lp->page_vaddr_algn; ! 1239: ! 1240: lp->rxrcommit =0; ! 1241: ringptr = lp->rxrhead = lp-> rxrtail = &(lp->rxring[0]); ! 1242: ! 1243: /* Initialise Rx Ring */ ! 1244: for (i=MAX_RX_PDL-1; i>=0; i--) ! 1245: { ! 1246: lp->rxring[i].next = ringptr; ! 1247: ringptr=&(lp->rxring[i]); ! 1248: pageptr+=hp100_init_rxpdl(dev, ringptr, pageptr); ! 1249: } ! 1250: ! 1251: /* Initialise Tx Ring */ ! 1252: lp->txrcommit = 0; ! 1253: ringptr = lp->txrhead = lp->txrtail = &(lp->txring[0]); ! 1254: for (i=MAX_TX_PDL-1; i>=0; i--) ! 1255: { ! 1256: lp->txring[i].next = ringptr; ! 1257: ringptr=&(lp->txring[i]); ! 1258: pageptr+=hp100_init_txpdl(dev, ringptr, pageptr); ! 1259: } ! 1260: } ! 1261: } ! 1262: ! 1263: ! 1264: /* These functions "format" the entries in the pdl structure */ ! 1265: /* They return how much memory the fragments need. */ ! 1266: static int hp100_init_rxpdl( struct device *dev, register hp100_ring_t *ringptr, register u32 *pdlptr ) ! 1267: { ! 1268: /* pdlptr is starting adress for this pdl */ ! 1269: ! 1270: if( 0!=( ((unsigned)pdlptr) & 0xf) ) ! 1271: printk("hp100: %s: Init rxpdl: Unaligned pdlptr 0x%x.\n",dev->name,(unsigned)pdlptr); ! 1272: ! 1273: ringptr->pdl = pdlptr+1; ! 1274: ringptr->pdl_paddr = virt_to_bus(pdlptr+1); ! 1275: ringptr->skb = (void *) NULL; ! 1276: ! 1277: /* ! 1278: * Write address and length of first PDL Fragment (which is used for ! 1279: * storing the RX-Header ! 1280: * We use the 4 bytes _before_ the PDH in the pdl memory area to ! 1281: * store this information. (PDH is at offset 0x04) ! 1282: */ ! 1283: /* Note that pdlptr+1 and not pdlptr is the pointer to the PDH */ ! 1284: ! 1285: *(pdlptr+2) =(u_int) virt_to_bus(pdlptr); /* Address Frag 1 */ ! 1286: *(pdlptr+3) = 4; /* Length Frag 1 */ ! 1287: ! 1288: return( ( ((MAX_RX_FRAG*2+2)+3) /4)*4 ); ! 1289: } ! 1290: ! 1291: ! 1292: static int hp100_init_txpdl( struct device *dev, register hp100_ring_t *ringptr, register u32 *pdlptr ) ! 1293: { ! 1294: if( 0!=( ((unsigned)pdlptr) & 0xf) ) ! 1295: printk("hp100: %s: Init txpdl: Unaligned pdlptr 0x%x.\n",dev->name,(unsigned) pdlptr); ! 1296: ! 1297: ringptr->pdl = pdlptr; /* +1; */ ! 1298: ringptr->pdl_paddr = virt_to_bus(pdlptr); /* +1 */ ! 1299: ringptr->skb = (void *) NULL; ! 1300: ! 1301: return((((MAX_TX_FRAG*2+2)+3)/4)*4); ! 1302: } ! 1303: ! 1304: ! 1305: /* ! 1306: * hp100_build_rx_pdl allocates an skb_buff of maximum size plus two bytes ! 1307: * for possible odd word alignment rounding up to next dword and set PDL ! 1308: * address for fragment#2 ! 1309: * Returns: 0 if unable to allocate skb_buff ! 1310: * 1 if successful ! 1311: */ ! 1312: int hp100_build_rx_pdl( hp100_ring_t *ringptr, struct device *dev ) ! 1313: { ! 1314: #ifdef HP100_DEBUG_B ! 1315: int ioaddr = dev->base_addr; ! 1316: #endif ! 1317: #ifdef HP100_DEBUG_BM ! 1318: u_int *p; ! 1319: #endif ! 1320: ! 1321: #ifdef HP100_DEBUG_B ! 1322: hp100_outw( 0x4207, TRACE ); ! 1323: printk("hp100: %s: build rx pdl\n", dev->name); ! 1324: #endif ! 1325: ! 1326: /* Allocate skb buffer of maximum size */ ! 1327: /* Note: This depends on the alloc_skb functions allocating more ! 1328: * space than requested, i.e. aligning to 16bytes */ ! 1329: ! 1330: ringptr->skb = dev_alloc_skb( ((MAX_ETHER_SIZE+2+3)/4)*4 ); ! 1331: ! 1332: if(NULL!=ringptr->skb) ! 1333: { ! 1334: /* ! 1335: * Reserve 2 bytes at the head of the buffer to land the IP header ! 1336: * on a long word boundary (According to the Network Driver section ! 1337: * in the Linux KHG, this should help to increase performance.) ! 1338: */ ! 1339: skb_reserve(ringptr->skb, 2); ! 1340: ! 1341: ringptr->skb->dev=dev; ! 1342: ringptr->skb->data=(u_char *)skb_put(ringptr->skb, MAX_ETHER_SIZE ); ! 1343: ! 1344: /* ringptr->pdl points to the beginning of the PDL, i.e. the PDH */ ! 1345: /* Note: 1st Fragment is used for the 4 byte packet status ! 1346: * (receive header). Its PDL entries are set up by init_rxpdl. So ! 1347: * here we only have to set up the PDL fragment entries for the data ! 1348: * part. Those 4 bytes will be stored in the DMA memory region ! 1349: * directly before the PDL. ! 1350: */ ! 1351: #ifdef HP100_DEBUG_BM ! 1352: printk("hp100: %s: build_rx_pdl: PDH@0x%x, skb->data (len %d) at 0x%x\n", ! 1353: dev->name, ! 1354: (u_int) ringptr->pdl, ! 1355: ((MAX_ETHER_SIZE+2+3)/4)*4, ! 1356: (unsigned int) ringptr->skb->data); ! 1357: #endif ! 1358: ! 1359: ringptr->pdl[0] = 0x00020000; /* Write PDH */ ! 1360: ringptr->pdl[3] = ((u_int)virt_to_bus(ringptr->skb->data)); ! 1361: ringptr->pdl[4] = MAX_ETHER_SIZE; /* Length of Data */ ! 1362: ! 1363: #ifdef HP100_DEBUG_BM ! 1364: for(p=(ringptr->pdl); p<(ringptr->pdl+5); p++) ! 1365: printk("hp100: %s: Adr 0x%.8x = 0x%.8x\n",dev->name,(u_int) p,(u_int) *p ); ! 1366: #endif ! 1367: return(1); ! 1368: } ! 1369: /* else: */ ! 1370: /* alloc_skb failed (no memory) -> still can receive the header ! 1371: * fragment into PDL memory. make PDL safe by clearing msgptr and ! 1372: * making the PDL only 1 fragment (i.e. the 4 byte packet status) ! 1373: */ ! 1374: #ifdef HP100_DEBUG_BM ! 1375: printk("hp100: %s: build_rx_pdl: PDH@0x%x, No space for skb.\n", ! 1376: dev->name, ! 1377: (u_int) ringptr->pdl); ! 1378: #endif ! 1379: ! 1380: ringptr->pdl[0]=0x00010000; /* PDH: Count=1 Fragment */ ! 1381: ! 1382: return(0); ! 1383: } ! 1384: ! 1385: ! 1386: /* ! 1387: * hp100_rxfill - attempt to fill the Rx Ring will empty skb's ! 1388: * ! 1389: * Makes assumption that skb's are always contiguous memory areas and ! 1390: * therefore PDLs contain only 2 physical fragments. ! 1391: * - While the number of Rx PDLs with buffers is less than maximum ! 1392: * a. Get a maximum packet size skb ! 1393: * b. Put the physical address of the buffer into the PDL. ! 1394: * c. Output physical address of PDL to adapter. ! 1395: */ ! 1396: static void hp100_rxfill( struct device *dev ) ! 1397: { ! 1398: int ioaddr=dev->base_addr; ! 1399: ! 1400: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1401: hp100_ring_t *ringptr; ! 1402: ! 1403: #ifdef HP100_DEBUG_B ! 1404: hp100_outw( 0x4208, TRACE ); ! 1405: printk("hp100: %s: rxfill\n",dev->name); ! 1406: #endif ! 1407: ! 1408: hp100_page( PERFORMANCE ); ! 1409: ! 1410: while (lp->rxrcommit < MAX_RX_PDL) ! 1411: { ! 1412: /* ! 1413: ** Attempt to get a buffer and build a Rx PDL. ! 1414: */ ! 1415: ringptr = lp->rxrtail; ! 1416: if (0 == hp100_build_rx_pdl( ringptr, dev )) ! 1417: { ! 1418: return; /* None available, return */ ! 1419: } ! 1420: ! 1421: /* Hand this PDL over to the card */ ! 1422: /* Note: This needs performance page selected! */ ! 1423: #ifdef HP100_DEBUG_BM ! 1424: printk("hp100: %s: rxfill: Hand to card: pdl #%d @0x%x phys:0x%x, buffer: 0x%x\n", ! 1425: dev->name, ! 1426: lp->rxrcommit, ! 1427: (u_int)ringptr->pdl, ! 1428: (u_int)ringptr->pdl_paddr, ! 1429: (u_int)ringptr->pdl[3]); ! 1430: #endif ! 1431: ! 1432: hp100_outl( (u32)ringptr->pdl_paddr, RX_PDA); ! 1433: ! 1434: lp->rxrcommit += 1; ! 1435: lp->rxrtail = ringptr->next; ! 1436: } ! 1437: } ! 1438: ! 1439: ! 1440: /* ! 1441: * BM_shutdown - shutdown bus mastering and leave chip in reset state ! 1442: */ ! 1443: ! 1444: static void hp100_BM_shutdown( struct device *dev ) ! 1445: { ! 1446: int ioaddr = dev->base_addr; ! 1447: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1448: unsigned long time; ! 1449: ! 1450: #ifdef HP100_DEBUG_B ! 1451: hp100_outw( 0x4209, TRACE ); ! 1452: printk("hp100: %s: bm shutdown\n",dev->name); ! 1453: #endif ! 1454: ! 1455: hp100_page( PERFORMANCE ); ! 1456: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 1457: hp100_outw( 0xffff, IRQ_STATUS ); /* Ack all ints */ ! 1458: ! 1459: /* Ensure Interrupts are off */ ! 1460: hp100_outw( HP100_INT_EN | HP100_RESET_LB , OPTION_LSW ); ! 1461: ! 1462: /* Disable all MAC activity */ ! 1463: hp100_page( MAC_CTRL ); ! 1464: hp100_andb( ~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1 ); /* stop rx/tx */ ! 1465: ! 1466: /* If cascade MMU is not already in reset */ ! 1467: if (0 != (hp100_inw(OPTION_LSW)&HP100_HW_RST) ) ! 1468: { ! 1469: /* Wait 1.3ms (10Mb max packet time) to ensure MAC is idle so ! 1470: * MMU pointers will not be reset out from underneath ! 1471: */ ! 1472: hp100_page( MAC_CTRL ); ! 1473: for(time=0; time<5000; time++) ! 1474: { ! 1475: if( (hp100_inb(MAC_CFG_1)&(HP100_TX_IDLE|HP100_RX_IDLE))== ! 1476: (HP100_TX_IDLE|HP100_RX_IDLE) ) break; ! 1477: } ! 1478: ! 1479: /* Shutdown algorithm depends on the generation of Cascade */ ! 1480: if( lp->chip==HP100_CHIPID_LASSEN ) ! 1481: { /* ETR shutdown/reset */ ! 1482: /* Disable Busmaster mode and wait for bit to go to zero. */ ! 1483: hp100_page(HW_MAP); ! 1484: hp100_andb( ~HP100_BM_MASTER, BM ); ! 1485: /* 100 ms timeout */ ! 1486: for(time=0; time<32000; time++) ! 1487: { ! 1488: if ( 0 == (hp100_inb( BM ) & HP100_BM_MASTER) ) break; ! 1489: } ! 1490: } ! 1491: else ! 1492: { /* Shasta or Rainier Shutdown/Reset */ ! 1493: /* To ensure all bus master inloading activity has ceased, ! 1494: * wait for no Rx PDAs or no Rx packets on card. ! 1495: */ ! 1496: hp100_page( PERFORMANCE ); ! 1497: /* 100 ms timeout */ ! 1498: for(time=0; time<10000; time++) ! 1499: { ! 1500: /* RX_PDL: PDLs not executed. */ ! 1501: /* RX_PKT_CNT: RX'd packets on card. */ ! 1502: if ( (hp100_inb( RX_PDL ) == 0) && ! 1503: (hp100_inb( RX_PKT_CNT ) == 0) ) break; ! 1504: } ! 1505: ! 1506: if(time>=10000) ! 1507: printk("hp100: %s: BM shutdown error.\n", dev->name); ! 1508: ! 1509: /* To ensure all bus master outloading activity has ceased, ! 1510: * wait until the Tx PDA count goes to zero or no more Tx space ! 1511: * available in the Tx region of the card. ! 1512: */ ! 1513: /* 100 ms timeout */ ! 1514: for(time=0; time<10000; time++) { ! 1515: if ( (0 == hp100_inb( TX_PKT_CNT )) && ! 1516: (0 != (hp100_inb( TX_MEM_FREE )&HP100_AUTO_COMPARE))) break; ! 1517: } ! 1518: ! 1519: /* Disable Busmaster mode */ ! 1520: hp100_page(HW_MAP); ! 1521: hp100_andb( ~HP100_BM_MASTER, BM ); ! 1522: } /* end of shutdown procedure for non-etr parts */ ! 1523: ! 1524: hp100_cascade_reset( dev, TRUE ); ! 1525: } ! 1526: hp100_page( PERFORMANCE ); ! 1527: /* hp100_outw( HP100_BM_READ | HP100_BM_WRITE | HP100_RESET_HB, OPTION_LSW ); */ ! 1528: /* Busmaster mode should be shut down now. */ ! 1529: } ! 1530: ! 1531: ! 1532: ! 1533: /* ! 1534: * transmit functions ! 1535: */ ! 1536: ! 1537: /* tx function for busmaster mode */ ! 1538: static int hp100_start_xmit_bm( struct sk_buff *skb, struct device *dev ) ! 1539: { ! 1540: unsigned long flags; ! 1541: int i, ok_flag; ! 1542: int ioaddr = dev->base_addr; ! 1543: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1544: hp100_ring_t *ringptr; ! 1545: ! 1546: #ifdef HP100_DEBUG_B ! 1547: hp100_outw( 0x4210, TRACE ); ! 1548: printk("hp100: %s: start_xmit_bm\n",dev->name); ! 1549: #endif ! 1550: ! 1551: if ( skb==NULL ) ! 1552: { ! 1553: #ifndef LINUX_2_1 ! 1554: dev_tint( dev ); ! 1555: #endif ! 1556: return 0; ! 1557: } ! 1558: ! 1559: if ( skb->len <= 0 ) return 0; ! 1560: ! 1561: /* Get Tx ring tail pointer */ ! 1562: if( lp->txrtail->next==lp->txrhead ) ! 1563: { ! 1564: /* No memory. */ ! 1565: #ifdef HP100_DEBUG ! 1566: printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name); ! 1567: #endif ! 1568: /* not waited long enough since last tx? */ ! 1569: if ( jiffies - dev->trans_start < HZ ) return -EAGAIN; ! 1570: ! 1571: if ( lp->lan_type < 0 ) /* no LAN type detected yet? */ ! 1572: { ! 1573: hp100_stop_interface( dev ); ! 1574: if ( ( lp->lan_type = hp100_sense_lan( dev ) ) < 0 ) ! 1575: { ! 1576: printk( "hp100: %s: no connection found - check wire\n", dev->name ); ! 1577: hp100_start_interface( dev ); /* 10Mb/s RX pkts maybe handled */ ! 1578: return -EIO; ! 1579: } ! 1580: if ( lp->lan_type == HP100_LAN_100 ) ! 1581: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); /* relogin */ ! 1582: hp100_start_interface( dev ); ! 1583: } ! 1584: ! 1585: if ( lp->lan_type == HP100_LAN_100 && lp->hub_status < 0 ) ! 1586: /* we have a 100Mb/s adapter but it isn't connected to hub */ ! 1587: { ! 1588: printk( "hp100: %s: login to 100Mb/s hub retry\n", dev->name ); ! 1589: hp100_stop_interface( dev ); ! 1590: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1591: hp100_start_interface( dev ); ! 1592: } ! 1593: else ! 1594: { ! 1595: hp100_ints_off(); ! 1596: i = hp100_sense_lan( dev ); ! 1597: hp100_ints_on(); ! 1598: if ( i == HP100_LAN_ERR ) ! 1599: printk( "hp100: %s: link down detected\n", dev->name ); ! 1600: else ! 1601: if ( lp->lan_type != i ) /* cable change! */ ! 1602: { ! 1603: /* it's very hard - all network setting must be changed!!! */ ! 1604: printk( "hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name ); ! 1605: lp->lan_type = i; ! 1606: hp100_stop_interface( dev ); ! 1607: if ( lp->lan_type == HP100_LAN_100 ) ! 1608: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1609: hp100_start_interface( dev ); ! 1610: } ! 1611: else ! 1612: { ! 1613: printk( "hp100: %s: interface reset\n", dev->name ); ! 1614: hp100_stop_interface( dev ); ! 1615: if ( lp->lan_type == HP100_LAN_100 ) ! 1616: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1617: hp100_start_interface( dev ); ! 1618: } ! 1619: } ! 1620: ! 1621: dev->trans_start = jiffies; ! 1622: return -EAGAIN; ! 1623: } ! 1624: ! 1625: /* ! 1626: * we have to turn int's off before modifying this, otherwise ! 1627: * a tx_pdl_cleanup could occur at the same time ! 1628: */ ! 1629: save_flags( flags ); ! 1630: cli(); ! 1631: ringptr=lp->txrtail; ! 1632: lp->txrtail=ringptr->next; ! 1633: ! 1634: /* Check whether packet has minimal packet size */ ! 1635: ok_flag = skb->len >= HP100_MIN_PACKET_SIZE; ! 1636: i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE; ! 1637: ! 1638: ringptr->skb=skb; ! 1639: ringptr->pdl[0]=((1<<16) | i); /* PDH: 1 Fragment & length */ ! 1640: ringptr->pdl[1]=(u32)virt_to_bus(skb->data); /* 1st Frag: Adr. of data */ ! 1641: if(lp->chip==HP100_CHIPID_SHASTA) ! 1642: { ! 1643: /* TODO:Could someone who has the EISA card please check if this works? */ ! 1644: ringptr->pdl[2]=i; ! 1645: } ! 1646: else /* Lassen */ ! 1647: { ! 1648: /* In the PDL, don't use the padded size but the real packet size: */ ! 1649: ringptr->pdl[2]=skb->len; /* 1st Frag: Length of frag */ ! 1650: } ! 1651: ! 1652: /* Hand this PDL to the card. */ ! 1653: hp100_outl( ringptr->pdl_paddr, TX_PDA_L ); /* Low Prio. Queue */ ! 1654: ! 1655: lp->txrcommit++; ! 1656: restore_flags( flags ); ! 1657: ! 1658: /* Update statistics */ ! 1659: lp->stats.tx_packets++; ! 1660: #ifdef LINUX_2_1 ! 1661: lp->stats.tx_bytes += skb->len; ! 1662: #endif ! 1663: dev->trans_start = jiffies; ! 1664: ! 1665: return 0; ! 1666: } ! 1667: ! 1668: ! 1669: /* clean_txring checks if packets have been sent by the card by reading ! 1670: * the TX_PDL register from the performance page and comparing it to the ! 1671: * number of commited packets. It then frees the skb's of the packets that ! 1672: * obviously have been sent to the network. ! 1673: * ! 1674: * Needs the PERFORMANCE page selected. ! 1675: */ ! 1676: static void hp100_clean_txring( struct device *dev ) ! 1677: { ! 1678: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1679: int ioaddr = dev->base_addr; ! 1680: int donecount; ! 1681: ! 1682: #ifdef HP100_DEBUG_B ! 1683: hp100_outw( 0x4211, TRACE ); ! 1684: printk("hp100: %s: clean txring\n", dev->name); ! 1685: #endif ! 1686: ! 1687: /* How many PDLs have been transmitted? */ ! 1688: donecount=(lp->txrcommit)-hp100_inb(TX_PDL); ! 1689: ! 1690: #ifdef HP100_DEBUG ! 1691: if(donecount>MAX_TX_PDL) ! 1692: printk("hp100: %s: Warning: More PDLs transmitted than commited to card???\n",dev->name); ! 1693: #endif ! 1694: ! 1695: for( ; 0!=donecount; donecount-- ) ! 1696: { ! 1697: #ifdef HP100_DEBUG_BM ! 1698: printk("hp100: %s: Free skb: data @0x%.8x txrcommit=0x%x TXPDL=0x%x, done=0x%x\n", ! 1699: dev->name, ! 1700: (u_int) lp->txrhead->skb->data, ! 1701: lp->txrcommit, ! 1702: hp100_inb(TX_PDL), ! 1703: donecount); ! 1704: #endif ! 1705: #ifdef LINUX_2_1 ! 1706: dev_kfree_skb( lp->txrhead->skb ); ! 1707: #else ! 1708: dev_kfree_skb( lp->txrhead->skb, FREE_WRITE ); ! 1709: #endif ! 1710: lp->txrhead->skb=(void *)NULL; ! 1711: lp->txrhead=lp->txrhead->next; ! 1712: lp->txrcommit--; ! 1713: } ! 1714: } ! 1715: ! 1716: ! 1717: /* tx function for slave modes */ ! 1718: static int hp100_start_xmit( struct sk_buff *skb, struct device *dev ) ! 1719: { ! 1720: int i, ok_flag; ! 1721: int ioaddr = dev->base_addr; ! 1722: u_short val; ! 1723: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1724: ! 1725: #ifdef HP100_DEBUG_B ! 1726: hp100_outw( 0x4212, TRACE ); ! 1727: printk("hp100: %s: start_xmit\n", dev->name); ! 1728: #endif ! 1729: ! 1730: if ( skb==NULL ) ! 1731: { ! 1732: #ifndef LINUX_2_1 ! 1733: dev_tint( dev ); ! 1734: #endif ! 1735: return 0; ! 1736: } ! 1737: ! 1738: if ( skb->len <= 0 ) return 0; ! 1739: ! 1740: if ( lp->lan_type < 0 ) /* no LAN type detected yet? */ ! 1741: { ! 1742: hp100_stop_interface( dev ); ! 1743: if ( ( lp->lan_type = hp100_sense_lan( dev ) ) < 0 ) ! 1744: { ! 1745: printk( "hp100: %s: no connection found - check wire\n", dev->name ); ! 1746: hp100_start_interface( dev ); /* 10Mb/s RX packets maybe handled */ ! 1747: return -EIO; ! 1748: } ! 1749: if ( lp->lan_type == HP100_LAN_100 ) ! 1750: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); /* relogin */ ! 1751: hp100_start_interface( dev ); ! 1752: } ! 1753: ! 1754: /* If there is not enough free memory on the card... */ ! 1755: i=hp100_inl(TX_MEM_FREE)&0x7fffffff; ! 1756: if ( !(((i/2)-539)>(skb->len+16) && (hp100_inb(TX_PKT_CNT)<255)) ) ! 1757: { ! 1758: #ifdef HP100_DEBUG ! 1759: printk( "hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i ); ! 1760: #endif ! 1761: /* not waited long enough since last failed tx try? */ ! 1762: if ( jiffies - dev->trans_start < HZ ) ! 1763: { ! 1764: #ifdef HP100_DEBUG ! 1765: printk("hp100: %s: trans_start timing problem\n", dev->name); ! 1766: #endif ! 1767: return -EAGAIN; ! 1768: } ! 1769: if ( lp->lan_type == HP100_LAN_100 && lp->hub_status < 0 ) ! 1770: /* we have a 100Mb/s adapter but it isn't connected to hub */ ! 1771: { ! 1772: printk( "hp100: %s: login to 100Mb/s hub retry\n", dev->name ); ! 1773: hp100_stop_interface( dev ); ! 1774: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1775: hp100_start_interface( dev ); ! 1776: } ! 1777: else ! 1778: { ! 1779: hp100_ints_off(); ! 1780: i = hp100_sense_lan( dev ); ! 1781: hp100_ints_on(); ! 1782: if ( i == HP100_LAN_ERR ) ! 1783: printk( "hp100: %s: link down detected\n", dev->name ); ! 1784: else ! 1785: if ( lp->lan_type != i ) /* cable change! */ ! 1786: { ! 1787: /* it's very hard - all network setting must be changed!!! */ ! 1788: printk( "hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name ); ! 1789: lp->lan_type = i; ! 1790: hp100_stop_interface( dev ); ! 1791: if ( lp->lan_type == HP100_LAN_100 ) ! 1792: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1793: hp100_start_interface( dev ); ! 1794: } ! 1795: else ! 1796: { ! 1797: printk( "hp100: %s: interface reset\n", dev->name ); ! 1798: hp100_stop_interface( dev ); ! 1799: if ( lp->lan_type == HP100_LAN_100 ) ! 1800: lp->hub_status = hp100_login_to_vg_hub( dev, FALSE ); ! 1801: hp100_start_interface( dev ); ! 1802: udelay(1000); ! 1803: } ! 1804: } ! 1805: dev->trans_start = jiffies; ! 1806: return -EAGAIN; ! 1807: } ! 1808: ! 1809: for ( i=0; i<6000 && ( hp100_inb( OPTION_MSW ) & HP100_TX_CMD ); i++ ) ! 1810: { ! 1811: #ifdef HP100_DEBUG_TX ! 1812: printk( "hp100: %s: start_xmit: busy\n", dev->name ); ! 1813: #endif ! 1814: } ! 1815: ! 1816: hp100_ints_off(); ! 1817: val = hp100_inw( IRQ_STATUS ); ! 1818: /* Ack / clear the interrupt TX_COMPLETE interrupt - this interrupt is set ! 1819: * when the current packet being transmitted on the wire is completed. */ ! 1820: hp100_outw( HP100_TX_COMPLETE, IRQ_STATUS ); ! 1821: #ifdef HP100_DEBUG_TX ! 1822: printk("hp100: %s: start_xmit: irq_status=0x%.4x, irqmask=0x%.4x, len=%d\n",dev->name,val,hp100_inw(IRQ_MASK),(int)skb->len ); ! 1823: #endif ! 1824: ! 1825: ok_flag = skb->len >= HP100_MIN_PACKET_SIZE; ! 1826: i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE; ! 1827: ! 1828: hp100_outw( i, DATA32 ); /* tell card the total packet length */ ! 1829: hp100_outw( i, FRAGMENT_LEN ); /* and first/only fragment length */ ! 1830: ! 1831: if ( lp->mode==2 ) /* memory mapped */ ! 1832: { ! 1833: if ( lp->mem_ptr_virt ) /* high pci memory was remapped */ ! 1834: { ! 1835: /* Note: The J2585B needs alignment to 32bits here! */ ! 1836: memcpy( lp->mem_ptr_virt, skb->data, ( skb->len + 3 ) & ~3 ); ! 1837: if ( !ok_flag ) ! 1838: memset( lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len ); ! 1839: } ! 1840: else ! 1841: { ! 1842: /* Note: The J2585B needs alignment to 32bits here! */ ! 1843: memcpy_toio( lp->mem_ptr_phys, skb->data, (skb->len + 3) & ~3 ); ! 1844: if ( !ok_flag ) ! 1845: memset_io( lp->mem_ptr_phys, 0, HP100_MIN_PACKET_SIZE - skb->len ); ! 1846: } ! 1847: } ! 1848: else /* programmed i/o */ ! 1849: { ! 1850: outsl( ioaddr + HP100_REG_DATA32, skb->data, ( skb->len + 3 ) >> 2 ); ! 1851: if ( !ok_flag ) ! 1852: for ( i = ( skb->len + 3 ) & ~3; i < HP100_MIN_PACKET_SIZE; i += 4 ) ! 1853: hp100_outl( 0, DATA32 ); ! 1854: } ! 1855: ! 1856: hp100_outb( HP100_TX_CMD | HP100_SET_LB, OPTION_MSW ); /* send packet */ ! 1857: ! 1858: lp->stats.tx_packets++; ! 1859: #ifdef LINUX_2_1 ! 1860: lp->stats.tx_bytes += skb->len; ! 1861: #endif ! 1862: dev->trans_start=jiffies; ! 1863: hp100_ints_on(); ! 1864: ! 1865: #ifdef LINUX_2_1 ! 1866: dev_kfree_skb( skb ); ! 1867: #else ! 1868: dev_kfree_skb( skb, FREE_WRITE ); ! 1869: #endif ! 1870: ! 1871: #ifdef HP100_DEBUG_TX ! 1872: printk( "hp100: %s: start_xmit: end\n", dev->name ); ! 1873: #endif ! 1874: ! 1875: return 0; ! 1876: } ! 1877: ! 1878: ! 1879: /* ! 1880: * Receive Function (Non-Busmaster mode) ! 1881: * Called when an "Receive Packet" interrupt occurs, i.e. the receive ! 1882: * packet counter is non-zero. ! 1883: * For non-busmaster, this function does the whole work of transfering ! 1884: * the packet to the host memory and then up to higher layers via skb ! 1885: * and netif_rx. ! 1886: */ ! 1887: ! 1888: static void hp100_rx( struct device *dev ) ! 1889: { ! 1890: int packets, pkt_len; ! 1891: int ioaddr = dev->base_addr; ! 1892: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 1893: u_int header; ! 1894: struct sk_buff *skb; ! 1895: ! 1896: #ifdef DEBUG_B ! 1897: hp100_outw( 0x4213, TRACE ); ! 1898: printk("hp100: %s: rx\n", dev->name); ! 1899: #endif ! 1900: ! 1901: /* First get indication of received lan packet */ ! 1902: /* RX_PKT_CND indicates the number of packets which have been fully */ ! 1903: /* received onto the card but have not been fully transfered of the card */ ! 1904: packets = hp100_inb( RX_PKT_CNT ); ! 1905: #ifdef HP100_DEBUG_RX ! 1906: if ( packets > 1 ) ! 1907: printk( "hp100: %s: rx: waiting packets = %d\n", dev->name,packets ); ! 1908: #endif ! 1909: ! 1910: while ( packets-- > 0 ) ! 1911: { ! 1912: /* If ADV_NXT_PKT is still set, we have to wait until the card has */ ! 1913: /* really advanced to the next packet. */ ! 1914: for (pkt_len=0; pkt_len<6000 &&(hp100_inb(OPTION_MSW)&HP100_ADV_NXT_PKT); ! 1915: pkt_len++ ) ! 1916: { ! 1917: #ifdef HP100_DEBUG_RX ! 1918: printk( "hp100: %s: rx: busy, remaining packets = %d\n", dev->name, packets ); ! 1919: #endif ! 1920: } ! 1921: ! 1922: /* First we get the header, which contains information about the */ ! 1923: /* actual length of the received packet. */ ! 1924: if( lp->mode==2 ) /* memory mapped mode */ ! 1925: { ! 1926: if ( lp->mem_ptr_virt ) /* if memory was remapped */ ! 1927: header = *(__u32 *)lp->mem_ptr_virt; ! 1928: else ! 1929: header = readl( lp->mem_ptr_phys ); ! 1930: } ! 1931: else /* programmed i/o */ ! 1932: header = hp100_inl( DATA32 ); ! 1933: ! 1934: pkt_len = ((header & HP100_PKT_LEN_MASK) + 3) & ~3; ! 1935: ! 1936: #ifdef HP100_DEBUG_RX ! 1937: printk( "hp100: %s: rx: new packet - length=%d, errors=0x%x, dest=0x%x\n", ! 1938: dev->name, ! 1939: header & HP100_PKT_LEN_MASK, (header>>16)&0xfff8, ! 1940: (header>>16)&7); ! 1941: #endif ! 1942: ! 1943: /* Now we allocate the skb and transfer the data into it. */ ! 1944: skb = dev_alloc_skb( pkt_len ); ! 1945: if ( skb == NULL ) /* Not enough memory->drop packet */ ! 1946: { ! 1947: #ifdef HP100_DEBUG ! 1948: printk( "hp100: %s: rx: couldn't allocate a sk_buff of size %d\n", dev->name, pkt_len ); ! 1949: #endif ! 1950: lp->stats.rx_dropped++; ! 1951: } ! 1952: else /* skb successfully allocated */ ! 1953: { ! 1954: u_char *ptr; ! 1955: ! 1956: skb->dev = dev; ! 1957: ! 1958: /* ptr to start of the sk_buff data area */ ! 1959: ptr = (u_char *)skb_put( skb, pkt_len ); ! 1960: ! 1961: /* Now transfer the data from the card into that area */ ! 1962: if ( lp->mode==2 ) ! 1963: { ! 1964: if ( lp->mem_ptr_virt ) ! 1965: memcpy( ptr, lp->mem_ptr_virt, pkt_len ); ! 1966: /* Note alignment to 32bit transfers */ ! 1967: else ! 1968: memcpy_fromio( ptr, lp->mem_ptr_phys, pkt_len ); ! 1969: } ! 1970: else /* io mapped */ ! 1971: insl( ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2 ); ! 1972: ! 1973: skb->protocol = eth_type_trans( skb, dev ); ! 1974: ! 1975: netif_rx( skb ); ! 1976: lp->stats.rx_packets++; ! 1977: #ifdef LINUX_2_1 ! 1978: lp->stats.rx_bytes += skb->len; ! 1979: #endif ! 1980: ! 1981: #ifdef HP100_DEBUG_RX ! 1982: printk( "hp100: %s: rx: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", ! 1983: dev->name, ! 1984: ptr[ 0 ], ptr[ 1 ], ptr[ 2 ], ptr[ 3 ], ptr[ 4 ], ptr[ 5 ], ! 1985: ptr[ 6 ], ptr[ 7 ], ptr[ 8 ], ptr[ 9 ], ptr[ 10 ], ptr[ 11 ] ); ! 1986: #endif ! 1987: } ! 1988: ! 1989: /* Indicate the card that we have got the packet */ ! 1990: hp100_outb( HP100_ADV_NXT_PKT | HP100_SET_LB, OPTION_MSW ); ! 1991: ! 1992: switch ( header & 0x00070000 ) { ! 1993: case (HP100_MULTI_ADDR_HASH<<16): ! 1994: case (HP100_MULTI_ADDR_NO_HASH<<16): ! 1995: lp->stats.multicast++; break; ! 1996: } ! 1997: } /* end of while(there are packets) loop */ ! 1998: #ifdef HP100_DEBUG_RX ! 1999: printk( "hp100_rx: %s: end\n", dev->name ); ! 2000: #endif ! 2001: } ! 2002: ! 2003: ! 2004: /* ! 2005: * Receive Function for Busmaster Mode ! 2006: */ ! 2007: static void hp100_rx_bm( struct device *dev ) ! 2008: { ! 2009: int ioaddr = dev->base_addr; ! 2010: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2011: hp100_ring_t *ptr; ! 2012: u_int header; ! 2013: int pkt_len; ! 2014: ! 2015: #ifdef HP100_DEBUG_B ! 2016: hp100_outw( 0x4214, TRACE ); ! 2017: printk("hp100: %s: rx_bm\n", dev->name); ! 2018: #endif ! 2019: ! 2020: #ifdef HP100_DEBUG ! 2021: if(0==lp->rxrcommit) ! 2022: { ! 2023: printk("hp100: %s: rx_bm called although no PDLs were committed to adapter?\n", dev->name); ! 2024: return; ! 2025: } ! 2026: else ! 2027: ! 2028: /* RX_PKT_CNT states how many PDLs are currently formatted and available to ! 2029: * the cards BM engine */ ! 2030: if( (hp100_inw(RX_PKT_CNT)&0x00ff) >= lp->rxrcommit) ! 2031: { ! 2032: printk("hp100: %s: More packets received than commited? RX_PKT_CNT=0x%x, commit=0x%x\n", dev->name, hp100_inw(RX_PKT_CNT)&0x00ff, lp->rxrcommit); ! 2033: return; ! 2034: } ! 2035: #endif ! 2036: ! 2037: while( (lp->rxrcommit > hp100_inb(RX_PDL)) ) ! 2038: { ! 2039: /* ! 2040: * The packet was received into the pdl pointed to by lp->rxrhead ( ! 2041: * the oldest pdl in the ring ! 2042: */ ! 2043: ! 2044: /* First we get the header, which contains information about the */ ! 2045: /* actual length of the received packet. */ ! 2046: ! 2047: ptr=lp->rxrhead; ! 2048: ! 2049: header = *(ptr->pdl-1); ! 2050: pkt_len = (header & HP100_PKT_LEN_MASK); ! 2051: ! 2052: #ifdef HP100_DEBUG_BM ! 2053: printk( "hp100: %s: rx_bm: header@0x%x=0x%x length=%d, errors=0x%x, dest=0x%x\n", ! 2054: dev->name, ! 2055: (u_int) (ptr->pdl-1),(u_int) header, ! 2056: pkt_len, ! 2057: (header>>16)&0xfff8, ! 2058: (header>>16)&7); ! 2059: printk( "hp100: %s: RX_PDL_COUNT:0x%x TX_PDL_COUNT:0x%x, RX_PKT_CNT=0x%x PDH=0x%x, Data@0x%x len=0x%x\n", ! 2060: dev->name, ! 2061: hp100_inb( RX_PDL ), ! 2062: hp100_inb( TX_PDL ), ! 2063: hp100_inb( RX_PKT_CNT ), ! 2064: (u_int) *(ptr->pdl), ! 2065: (u_int) *(ptr->pdl+3), ! 2066: (u_int) *(ptr->pdl+4)); ! 2067: #endif ! 2068: ! 2069: if( (pkt_len>=MIN_ETHER_SIZE) && ! 2070: (pkt_len<=MAX_ETHER_SIZE) ) ! 2071: { ! 2072: if(ptr->skb==NULL) ! 2073: { ! 2074: printk("hp100: %s: rx_bm: skb null\n", dev->name); ! 2075: /* can happen if we only allocated room for the pdh due to memory shortage. */ ! 2076: lp->stats.rx_dropped++; ! 2077: } ! 2078: else ! 2079: { ! 2080: skb_trim( ptr->skb, pkt_len ); /* Shorten it */ ! 2081: ptr->skb->protocol = eth_type_trans( ptr->skb, dev ); ! 2082: ! 2083: netif_rx( ptr->skb ); /* Up and away... */ ! 2084: ! 2085: lp->stats.rx_packets++; ! 2086: #ifdef LINUX_2_1 ! 2087: lp->stats.rx_bytes += ptr->skb->len; ! 2088: #endif ! 2089: } ! 2090: ! 2091: switch ( header & 0x00070000 ) { ! 2092: case (HP100_MULTI_ADDR_HASH<<16): ! 2093: case (HP100_MULTI_ADDR_NO_HASH<<16): ! 2094: lp->stats.multicast++; break; ! 2095: } ! 2096: } ! 2097: else ! 2098: { ! 2099: #ifdef HP100_DEBUG ! 2100: printk("hp100: %s: rx_bm: Received bad packet (length=%d)\n",dev->name,pkt_len); ! 2101: #endif ! 2102: if(ptr->skb!=NULL) ! 2103: #ifdef LINUX_2_1 ! 2104: dev_kfree_skb( ptr->skb ); ! 2105: #else ! 2106: dev_kfree_skb( ptr->skb, FREE_READ ); ! 2107: #endif ! 2108: lp->stats.rx_errors++; ! 2109: } ! 2110: ! 2111: lp->rxrhead=lp->rxrhead->next; ! 2112: ! 2113: /* Allocate a new rx PDL (so lp->rxrcommit stays the same) */ ! 2114: if (0 == hp100_build_rx_pdl( lp->rxrtail, dev )) ! 2115: { ! 2116: /* No space for skb, header can still be received. */ ! 2117: #ifdef HP100_DEBUG ! 2118: printk("hp100: %s: rx_bm: No space for new PDL.\n", dev->name); ! 2119: #endif ! 2120: return; ! 2121: } ! 2122: else ! 2123: { /* successfully allocated new PDL - put it in ringlist at tail. */ ! 2124: hp100_outl((u32)lp->rxrtail->pdl_paddr, RX_PDA); ! 2125: lp->rxrtail=lp->rxrtail->next; ! 2126: } ! 2127: ! 2128: } ! 2129: } ! 2130: ! 2131: ! 2132: ! 2133: /* ! 2134: * statistics ! 2135: */ ! 2136: static hp100_stats_t *hp100_get_stats( struct device *dev ) ! 2137: { ! 2138: int ioaddr = dev->base_addr; ! 2139: ! 2140: #ifdef HP100_DEBUG_B ! 2141: hp100_outw( 0x4215, TRACE ); ! 2142: #endif ! 2143: ! 2144: hp100_ints_off(); ! 2145: hp100_update_stats( dev ); ! 2146: hp100_ints_on(); ! 2147: return &((struct hp100_private *)dev->priv)->stats; ! 2148: } ! 2149: ! 2150: static void hp100_update_stats( struct device *dev ) ! 2151: { ! 2152: int ioaddr = dev->base_addr; ! 2153: u_short val; ! 2154: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2155: ! 2156: #ifdef HP100_DEBUG_B ! 2157: hp100_outw( 0x4216, TRACE ); ! 2158: printk("hp100: %s: update-stats\n", dev->name); ! 2159: #endif ! 2160: ! 2161: /* Note: Statistics counters clear when read. */ ! 2162: hp100_page( MAC_CTRL ); ! 2163: val = hp100_inw( DROPPED ) & 0x0fff; ! 2164: lp->stats.rx_errors += val; ! 2165: lp->stats.rx_over_errors += val; ! 2166: val = hp100_inb( CRC ); ! 2167: lp->stats.rx_errors += val; ! 2168: lp->stats.rx_crc_errors += val; ! 2169: val = hp100_inb( ABORT ); ! 2170: lp->stats.tx_errors += val; ! 2171: lp->stats.tx_aborted_errors += val; ! 2172: hp100_page( PERFORMANCE ); ! 2173: } ! 2174: ! 2175: static void hp100_misc_interrupt( struct device *dev ) ! 2176: { ! 2177: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2178: ! 2179: #ifdef HP100_DEBUG_B ! 2180: hp100_outw( 0x4216, TRACE ); ! 2181: printk("hp100: %s: misc_interrupt\n", dev->name); ! 2182: #endif ! 2183: ! 2184: /* Note: Statistics counters clear when read. */ ! 2185: lp->stats.rx_errors++; ! 2186: lp->stats.tx_errors++; ! 2187: } ! 2188: ! 2189: static void hp100_clear_stats( int ioaddr ) ! 2190: { ! 2191: unsigned long flags; ! 2192: ! 2193: #ifdef HP100_DEBUG_B ! 2194: hp100_outw( 0x4217, TRACE ); ! 2195: printk("hp100: %s: clear_stats\n", dev->name); ! 2196: #endif ! 2197: ! 2198: save_flags( flags ); ! 2199: cli(); ! 2200: hp100_page( MAC_CTRL ); /* get all statistics bytes */ ! 2201: hp100_inw( DROPPED ); ! 2202: hp100_inb( CRC ); ! 2203: hp100_inb( ABORT ); ! 2204: hp100_page( PERFORMANCE ); ! 2205: restore_flags( flags ); ! 2206: } ! 2207: ! 2208: ! 2209: /* ! 2210: * multicast setup ! 2211: */ ! 2212: ! 2213: /* ! 2214: * Set or clear the multicast filter for this adapter. ! 2215: */ ! 2216: ! 2217: static void hp100_set_multicast_list( struct device *dev ) ! 2218: { ! 2219: unsigned long flags; ! 2220: int ioaddr = dev->base_addr; ! 2221: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2222: ! 2223: #ifdef HP100_DEBUG_B ! 2224: hp100_outw( 0x4218, TRACE ); ! 2225: printk("hp100: %s: set_mc_list\n", dev->name); ! 2226: #endif ! 2227: ! 2228: save_flags( flags ); ! 2229: cli(); ! 2230: hp100_ints_off(); ! 2231: hp100_page( MAC_CTRL ); ! 2232: hp100_andb( ~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1 ); /* stop rx/tx */ ! 2233: ! 2234: if ( dev->flags & IFF_PROMISC ) ! 2235: { ! 2236: lp->mac2_mode = HP100_MAC2MODE6; /* promiscuous mode = get all good */ ! 2237: lp->mac1_mode = HP100_MAC1MODE6; /* packets on the net */ ! 2238: memset( &lp->hash_bytes, 0xff, 8 ); ! 2239: } ! 2240: else if ( dev->mc_count || (dev->flags&IFF_ALLMULTI) ) ! 2241: { ! 2242: lp->mac2_mode = HP100_MAC2MODE5; /* multicast mode = get packets for */ ! 2243: lp->mac1_mode = HP100_MAC1MODE5; /* me, broadcasts and all multicasts */ ! 2244: #ifdef HP100_MULTICAST_FILTER /* doesn't work!!! */ ! 2245: if ( dev -> flags & IFF_ALLMULTI ) ! 2246: { ! 2247: /* set hash filter to receive all multicast packets */ ! 2248: memset( &lp->hash_bytes, 0xff, 8 ); ! 2249: } ! 2250: else ! 2251: { ! 2252: int i, j, idx; ! 2253: u_char *addrs; ! 2254: struct dev_mc_list *dmi; ! 2255: ! 2256: memset( &lp->hash_bytes, 0x00, 8 ); ! 2257: #ifdef HP100_DEBUG ! 2258: printk("hp100: %s: computing hash filter - mc_count = %i\n", dev -> name, dev -> mc_count ); ! 2259: #endif ! 2260: for ( i = 0, dmi = dev -> mc_list; i < dev -> mc_count; i++, dmi = dmi -> next ) ! 2261: { ! 2262: addrs = dmi -> dmi_addr; ! 2263: if ( ( *addrs & 0x01 ) == 0x01 ) /* multicast address? */ ! 2264: { ! 2265: #ifdef HP100_DEBUG ! 2266: printk("hp100: %s: multicast = %02x:%02x:%02x:%02x:%02x:%02x, ", ! 2267: dev -> name, ! 2268: addrs[ 0 ], addrs[ 1 ], addrs[ 2 ], ! 2269: addrs[ 3 ], addrs[ 4 ], addrs[ 5 ] ); ! 2270: #endif ! 2271: for ( j = idx = 0; j < 6; j++ ) ! 2272: { ! 2273: idx ^= *addrs++ & 0x3f; ! 2274: printk( ":%02x:", idx ); ! 2275: } ! 2276: #ifdef HP100_DEBUG ! 2277: printk("idx = %i\n", idx ); ! 2278: #endif ! 2279: lp->hash_bytes[ idx >> 3 ] |= ( 1 << ( idx & 7 ) ); ! 2280: } ! 2281: } ! 2282: } ! 2283: #else ! 2284: memset( &lp->hash_bytes, 0xff, 8 ); ! 2285: #endif ! 2286: } ! 2287: else ! 2288: { ! 2289: lp->mac2_mode = HP100_MAC2MODE3; /* normal mode = get packets for me */ ! 2290: lp->mac1_mode = HP100_MAC1MODE3; /* and broadcasts */ ! 2291: memset( &lp->hash_bytes, 0x00, 8 ); ! 2292: } ! 2293: ! 2294: if ( ( (hp100_inb(MAC_CFG_1) & 0x0f)!=lp->mac1_mode ) || ! 2295: ( hp100_inb(MAC_CFG_2)!=lp->mac2_mode ) ) ! 2296: { ! 2297: int i; ! 2298: ! 2299: hp100_outb( lp->mac2_mode, MAC_CFG_2 ); ! 2300: hp100_andb( HP100_MAC1MODEMASK, MAC_CFG_1 ); /* clear mac1 mode bits */ ! 2301: hp100_orb( lp->mac1_mode, MAC_CFG_1 ); /* and set the new mode */ ! 2302: ! 2303: hp100_page( MAC_ADDRESS ); ! 2304: for ( i = 0; i < 8; i++ ) ! 2305: hp100_outb( lp->hash_bytes[ i ], HASH_BYTE0 + i ); ! 2306: #ifdef HP100_DEBUG ! 2307: printk("hp100: %s: mac1 = 0x%x, mac2 = 0x%x, multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", ! 2308: dev->name, lp->mac1_mode, lp->mac2_mode, ! 2309: lp->hash_bytes[ 0 ], lp->hash_bytes[ 1 ], ! 2310: lp->hash_bytes[ 2 ], lp->hash_bytes[ 3 ], ! 2311: lp->hash_bytes[ 4 ], lp->hash_bytes[ 5 ], ! 2312: lp->hash_bytes[ 6 ], lp->hash_bytes[ 7 ] ! 2313: ); ! 2314: #endif ! 2315: ! 2316: if(lp->lan_type==HP100_LAN_100) ! 2317: { ! 2318: #ifdef HP100_DEBUG ! 2319: printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name); ! 2320: #endif ! 2321: lp->hub_status=hp100_login_to_vg_hub( dev, TRUE ); /* force a relogin to the hub */ ! 2322: } ! 2323: } ! 2324: else ! 2325: { ! 2326: int i; ! 2327: u_char old_hash_bytes[ 8 ]; ! 2328: ! 2329: hp100_page( MAC_ADDRESS ); ! 2330: for ( i = 0; i < 8; i++ ) ! 2331: old_hash_bytes[ i ] = hp100_inb( HASH_BYTE0 + i ); ! 2332: if ( memcmp( old_hash_bytes, &lp->hash_bytes, 8 ) ) ! 2333: { ! 2334: for ( i = 0; i < 8; i++ ) ! 2335: hp100_outb( lp->hash_bytes[ i ], HASH_BYTE0 + i ); ! 2336: #ifdef HP100_DEBUG ! 2337: printk("hp100: %s: multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", ! 2338: dev->name, ! 2339: lp->hash_bytes[ 0 ], lp->hash_bytes[ 1 ], ! 2340: lp->hash_bytes[ 2 ], lp->hash_bytes[ 3 ], ! 2341: lp->hash_bytes[ 4 ], lp->hash_bytes[ 5 ], ! 2342: lp->hash_bytes[ 6 ], lp->hash_bytes[ 7 ] ! 2343: ); ! 2344: #endif ! 2345: ! 2346: if(lp->lan_type==HP100_LAN_100) ! 2347: { ! 2348: #ifdef HP100_DEBUG ! 2349: printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name); ! 2350: #endif ! 2351: lp->hub_status=hp100_login_to_vg_hub( dev, TRUE ); /* force a relogin to the hub */ ! 2352: } ! 2353: } ! 2354: } ! 2355: ! 2356: hp100_page( MAC_CTRL ); ! 2357: hp100_orb( HP100_RX_EN | HP100_RX_IDLE | /* enable rx */ ! 2358: HP100_TX_EN | HP100_TX_IDLE, MAC_CFG_1 ); /* enable tx */ ! 2359: ! 2360: hp100_page( PERFORMANCE ); ! 2361: hp100_ints_on(); ! 2362: restore_flags( flags ); ! 2363: } ! 2364: ! 2365: ! 2366: /* ! 2367: * hardware interrupt handling ! 2368: */ ! 2369: ! 2370: static void hp100_interrupt( int irq, void *dev_id, struct pt_regs *regs ) ! 2371: { ! 2372: struct device *dev = (struct device *)dev_id; ! 2373: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2374: ! 2375: int ioaddr; ! 2376: u_int val; ! 2377: ! 2378: if ( dev == NULL ) return; ! 2379: ioaddr = dev->base_addr; ! 2380: ! 2381: if ( dev->interrupt ) ! 2382: printk( "hp100: %s: re-entering the interrupt handler\n", dev->name ); ! 2383: hp100_ints_off(); ! 2384: dev->interrupt = 1; /* mark that we are inside the handler */ ! 2385: ! 2386: #ifdef HP100_DEBUG_B ! 2387: hp100_outw( 0x4219, TRACE ); ! 2388: #endif ! 2389: ! 2390: /* hp100_page( PERFORMANCE ); */ ! 2391: val = hp100_inw( IRQ_STATUS ); ! 2392: #ifdef HP100_DEBUG_IRQ ! 2393: printk( "hp100: %s: mode=%x,IRQ_STAT=0x%.4x,RXPKTCNT=0x%.2x RXPDL=0x%.2x TXPKTCNT=0x%.2x TXPDL=0x%.2x\n", ! 2394: dev->name, ! 2395: lp->mode, ! 2396: (u_int)val, ! 2397: hp100_inb( RX_PKT_CNT ), ! 2398: hp100_inb( RX_PDL ), ! 2399: hp100_inb( TX_PKT_CNT ), ! 2400: hp100_inb( TX_PDL ) ! 2401: ); ! 2402: #endif ! 2403: ! 2404: if(val==0) /* might be a shared interrupt */ ! 2405: { ! 2406: dev->interrupt=0; ! 2407: hp100_ints_on(); ! 2408: return; ! 2409: } ! 2410: /* We're only interested in those interrupts we really enabled. */ ! 2411: /* val &= hp100_inw( IRQ_MASK ); */ ! 2412: ! 2413: /* ! 2414: * RX_PDL_FILL_COMPL is set whenever a RX_PDL has been executed. A RX_PDL ! 2415: * is considered executed whenever the RX_PDL data structure is no longer ! 2416: * needed. ! 2417: */ ! 2418: if ( val & HP100_RX_PDL_FILL_COMPL ) ! 2419: { ! 2420: if(lp->mode==1) ! 2421: hp100_rx_bm( dev ); ! 2422: else ! 2423: { ! 2424: printk("hp100: %s: rx_pdl_fill_compl interrupt although not busmaster?\n", dev->name); ! 2425: } ! 2426: } ! 2427: ! 2428: /* ! 2429: * The RX_PACKET interrupt is set, when the receive packet counter is ! 2430: * non zero. We use this interrupt for receiving in slave mode. In ! 2431: * busmaster mode, we use it to make sure we did not miss any rx_pdl_fill ! 2432: * interrupts. If rx_pdl_fill_compl is not set and rx_packet is set, then ! 2433: * we somehow have missed a rx_pdl_fill_compl interrupt. ! 2434: */ ! 2435: ! 2436: if ( val & HP100_RX_PACKET ) /* Receive Packet Counter is non zero */ ! 2437: { ! 2438: if(lp->mode!=1) /* non busmaster */ ! 2439: hp100_rx( dev ); ! 2440: else if ( !(val & HP100_RX_PDL_FILL_COMPL )) ! 2441: { ! 2442: /* Shouldnt happen - maybe we missed a RX_PDL_FILL Interrupt? */ ! 2443: hp100_rx_bm( dev ); ! 2444: } ! 2445: } ! 2446: ! 2447: /* ! 2448: * Ack. that we have noticed the interrupt and thereby allow next one. ! 2449: * Note that this is now done after the slave rx function, since first ! 2450: * acknowledging and then setting ADV_NXT_PKT caused an extra interrupt ! 2451: * on the J2573. ! 2452: */ ! 2453: hp100_outw( val, IRQ_STATUS ); ! 2454: ! 2455: /* ! 2456: * RX_ERROR is set when a packet is dropped due to no memory resources on ! 2457: * the card or when a RCV_ERR occurs. ! 2458: * TX_ERROR is set when a TX_ABORT condition occurs in the MAC->exists ! 2459: * only in the 802.3 MAC and happens when 16 collisions occur during a TX ! 2460: */ ! 2461: if ( val & ( HP100_TX_ERROR | HP100_RX_ERROR ) ) ! 2462: { ! 2463: #ifdef HP100_DEBUG_IRQ ! 2464: printk("hp100: %s: TX/RX Error IRQ\n", dev->name); ! 2465: #endif ! 2466: hp100_update_stats( dev ); ! 2467: if(lp->mode==1) ! 2468: { ! 2469: hp100_rxfill( dev ); ! 2470: hp100_clean_txring( dev ); ! 2471: } ! 2472: } ! 2473: ! 2474: /* ! 2475: * RX_PDA_ZERO is set when the PDA count goes from non-zero to zero. ! 2476: */ ! 2477: if ( (lp->mode==1)&&(val &(HP100_RX_PDA_ZERO)) ) ! 2478: hp100_rxfill( dev ); ! 2479: ! 2480: /* ! 2481: * HP100_TX_COMPLETE interrupt occurs when packet transmitted on wire ! 2482: * is completed ! 2483: */ ! 2484: if ( (lp->mode==1) && ( val & ( HP100_TX_COMPLETE )) ) ! 2485: hp100_clean_txring( dev ); ! 2486: ! 2487: /* ! 2488: * MISC_ERROR is set when either the LAN link goes down or a detected ! 2489: * bus error occurs. ! 2490: */ ! 2491: if ( val & HP100_MISC_ERROR ) /* New for J2585B */ ! 2492: { ! 2493: #ifdef HP100_DEBUG_IRQ ! 2494: printk("hp100: %s: Misc. Error Interrupt - Check cabling.\n", dev->name); ! 2495: #endif ! 2496: if(lp->mode==1) ! 2497: { ! 2498: hp100_clean_txring( dev ); ! 2499: hp100_rxfill( dev ); ! 2500: } ! 2501: hp100_misc_interrupt( dev ); ! 2502: } ! 2503: ! 2504: dev->interrupt = 0; ! 2505: hp100_ints_on(); ! 2506: } ! 2507: ! 2508: ! 2509: /* ! 2510: * some misc functions ! 2511: */ ! 2512: ! 2513: static void hp100_start_interface( struct device *dev ) ! 2514: { ! 2515: unsigned long flags; ! 2516: int ioaddr = dev->base_addr; ! 2517: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2518: ! 2519: #ifdef HP100_DEBUG_B ! 2520: hp100_outw( 0x4220, TRACE ); ! 2521: printk("hp100: %s: hp100_start_interface\n",dev->name); ! 2522: #endif ! 2523: ! 2524: save_flags( flags ); ! 2525: cli(); ! 2526: ! 2527: /* Ensure the adapter does not want to request an interrupt when */ ! 2528: /* enabling the IRQ line to be active on the bus (i.e. not tri-stated) */ ! 2529: hp100_page( PERFORMANCE ); ! 2530: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 2531: hp100_outw( 0xffff, IRQ_STATUS ); /* ack all IRQs */ ! 2532: hp100_outw( HP100_FAKE_INT|HP100_INT_EN|HP100_RESET_LB, OPTION_LSW); ! 2533: /* Un Tri-state int. TODO: Check if shared interrupts can be realised? */ ! 2534: hp100_outw( HP100_TRI_INT | HP100_RESET_HB, OPTION_LSW ); ! 2535: ! 2536: if(lp->mode==1) ! 2537: { ! 2538: /* Make sure BM bit is set... */ ! 2539: hp100_page(HW_MAP); ! 2540: hp100_orb( HP100_BM_MASTER, BM ); ! 2541: hp100_rxfill( dev ); ! 2542: } ! 2543: else if(lp->mode==2) ! 2544: { ! 2545: /* Enable memory mapping. Note: Don't do this when busmaster. */ ! 2546: hp100_outw( HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW ); ! 2547: } ! 2548: ! 2549: hp100_page(PERFORMANCE); ! 2550: hp100_outw( 0xfefe, IRQ_MASK ); /* mask off all ints */ ! 2551: hp100_outw( 0xffff, IRQ_STATUS ); /* ack IRQ */ ! 2552: ! 2553: /* enable a few interrupts: */ ! 2554: if(lp->mode==1) /* busmaster mode */ ! 2555: { ! 2556: hp100_outw( HP100_RX_PDL_FILL_COMPL | ! 2557: HP100_RX_PDA_ZERO | ! 2558: HP100_RX_ERROR | ! 2559: /* HP100_RX_PACKET | */ ! 2560: /* HP100_RX_EARLY_INT | */ HP100_SET_HB | ! 2561: /* HP100_TX_PDA_ZERO | */ ! 2562: HP100_TX_COMPLETE | ! 2563: /* HP100_MISC_ERROR | */ ! 2564: HP100_TX_ERROR | HP100_SET_LB, IRQ_MASK ); ! 2565: } ! 2566: else ! 2567: { ! 2568: hp100_outw( HP100_RX_PACKET | ! 2569: HP100_RX_ERROR | HP100_SET_HB | ! 2570: HP100_TX_ERROR | HP100_SET_LB , IRQ_MASK ); ! 2571: } ! 2572: ! 2573: /* Enable MAC Tx and RX, set MAC modes, ... */ ! 2574: hp100_set_multicast_list( dev ); ! 2575: ! 2576: restore_flags( flags ); ! 2577: } ! 2578: ! 2579: ! 2580: static void hp100_stop_interface( struct device *dev ) ! 2581: { ! 2582: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2583: int ioaddr = dev->base_addr; ! 2584: u_int val; ! 2585: ! 2586: #ifdef HP100_DEBUG_B ! 2587: printk("hp100: %s: hp100_stop_interface\n",dev->name); ! 2588: hp100_outw( 0x4221, TRACE ); ! 2589: #endif ! 2590: ! 2591: if (lp->mode==1) ! 2592: hp100_BM_shutdown( dev ); ! 2593: else ! 2594: { ! 2595: /* Note: MMAP_DIS will be reenabled by start_interface */ ! 2596: hp100_outw( HP100_INT_EN | HP100_RESET_LB | ! 2597: HP100_TRI_INT | HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW ); ! 2598: val = hp100_inw( OPTION_LSW ); ! 2599: ! 2600: hp100_page( MAC_CTRL ); ! 2601: hp100_andb( ~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1 ); ! 2602: ! 2603: if ( !(val & HP100_HW_RST) ) return; /* If reset, imm. return ... */ ! 2604: /* ... else: busy wait until idle */ ! 2605: for ( val = 0; val < 6000; val++ ) ! 2606: if ( ( hp100_inb( MAC_CFG_1 ) & (HP100_TX_IDLE | HP100_RX_IDLE) ) == ! 2607: (HP100_TX_IDLE | HP100_RX_IDLE) ) ! 2608: { ! 2609: hp100_page(PERFORMANCE); ! 2610: return; ! 2611: } ! 2612: printk( "hp100: %s: hp100_stop_interface - timeout\n", dev->name ); ! 2613: hp100_page(PERFORMANCE); ! 2614: } ! 2615: } ! 2616: ! 2617: ! 2618: static void hp100_load_eeprom( struct device *dev, u_short probe_ioaddr ) ! 2619: { ! 2620: int i; ! 2621: int ioaddr = probe_ioaddr > 0 ? probe_ioaddr : dev->base_addr; ! 2622: ! 2623: #ifdef HP100_DEBUG_B ! 2624: hp100_outw( 0x4222, TRACE ); ! 2625: #endif ! 2626: ! 2627: hp100_page( EEPROM_CTRL ); ! 2628: hp100_andw( ~HP100_EEPROM_LOAD, EEPROM_CTRL ); ! 2629: hp100_orw( HP100_EEPROM_LOAD, EEPROM_CTRL ); ! 2630: for ( i = 0; i < 10000; i++ ) ! 2631: if ( !( hp100_inb( OPTION_MSW ) & HP100_EE_LOAD ) ) return; ! 2632: printk( "hp100: %s: hp100_load_eeprom - timeout\n", dev->name ); ! 2633: } ! 2634: ! 2635: ! 2636: /* Sense connection status. ! 2637: * return values: LAN_10 - Connected to 10Mbit/s network ! 2638: * LAN_100 - Connected to 100Mbit/s network ! 2639: * LAN_ERR - not connected or 100Mbit/s Hub down ! 2640: */ ! 2641: static int hp100_sense_lan( struct device *dev ) ! 2642: { ! 2643: int ioaddr = dev->base_addr; ! 2644: u_short val_VG, val_10; ! 2645: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2646: ! 2647: #ifdef HP100_DEBUG_B ! 2648: hp100_outw( 0x4223, TRACE ); ! 2649: #endif ! 2650: ! 2651: hp100_page( MAC_CTRL ); ! 2652: val_10 = hp100_inb( 10_LAN_CFG_1 ); ! 2653: val_VG = hp100_inb( VG_LAN_CFG_1 ); ! 2654: hp100_page( PERFORMANCE ); ! 2655: #ifdef HP100_DEBUG ! 2656: printk( "hp100: %s: sense_lan: val_VG = 0x%04x, val_10 = 0x%04x\n", dev->name, val_VG, val_10 ); ! 2657: #endif ! 2658: ! 2659: if ( val_10 & HP100_LINK_BEAT_ST ) /* 10Mb connection is active */ ! 2660: return HP100_LAN_10; ! 2661: ! 2662: if ( val_10 & HP100_AUI_ST ) /* have we BNC or AUI onboard? */ ! 2663: { ! 2664: val_10 |= HP100_AUI_SEL | HP100_LOW_TH; ! 2665: hp100_page( MAC_CTRL ); ! 2666: hp100_outb( val_10, 10_LAN_CFG_1 ); ! 2667: hp100_page( PERFORMANCE ); ! 2668: return HP100_LAN_10; ! 2669: } ! 2670: ! 2671: if ( (lp->id->id == 0x02019F022) || ! 2672: (lp->id->id == 0x01042103c) || ! 2673: (lp->id->id == 0x01040103c) ) ! 2674: return HP100_LAN_ERR; /* Those cards don't have a 100 Mbit connector */ ! 2675: ! 2676: if ( val_VG & HP100_LINK_CABLE_ST ) /* Can hear the HUBs tone. */ ! 2677: return HP100_LAN_100; ! 2678: return HP100_LAN_ERR; ! 2679: } ! 2680: ! 2681: ! 2682: ! 2683: static int hp100_down_vg_link( struct device *dev ) ! 2684: { ! 2685: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2686: int ioaddr = dev->base_addr; ! 2687: unsigned long time; ! 2688: long savelan, newlan; ! 2689: ! 2690: #ifdef HP100_DEBUG_B ! 2691: hp100_outw( 0x4224, TRACE ); ! 2692: printk("hp100: %s: down_vg_link\n", dev->name); ! 2693: #endif ! 2694: ! 2695: hp100_page( MAC_CTRL ); ! 2696: time=jiffies+(HZ/4); ! 2697: do{ ! 2698: if ( hp100_inb( VG_LAN_CFG_1 ) & HP100_LINK_CABLE_ST ) break; ! 2699: } while (time>jiffies); ! 2700: ! 2701: if ( jiffies >= time ) /* no signal->no logout */ ! 2702: return 0; ! 2703: ! 2704: /* Drop the VG Link by clearing the link up cmd and load addr.*/ ! 2705: ! 2706: hp100_andb( ~( HP100_LOAD_ADDR| HP100_LINK_CMD), VG_LAN_CFG_1); ! 2707: hp100_orb( HP100_VG_SEL, VG_LAN_CFG_1); ! 2708: ! 2709: /* Conditionally stall for >250ms on Link-Up Status (to go down) */ ! 2710: time=jiffies+(HZ/2); ! 2711: do{ ! 2712: if ( !(hp100_inb( VG_LAN_CFG_1) & HP100_LINK_UP_ST) ) break; ! 2713: } while(time>jiffies); ! 2714: ! 2715: #ifdef HP100_DEBUG ! 2716: if (jiffies>=time) ! 2717: printk("hp100: %s: down_vg_link: Link does not go down?\n", dev->name); ! 2718: #endif ! 2719: ! 2720: /* To prevent condition where Rev 1 VG MAC and old hubs do not complete */ ! 2721: /* logout under traffic (even though all the status bits are cleared), */ ! 2722: /* do this workaround to get the Rev 1 MAC in its idle state */ ! 2723: if ( lp->chip==HP100_CHIPID_LASSEN ) ! 2724: { ! 2725: /* Reset VG MAC to insure it leaves the logoff state even if */ ! 2726: /* the Hub is still emitting tones */ ! 2727: hp100_andb(~HP100_VG_RESET, VG_LAN_CFG_1); ! 2728: udelay(1500); /* wait for >1ms */ ! 2729: hp100_orb(HP100_VG_RESET, VG_LAN_CFG_1); /* Release Reset */ ! 2730: udelay(1500); ! 2731: } ! 2732: ! 2733: /* New: For lassen, switch to 10 Mbps mac briefly to clear training ACK */ ! 2734: /* to get the VG mac to full reset. This is not req.d with later chips */ ! 2735: /* Note: It will take the between 1 and 2 seconds for the VG mac to be */ ! 2736: /* selected again! This will be left to the connect hub function to */ ! 2737: /* perform if desired. */ ! 2738: if (lp->chip==HP100_CHIPID_LASSEN) ! 2739: { ! 2740: /* Have to write to 10 and 100VG control registers simultaneously */ ! 2741: savelan=newlan=hp100_inl(10_LAN_CFG_1); /* read 10+100 LAN_CFG regs */ ! 2742: newlan &= ~(HP100_VG_SEL<<16); ! 2743: newlan |= (HP100_DOT3_MAC)<<8; ! 2744: hp100_andb( ~HP100_AUTO_MODE, MAC_CFG_3); /* Autosel off */ ! 2745: hp100_outl(newlan, 10_LAN_CFG_1); ! 2746: ! 2747: /* Conditionally stall for 5sec on VG selected. */ ! 2748: time=jiffies+(HZ*5); ! 2749: do{ ! 2750: if( !(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST) ) break; ! 2751: } while(time>jiffies); ! 2752: ! 2753: hp100_orb( HP100_AUTO_MODE, MAC_CFG_3); /* Autosel back on */ ! 2754: hp100_outl(savelan, 10_LAN_CFG_1); ! 2755: } ! 2756: ! 2757: time=jiffies+(3*HZ); /* Timeout 3s */ ! 2758: do { ! 2759: if ( (hp100_inb( VG_LAN_CFG_1 )&HP100_LINK_CABLE_ST) == 0) break; ! 2760: } while (time>jiffies); ! 2761: ! 2762: if(time<=jiffies) ! 2763: { ! 2764: #ifdef HP100_DEBUG ! 2765: printk( "hp100: %s: down_vg_link: timeout\n", dev->name ); ! 2766: #endif ! 2767: return -EIO; ! 2768: } ! 2769: ! 2770: time=jiffies+(2*HZ); /* This seems to take a while.... */ ! 2771: do {} while (time>jiffies); ! 2772: ! 2773: return 0; ! 2774: } ! 2775: ! 2776: ! 2777: static int hp100_login_to_vg_hub( struct device *dev, u_short force_relogin ) ! 2778: { ! 2779: int ioaddr = dev->base_addr; ! 2780: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2781: u_short val=0; ! 2782: unsigned long time; ! 2783: int startst; ! 2784: ! 2785: #ifdef HP100_DEBUG_B ! 2786: hp100_outw( 0x4225, TRACE ); ! 2787: printk("hp100: %s: login_to_vg_hub\n", dev->name); ! 2788: #endif ! 2789: ! 2790: /* Initiate a login sequence iff VG MAC is enabled and either Load Address ! 2791: * bit is zero or the force relogin flag is set (e.g. due to MAC address or ! 2792: * promiscuous mode change) ! 2793: */ ! 2794: hp100_page( MAC_CTRL ); ! 2795: startst=hp100_inb( VG_LAN_CFG_1 ); ! 2796: if((force_relogin==TRUE)||(hp100_inb( MAC_CFG_4 )&HP100_MAC_SEL_ST)) ! 2797: { ! 2798: #ifdef HP100_DEBUG_TRAINING ! 2799: printk("hp100: %s: Start training\n", dev->name); ! 2800: #endif ! 2801: ! 2802: /* Ensure VG Reset bit is 1 (i.e., do not reset)*/ ! 2803: hp100_orb( HP100_VG_RESET , VG_LAN_CFG_1 ); ! 2804: ! 2805: /* If Lassen AND auto-select-mode AND VG tones were sensed on */ ! 2806: /* entry then temporarily put them into force 100Mbit mode */ ! 2807: if((lp->chip==HP100_CHIPID_LASSEN)&&( startst & HP100_LINK_CABLE_ST ) ) ! 2808: hp100_andb( ~HP100_DOT3_MAC, 10_LAN_CFG_2 ); ! 2809: ! 2810: /* Drop the VG link by zeroing Link Up Command and Load Address */ ! 2811: hp100_andb( ~(HP100_LINK_CMD/* |HP100_LOAD_ADDR */), VG_LAN_CFG_1); ! 2812: ! 2813: #ifdef HP100_DEBUG_TRAINING ! 2814: printk("hp100: %s: Bring down the link\n", dev->name); ! 2815: #endif ! 2816: ! 2817: /* Wait for link to drop */ ! 2818: time = jiffies + (HZ/10); ! 2819: do { ! 2820: if (~(hp100_inb( VG_LAN_CFG_1 )& HP100_LINK_UP_ST) ) break; ! 2821: } while (time>jiffies); ! 2822: ! 2823: /* Start an addressed training and optionally request promiscuous port */ ! 2824: if ( (dev->flags) & IFF_PROMISC ) ! 2825: { ! 2826: hp100_orb( HP100_PROM_MODE, VG_LAN_CFG_2); ! 2827: if(lp->chip==HP100_CHIPID_LASSEN) ! 2828: hp100_orw( HP100_MACRQ_PROMSC, TRAIN_REQUEST ); ! 2829: } ! 2830: else ! 2831: { ! 2832: hp100_andb( ~HP100_PROM_MODE, VG_LAN_CFG_2); ! 2833: /* For ETR parts we need to reset the prom. bit in the training ! 2834: * register, otherwise promiscious mode won't be disabled. ! 2835: */ ! 2836: if(lp->chip==HP100_CHIPID_LASSEN) ! 2837: { ! 2838: hp100_andw( ~HP100_MACRQ_PROMSC, TRAIN_REQUEST ); ! 2839: } ! 2840: } ! 2841: ! 2842: /* With ETR parts, frame format request bits can be set. */ ! 2843: if(lp->chip==HP100_CHIPID_LASSEN) ! 2844: hp100_orb( HP100_MACRQ_FRAMEFMT_EITHER, TRAIN_REQUEST); ! 2845: ! 2846: hp100_orb( HP100_LINK_CMD|HP100_LOAD_ADDR|HP100_VG_RESET, VG_LAN_CFG_1); ! 2847: ! 2848: /* Note: Next wait could be omitted for Hood and earlier chips under */ ! 2849: /* certain circumstances */ ! 2850: /* TODO: check if hood/earlier and skip wait. */ ! 2851: ! 2852: /* Wait for either short timeout for VG tones or long for login */ ! 2853: /* Wait for the card hardware to signalise link cable status ok... */ ! 2854: hp100_page( MAC_CTRL ); ! 2855: time = jiffies + ( 1*HZ ); /* 1 sec timeout for cable st */ ! 2856: do { ! 2857: if ( hp100_inb( VG_LAN_CFG_1 ) & HP100_LINK_CABLE_ST ) break; ! 2858: } while ( jiffies < time ); ! 2859: ! 2860: if ( jiffies >= time ) ! 2861: { ! 2862: #ifdef HP100_DEBUG_TRAINING ! 2863: printk( "hp100: %s: Link cable status not ok? Training aborted.\n", dev->name ); ! 2864: #endif ! 2865: } ! 2866: else ! 2867: { ! 2868: #ifdef HP100_DEBUG_TRAINING ! 2869: printk( "hp100: %s: HUB tones detected. Trying to train.\n", dev->name); ! 2870: #endif ! 2871: ! 2872: time = jiffies + ( 2*HZ ); /* again a timeout */ ! 2873: do { ! 2874: val = hp100_inb( VG_LAN_CFG_1 ); ! 2875: if ( (val & ( HP100_LINK_UP_ST )) ) ! 2876: { ! 2877: #ifdef HP100_DEBUG_TRAINING ! 2878: printk( "hp100: %s: Passed training.\n", dev->name); ! 2879: #endif ! 2880: break; ! 2881: } ! 2882: } while ( time > jiffies ); ! 2883: } ! 2884: ! 2885: /* If LINK_UP_ST is set, then we are logged into the hub. */ ! 2886: if ( (jiffies<=time) && (val & HP100_LINK_UP_ST) ) ! 2887: { ! 2888: #ifdef HP100_DEBUG_TRAINING ! 2889: printk( "hp100: %s: Successfully logged into the HUB.\n", dev->name); ! 2890: if(lp->chip==HP100_CHIPID_LASSEN) ! 2891: { ! 2892: val = hp100_inw(TRAIN_ALLOW); ! 2893: printk( "hp100: %s: Card supports 100VG MAC Version \"%s\" ", ! 2894: dev->name,(hp100_inw(TRAIN_REQUEST)&HP100_CARD_MACVER) ? "802.12" : "Pre"); ! 2895: printk( "Driver will use MAC Version \"%s\"\n", ! 2896: ( val & HP100_HUB_MACVER) ? "802.12" : "Pre" ); ! 2897: printk( "hp100: %s: Frame format is %s.\n",dev->name,(val&HP100_MALLOW_FRAMEFMT)?"802.5":"802.3"); ! 2898: } ! 2899: #endif ! 2900: } ! 2901: else ! 2902: { ! 2903: /* If LINK_UP_ST is not set, login was not successful */ ! 2904: printk("hp100: %s: Problem logging into the HUB.\n",dev->name); ! 2905: if(lp->chip==HP100_CHIPID_LASSEN) ! 2906: { ! 2907: /* Check allowed Register to find out why there is a problem. */ ! 2908: val = hp100_inw( TRAIN_ALLOW ); /* wont work on non-ETR card */ ! 2909: #ifdef HP100_DEBUG_TRAINING ! 2910: printk("hp100: %s: MAC Configuration requested: 0x%04x, HUB allowed: 0x%04x\n", dev->name, hp100_inw(TRAIN_REQUEST), val); ! 2911: #endif ! 2912: if ( val & HP100_MALLOW_ACCDENIED ) ! 2913: printk("hp100: %s: HUB access denied.\n", dev->name); ! 2914: if ( val & HP100_MALLOW_CONFIGURE ) ! 2915: printk("hp100: %s: MAC Configuration is incompatible with the Network.\n", dev->name); ! 2916: if ( val & HP100_MALLOW_DUPADDR ) ! 2917: printk("hp100: %s: Duplicate MAC Address on the Network.\n", dev->name); ! 2918: } ! 2919: } ! 2920: ! 2921: /* If we have put the chip into forced 100 Mbit mode earlier, go back */ ! 2922: /* to auto-select mode */ ! 2923: ! 2924: if( (lp->chip==HP100_CHIPID_LASSEN)&&(startst & HP100_LINK_CABLE_ST) ) ! 2925: { ! 2926: hp100_page( MAC_CTRL ); ! 2927: hp100_orb( HP100_DOT3_MAC, 10_LAN_CFG_2 ); ! 2928: } ! 2929: ! 2930: val=hp100_inb(VG_LAN_CFG_1); ! 2931: ! 2932: /* Clear the MISC_ERROR Interrupt, which might be generated when doing the relogin */ ! 2933: hp100_page(PERFORMANCE); ! 2934: hp100_outw( HP100_MISC_ERROR, IRQ_STATUS); ! 2935: ! 2936: if (val&HP100_LINK_UP_ST) ! 2937: return(0); /* login was ok */ ! 2938: else ! 2939: { ! 2940: printk("hp100: %s: Training failed.\n", dev->name); ! 2941: hp100_down_vg_link( dev ); ! 2942: return -EIO; ! 2943: } ! 2944: } ! 2945: /* no forced relogin & already link there->no training. */ ! 2946: return -EIO; ! 2947: } ! 2948: ! 2949: ! 2950: static void hp100_cascade_reset( struct device *dev, u_short enable ) ! 2951: { ! 2952: int ioaddr = dev->base_addr; ! 2953: struct hp100_private *lp = (struct hp100_private *)dev->priv; ! 2954: int i; ! 2955: ! 2956: #ifdef HP100_DEBUG_B ! 2957: hp100_outw( 0x4226, TRACE ); ! 2958: printk("hp100: %s: cascade_reset\n", dev->name); ! 2959: #endif ! 2960: ! 2961: if (enable==TRUE) ! 2962: { ! 2963: hp100_outw( HP100_HW_RST | HP100_RESET_LB, OPTION_LSW ); ! 2964: if(lp->chip==HP100_CHIPID_LASSEN) ! 2965: { ! 2966: /* Lassen requires a PCI transmit fifo reset */ ! 2967: hp100_page( HW_MAP ); ! 2968: hp100_andb( ~HP100_PCI_RESET, PCICTRL2 ); ! 2969: hp100_orb( HP100_PCI_RESET, PCICTRL2 ); ! 2970: /* Wait for min. 300 ns */ ! 2971: /* we cant use jiffies here, because it may be */ ! 2972: /* that we have disabled the timer... */ ! 2973: for (i=0; i<0xffff; i++); ! 2974: hp100_andb( ~HP100_PCI_RESET, PCICTRL2 ); ! 2975: hp100_page( PERFORMANCE ); ! 2976: } ! 2977: } ! 2978: else ! 2979: { /* bring out of reset */ ! 2980: hp100_outw(HP100_HW_RST|HP100_SET_LB, OPTION_LSW); ! 2981: for (i=0; i<0xffff; i++ ); ! 2982: hp100_page(PERFORMANCE); ! 2983: } ! 2984: } ! 2985: ! 2986: #ifdef HP100_DEBUG ! 2987: void hp100_RegisterDump( struct device *dev ) ! 2988: { ! 2989: int ioaddr=dev->base_addr; ! 2990: int Page; ! 2991: int Register; ! 2992: ! 2993: /* Dump common registers */ ! 2994: printk("hp100: %s: Cascade Register Dump\n", dev->name); ! 2995: printk("hardware id #1: 0x%.2x\n",hp100_inb(HW_ID)); ! 2996: printk("hardware id #2/paging: 0x%.2x\n",hp100_inb(PAGING)); ! 2997: printk("option #1: 0x%.4x\n",hp100_inw(OPTION_LSW)); ! 2998: printk("option #2: 0x%.4x\n",hp100_inw(OPTION_MSW)); ! 2999: ! 3000: /* Dump paged registers */ ! 3001: for (Page = 0; Page < 8; Page++) ! 3002: { ! 3003: /* Dump registers */ ! 3004: printk("page: 0x%.2x\n",Page); ! 3005: outw( Page, ioaddr+0x02); ! 3006: for (Register = 0x8; Register < 0x22; Register += 2) ! 3007: { ! 3008: /* Display Register contents except data port */ ! 3009: if (((Register != 0x10) && (Register != 0x12)) || (Page > 0)) ! 3010: { ! 3011: printk("0x%.2x = 0x%.4x\n",Register,inw(ioaddr+Register)); ! 3012: } ! 3013: } ! 3014: } ! 3015: hp100_page(PERFORMANCE); ! 3016: } ! 3017: #endif ! 3018: ! 3019: ! 3020: ! 3021: /* ! 3022: * module section ! 3023: */ ! 3024: ! 3025: #ifdef MODULE ! 3026: ! 3027: /* Parameters set by insmod */ ! 3028: int hp100_port[5] = { 0, -1, -1, -1, -1 }; ! 3029: #ifdef LINUX_2_1 ! 3030: MODULE_PARM(hp100_port, "1-5i"); ! 3031: #endif ! 3032: ! 3033: #ifdef LINUX_2_1 ! 3034: char hp100_name[5][IFNAMSIZ] = { "", "", "", "", "" }; ! 3035: MODULE_PARM(hp100_name, "1-5c" __MODULE_STRING(IFNAMSIZ)); ! 3036: #else ! 3037: static char devname[5][IFNAMSIZ] = { "", "", "", "", "" }; ! 3038: static char *hp100_name[5] = { devname[0], devname[1], ! 3039: devname[2], devname[3], ! 3040: devname[4] }; ! 3041: #endif ! 3042: ! 3043: /* List of devices */ ! 3044: static struct device *hp100_devlist[5] = { NULL, NULL, NULL, NULL, NULL }; ! 3045: ! 3046: /* ! 3047: * Note: if you have more than five 100vg cards in your pc, feel free to ! 3048: * increase this value ! 3049: */ ! 3050: ! 3051: /* ! 3052: * Note: to register three eisa or pci devices, use: ! 3053: * option hp100 hp100_port=0,0,0 ! 3054: * to register one card at io 0x280 as eth239, use: ! 3055: * option hp100 hp100_port=0x280 hp100_name=eth239 ! 3056: */ ! 3057: ! 3058: int init_module( void ) ! 3059: { ! 3060: int i, cards; ! 3061: ! 3062: if (hp100_port == 0 && !EISA_bus && !pcibios_present()) ! 3063: printk("hp100: You should not use auto-probing with insmod!\n"); ! 3064: ! 3065: /* Loop on all possible base addresses */ ! 3066: i = -1; cards = 0; ! 3067: while((hp100_port[++i] != -1) && (i < 5)) ! 3068: { ! 3069: /* Create device and set basics args */ ! 3070: hp100_devlist[i] = kmalloc(sizeof(struct device), GFP_KERNEL); ! 3071: memset(hp100_devlist[i], 0x00, sizeof(struct device)); ! 3072: hp100_devlist[i]->name = hp100_name[i]; ! 3073: hp100_devlist[i]->base_addr = hp100_port[i]; ! 3074: hp100_devlist[i]->init = &hp100_probe; ! 3075: ! 3076: /* Try to create the device */ ! 3077: if(register_netdev(hp100_devlist[i]) != 0) ! 3078: { ! 3079: /* DeAllocate everything */ ! 3080: /* Note: if dev->priv is mallocated, there is no way to fail */ ! 3081: kfree_s(hp100_devlist[i], sizeof(struct device)); ! 3082: hp100_devlist[i] = (struct device *) NULL; ! 3083: } ! 3084: else ! 3085: cards++; ! 3086: } /* Loop over all devices */ ! 3087: ! 3088: return cards > 0 ? 0 : -ENODEV; ! 3089: } ! 3090: ! 3091: void cleanup_module( void ) ! 3092: { ! 3093: int i; ! 3094: ! 3095: /* TODO: Check if all skb's are released/freed. */ ! 3096: for(i = 0; i < 5; i++) ! 3097: if(hp100_devlist[i] != (struct device *) NULL) ! 3098: { ! 3099: unregister_netdev( hp100_devlist[i] ); ! 3100: release_region( hp100_devlist[i]->base_addr, HP100_REGION_SIZE ); ! 3101: if( ((struct hp100_private *)hp100_devlist[i]->priv)->mode==1 ) /* busmaster */ ! 3102: kfree_s( ((struct hp100_private *)hp100_devlist[i]->priv)->page_vaddr, MAX_RINGSIZE+0x0f); ! 3103: if ( ((struct hp100_private *)hp100_devlist[i]->priv) -> mem_ptr_virt ) ! 3104: iounmap( ((struct hp100_private *)hp100_devlist[i]->priv) -> mem_ptr_virt ); ! 3105: kfree_s( hp100_devlist[i]->priv, sizeof( struct hp100_private ) ); ! 3106: hp100_devlist[i]->priv = NULL; ! 3107: kfree_s(hp100_devlist[i], sizeof(struct device)); ! 3108: hp100_devlist[i] = (struct device *) NULL; ! 3109: } ! 3110: } ! 3111: ! 3112: #endif /* MODULE */ ! 3113: ! 3114: ! 3115: ! 3116: /* ! 3117: * Local variables: ! 3118: * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c hp100.c" ! 3119: * c-indent-level: 2 ! 3120: * tab-width: 8 ! 3121: * End: ! 3122: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.