Annotation of Gnu-Mach/linux/src/drivers/net/hp100.c, revision 1.1

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:  */

unix.superglobalmegacorp.com

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