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

1.1     ! root        1: /********************************************************************
        !             2:  *
        !             3:  *  Linux ThunderLAN Driver
        !             4:  *
        !             5:  *  tlan.c
        !             6:  *  by James Banks
        !             7:  *
        !             8:  *  (C) 1997-1998 Caldera, Inc.
        !             9:  *  (C) 1998 James Banks
        !            10:  *
        !            11:  *  This software may be used and distributed according to the terms
        !            12:  *  of the GNU Public License, incorporated herein by reference.
        !            13:  *
        !            14:  ** This file is best viewed/edited with columns>=132.
        !            15:  *
        !            16:  ** Useful (if not required) reading:
        !            17:  *
        !            18:  *             Texas Instruments, ThunderLAN Programmer's Guide,
        !            19:  *                     TI Literature Number SPWU013A
        !            20:  *                     available in PDF format from www.ti.com
        !            21:  *             Level One, LXT901 and LXT970 Data Sheets
        !            22:  *                     available in PDF format from www.level1.com
        !            23:  *             National Semiconductor, DP83840A Data Sheet
        !            24:  *                     available in PDF format from www.national.com
        !            25:  *             Microchip Technology, 24C01A/02A/04A Data Sheet
        !            26:  *                     available in PDF format from www.microchip.com
        !            27:  *
        !            28:  ********************************************************************/
        !            29: 
        !            30: 
        !            31: #include <linux/module.h>
        !            32: 
        !            33: #include "tlan.h"
        !            34: 
        !            35: #include <linux/bios32.h>
        !            36: #include <linux/ioport.h>
        !            37: #include <linux/pci.h>
        !            38: #include <linux/etherdevice.h>
        !            39: #include <linux/delay.h>
        !            40: 
        !            41: 
        !            42: 
        !            43: typedef u32 (TLanIntVectorFunc)( struct device *, u16 );
        !            44: 
        !            45: 
        !            46: #ifdef MODULE
        !            47: 
        !            48: static struct device   *TLanDevices = NULL;
        !            49: static int             TLanDevicesInstalled = 0;
        !            50: 
        !            51: #endif
        !            52: 
        !            53: 
        !            54: static  int            debug = 0;
        !            55: static int             aui = 0;
        !            56: static int             sa_int = 0;
        !            57: static int             bbuf = 0;
        !            58: static int             duplex = 0;
        !            59: static int             speed = 0;
        !            60: static u8              *TLanPadBuffer;
        !            61: static char            TLanSignature[] = "TLAN";
        !            62: static int             TLanVersionMajor = 1;
        !            63: static int             TLanVersionMinor = 0;
        !            64: 
        !            65: 
        !            66: static TLanAdapterEntry TLanAdapterList[] = {
        !            67:        { PCI_VENDOR_ID_COMPAQ, 
        !            68:          PCI_DEVICE_ID_NETELLIGENT_10,
        !            69:          "Compaq Netelligent 10 T PCI UTP",
        !            70:          TLAN_ADAPTER_ACTIVITY_LED,
        !            71:          0x83
        !            72:        },
        !            73:        { PCI_VENDOR_ID_COMPAQ,
        !            74:          PCI_DEVICE_ID_NETELLIGENT_10_100,
        !            75:          "Compaq Netelligent 10/100 TX PCI UTP",
        !            76:          TLAN_ADAPTER_ACTIVITY_LED,
        !            77:          0x83
        !            78:        }, 
        !            79:        { PCI_VENDOR_ID_COMPAQ,
        !            80:          PCI_DEVICE_ID_NETFLEX_3P_INTEGRATED,
        !            81:          "Compaq Integrated NetFlex-3/P",
        !            82:          TLAN_ADAPTER_NONE,
        !            83:          0x83
        !            84:        }, 
        !            85:        { PCI_VENDOR_ID_COMPAQ,
        !            86:          PCI_DEVICE_ID_NETFLEX_3P,
        !            87:          "Compaq NetFlex-3/P",
        !            88:          TLAN_ADAPTER_UNMANAGED_PHY | TLAN_ADAPTER_BIT_RATE_PHY,
        !            89:          0x83
        !            90:        },
        !            91:        { PCI_VENDOR_ID_COMPAQ,
        !            92:          PCI_DEVICE_ID_NETFLEX_3P_BNC,
        !            93:          "Compaq NetFlex-3/P",
        !            94:          TLAN_ADAPTER_NONE,
        !            95:          0x83
        !            96:        },
        !            97:        { PCI_VENDOR_ID_COMPAQ,
        !            98:          PCI_DEVICE_ID_NETELLIGENT_10_100_PROLIANT,
        !            99:          "Compaq Netelligent Integrated 10/100 TX UTP",
        !           100:          TLAN_ADAPTER_NONE,
        !           101:          0x83
        !           102:        },
        !           103:        { PCI_VENDOR_ID_COMPAQ,
        !           104:          PCI_DEVICE_ID_NETELLIGENT_10_100_DUAL,
        !           105:          "Compaq Netelligent Dual 10/100 TX PCI UTP",
        !           106:          TLAN_ADAPTER_NONE,
        !           107:          0x83
        !           108:        },
        !           109:        { PCI_VENDOR_ID_COMPAQ,
        !           110:          PCI_DEVICE_ID_DESKPRO_4000_5233MMX,
        !           111:          "Compaq Netelligent 10/100 TX Embedded UTP",
        !           112:          TLAN_ADAPTER_NONE,
        !           113:          0x83
        !           114:        },
        !           115:        { PCI_VENDOR_ID_OLICOM,
        !           116:          PCI_DEVICE_ID_OLICOM_OC2183,
        !           117:          "Olicom OC-2183/2185",
        !           118:          TLAN_ADAPTER_USE_INTERN_10,
        !           119:          0xF8
        !           120:        },
        !           121:        { PCI_VENDOR_ID_OLICOM,
        !           122:          PCI_DEVICE_ID_OLICOM_OC2325,
        !           123:          "Olicom OC-2325",
        !           124:          TLAN_ADAPTER_UNMANAGED_PHY,
        !           125:          0xF8
        !           126:        },
        !           127:        { PCI_VENDOR_ID_OLICOM,
        !           128:          PCI_DEVICE_ID_OLICOM_OC2326,
        !           129:          "Olicom OC-2326",
        !           130:          TLAN_ADAPTER_USE_INTERN_10,
        !           131:          0xF8
        !           132:        },
        !           133:        { PCI_VENDOR_ID_COMPAQ,
        !           134:          PCI_DEVICE_ID_NETELLIGENT_10_100_WS_5100,
        !           135:          "Compaq Netelligent 10/100 TX UTP",
        !           136:          TLAN_ADAPTER_ACTIVITY_LED,
        !           137:          0x83
        !           138:        },
        !           139:        { PCI_VENDOR_ID_COMPAQ,
        !           140:          PCI_DEVICE_ID_NETELLIGENT_10_T2,
        !           141:          "Compaq Netelligent 10 T/2 PCI UTP/Coax",
        !           142:          TLAN_ADAPTER_NONE,
        !           143:          0x83
        !           144:        },
        !           145:        { 0,
        !           146:          0,
        !           147:          NULL,
        !           148:          0,
        !           149:          0
        !           150:        } /* End of List */
        !           151: };
        !           152: 
        !           153: 
        !           154: static int     TLan_PciProbe( u8 *, u8 *, u8 *, u8 *, u32 *, u32 * );
        !           155: static int     TLan_Init( struct device * );
        !           156: static int     TLan_Open(struct device *dev);
        !           157: static int     TLan_StartTx(struct sk_buff *, struct device *);
        !           158: static void    TLan_HandleInterrupt(int, void *, struct pt_regs *);
        !           159: static int     TLan_Close(struct device *);
        !           160: static struct  net_device_stats *TLan_GetStats( struct device * );
        !           161: static void    TLan_SetMulticastList( struct device * );
        !           162: 
        !           163: static u32     TLan_HandleInvalid( struct device *, u16 );
        !           164: static u32     TLan_HandleTxEOF( struct device *, u16 );
        !           165: static u32     TLan_HandleStatOverflow( struct device *, u16 );
        !           166: static u32     TLan_HandleRxEOF( struct device *, u16 );
        !           167: static u32     TLan_HandleDummy( struct device *, u16 );
        !           168: static u32     TLan_HandleTxEOC( struct device *, u16 );
        !           169: static u32     TLan_HandleStatusCheck( struct device *, u16 );
        !           170: static u32     TLan_HandleRxEOC( struct device *, u16 );
        !           171: 
        !           172: static void    TLan_Timer( unsigned long );
        !           173: 
        !           174: static void    TLan_ResetLists( struct device * );
        !           175: static void    TLan_FreeLists( struct device * );
        !           176: static void    TLan_PrintDio( u16 );
        !           177: static void    TLan_PrintList( TLanList *, char *, int );
        !           178: static void    TLan_ReadAndClearStats( struct device *, int );
        !           179: static void    TLan_ResetAdapter( struct device * );
        !           180: static void    TLan_FinishReset( struct device * );
        !           181: static void    TLan_SetMac( struct device *, int areg, char *mac );
        !           182: 
        !           183: static void    TLan_PhyPrint( struct device * );
        !           184: static void    TLan_PhyDetect( struct device * );
        !           185: static void    TLan_PhyPowerDown( struct device * );
        !           186: static void    TLan_PhyPowerUp( struct device * );
        !           187: static void    TLan_PhyReset( struct device * );
        !           188: static void    TLan_PhyStartLink( struct device * );
        !           189: static void    TLan_PhyFinishAutoNeg( struct device * );
        !           190: /*
        !           191: static int     TLan_PhyNop( struct device * );
        !           192: static int     TLan_PhyInternalCheck( struct device * );
        !           193: static int     TLan_PhyInternalService( struct device * );
        !           194: static int     TLan_PhyDp83840aCheck( struct device * );
        !           195: */
        !           196: 
        !           197: static int     TLan_MiiReadReg( struct device *, u16, u16, u16 * );
        !           198: static void    TLan_MiiSendData( u16, u32, unsigned );
        !           199: static void    TLan_MiiSync( u16 );
        !           200: static void    TLan_MiiWriteReg( struct device *, u16, u16, u16 );
        !           201: 
        !           202: static void    TLan_EeSendStart( u16 );
        !           203: static int     TLan_EeSendByte( u16, u8, int );
        !           204: static void    TLan_EeReceiveByte( u16, u8 *, int );
        !           205: static int     TLan_EeReadByte( struct device *, u8, u8 * );
        !           206: 
        !           207: 
        !           208: static TLanIntVectorFunc *TLanIntVector[TLAN_INT_NUMBER_OF_INTS] = {
        !           209:        TLan_HandleInvalid,
        !           210:        TLan_HandleTxEOF,
        !           211:        TLan_HandleStatOverflow,
        !           212:        TLan_HandleRxEOF,
        !           213:        TLan_HandleDummy,
        !           214:        TLan_HandleTxEOC,
        !           215:        TLan_HandleStatusCheck,
        !           216:        TLan_HandleRxEOC
        !           217: };
        !           218: 
        !           219: static inline void
        !           220: TLan_SetTimer( struct device *dev, u32 ticks, u32 type )
        !           221: {
        !           222:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !           223: 
        !           224:        cli();
        !           225:        if ( priv->timer.function != NULL ) {
        !           226:                return;
        !           227:        }
        !           228:        priv->timer.function = &TLan_Timer;
        !           229:        sti();
        !           230: 
        !           231:        priv->timer.data = (unsigned long) dev;
        !           232:        priv->timer.expires = jiffies + ticks;
        !           233:        priv->timerSetAt = jiffies;
        !           234:        priv->timerType = type;
        !           235:        add_timer( &priv->timer );
        !           236: 
        !           237: } /* TLan_SetTimer */
        !           238: 
        !           239: 
        !           240: /*****************************************************************************
        !           241: ******************************************************************************
        !           242: 
        !           243:        ThunderLAN Driver Primary Functions
        !           244: 
        !           245:        These functions are more or less common to all Linux network drivers.
        !           246: 
        !           247: ******************************************************************************
        !           248: *****************************************************************************/
        !           249: 
        !           250: 
        !           251: #ifdef MODULE
        !           252: 
        !           253:        /***************************************************************
        !           254:         *      init_module
        !           255:         *
        !           256:         *      Returns:
        !           257:         *              0 if module installed ok, non-zero if not.
        !           258:         *      Parms:
        !           259:         *              None
        !           260:         *
        !           261:         *      This function begins the setup of the driver creating a
        !           262:         *      pad buffer, finding all TLAN devices (matching
        !           263:         *      TLanAdapterList entries), and creating and initializing a
        !           264:         *      device structure for each adapter.
        !           265:         *
        !           266:         **************************************************************/
        !           267: 
        !           268: extern int init_module(void)
        !           269: {
        !           270:        TLanPrivateInfo *priv;
        !           271:        u8              bus;
        !           272:        struct device   *dev;
        !           273:        size_t          dev_size;
        !           274:        u8              dfn;
        !           275:        u32             index;
        !           276:        int             failed;
        !           277:        int             found;
        !           278:        u32             io_base;
        !           279:        u8              irq;
        !           280:        u8              rev;
        !           281: 
        !           282:        printk( "TLAN driver, v%d.%d, (C) 1997-8 Caldera, Inc.\n",
        !           283:                TLanVersionMajor,
        !           284:                TLanVersionMinor
        !           285:              );
        !           286:        TLanPadBuffer = (u8 *) kmalloc( TLAN_MIN_FRAME_SIZE,
        !           287:                                        ( GFP_KERNEL | GFP_DMA )
        !           288:                                      );
        !           289:        if ( TLanPadBuffer == NULL ) {
        !           290:                printk( "TLAN:  Could not allocate memory for pad buffer.\n" );
        !           291:                return -ENOMEM;
        !           292:        }
        !           293: 
        !           294:        memset( TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE );
        !           295: 
        !           296:        dev_size = sizeof(struct device) + sizeof(TLanPrivateInfo);
        !           297: 
        !           298:        while ( ( found = TLan_PciProbe( &bus, &dfn, &irq, &rev, &io_base, &index ) ) ) {
        !           299:                dev = (struct device *) kmalloc( dev_size, GFP_KERNEL );
        !           300:                if ( dev == NULL ) {
        !           301:                        printk( "TLAN:  Could not allocate memory for device.\n" );
        !           302:                        continue;
        !           303:                }
        !           304:                memset( dev, 0, dev_size );
        !           305: 
        !           306:                dev->priv = priv = ( (void *) dev ) + sizeof(struct device);
        !           307:                dev->name = priv->devName;
        !           308:                strcpy( priv->devName, "    " );
        !           309:                dev->base_addr = io_base;
        !           310:                dev->irq = irq;
        !           311:                dev->init = TLan_Init;
        !           312: 
        !           313:                priv->adapter =    &TLanAdapterList[index];
        !           314:                priv->adapterRev = rev;
        !           315:                priv->aui =        aui;
        !           316:                if ( ( duplex != 1 ) && ( duplex != 2 ) ) {
        !           317:                        duplex = 0;
        !           318:                }
        !           319:                priv->duplex =     duplex;
        !           320:                if ( ( speed != 10 ) && ( speed != 100 ) ) {
        !           321:                        speed = 0;
        !           322:                }
        !           323:                priv->speed =      speed;
        !           324:                priv->sa_int =     sa_int;
        !           325:                priv->debug =      debug;
        !           326: 
        !           327:                ether_setup( dev );
        !           328: 
        !           329:                failed = register_netdev( dev );
        !           330: 
        !           331:                if ( failed ) {
        !           332:                        printk( "TLAN:  Could not register device.\n" );
        !           333:                        kfree( dev );
        !           334:                } else {
        !           335:                        priv->nextDevice = TLanDevices;
        !           336:                        TLanDevices = dev;
        !           337:                        TLanDevicesInstalled++;
        !           338:                        printk("TLAN:  %s irq=%2d io=%04x, %s, Rev. %d\n",
        !           339:                                dev->name,
        !           340:                                (int) dev->irq,
        !           341:                                (int) dev->base_addr,
        !           342:                                priv->adapter->deviceLabel,
        !           343:                                priv->adapterRev );
        !           344:                }
        !           345:        }
        !           346:        
        !           347:        /* printk( "TLAN:  Found %d device(s).\n", TLanDevicesInstalled ); */
        !           348: 
        !           349:     return ( ( TLanDevicesInstalled >= 0 ) ? 0 : -ENODEV );
        !           350: 
        !           351: } /* init_module */
        !           352: 
        !           353: 
        !           354: 
        !           355: 
        !           356:        /***************************************************************
        !           357:         *      cleanup_module
        !           358:         *
        !           359:         *      Returns:
        !           360:         *              Nothing
        !           361:         *      Parms:
        !           362:         *              None
        !           363:         *
        !           364:         *      Goes through the TLanDevices list and frees the device
        !           365:         *      structs and memory associated with each device (lists
        !           366:         *      and buffers).  It also ureserves the IO port regions
        !           367:         *      associated with this device.
        !           368:         *
        !           369:         **************************************************************/
        !           370: 
        !           371: extern void cleanup_module(void)
        !           372: {
        !           373:        struct device   *dev;
        !           374:        TLanPrivateInfo *priv;
        !           375: 
        !           376:        while ( TLanDevicesInstalled ) {
        !           377:                dev = TLanDevices;
        !           378:                priv = (TLanPrivateInfo *) dev->priv;
        !           379:                if ( priv->dmaStorage ) {
        !           380:                        kfree( priv->dmaStorage );
        !           381:                }
        !           382:                release_region( dev->base_addr, 0x10 );
        !           383:                unregister_netdev( dev );
        !           384:                TLanDevices = priv->nextDevice;
        !           385:                kfree( dev );
        !           386:                TLanDevicesInstalled--;
        !           387:        }
        !           388:        kfree( TLanPadBuffer );
        !           389: 
        !           390: } /* cleanup_module */
        !           391: 
        !           392: 
        !           393: #else /* MODULE */
        !           394: 
        !           395: 
        !           396: 
        !           397: 
        !           398:        /***************************************************************
        !           399:         *      tlan_probe
        !           400:         *
        !           401:         *      Returns:
        !           402:         *              0 on success, error code on error
        !           403:         *      Parms:
        !           404:         *              dev     device struct to use if adapter is
        !           405:         *                      found.
        !           406:         *
        !           407:         *      The name is lower case to fit in with all the rest of
        !           408:         *      the netcard_probe names.  This function looks for a/
        !           409:         *      another TLan based adapter, setting it up with the
        !           410:         *      provided device struct if one is found.
        !           411:         *
        !           412:         **************************************************************/
        !           413:         
        !           414: extern int tlan_probe( struct device *dev )
        !           415: {
        !           416:        TLanPrivateInfo *priv;
        !           417:        static int      pad_allocated = 0;
        !           418:        int             found;
        !           419:        u8              bus, dfn, irq, rev;
        !           420:        u32             io_base, index;
        !           421: 
        !           422:        found = TLan_PciProbe( &bus, &dfn, &irq, &rev, &io_base, &index );
        !           423: 
        !           424:        if ( ! found ) {
        !           425:                return -ENODEV;
        !           426:        }
        !           427: 
        !           428:        dev->priv = kmalloc( sizeof(TLanPrivateInfo), GFP_KERNEL );
        !           429:        
        !           430:        if ( dev->priv == NULL ) {
        !           431:                printk( "TLAN:  Could not allocate memory for device.\n" );
        !           432:                return  -ENOMEM;
        !           433:        }
        !           434: 
        !           435:        memset( dev->priv, 0, sizeof(TLanPrivateInfo) );
        !           436: 
        !           437:        if ( ! pad_allocated ) {
        !           438:                TLanPadBuffer = (u8 *) kmalloc( TLAN_MIN_FRAME_SIZE, 
        !           439: //                                             ( GFP_KERNEL | GFP_DMA )
        !           440:                                                ( GFP_KERNEL )
        !           441:                                              );
        !           442:                if ( TLanPadBuffer == NULL ) {
        !           443:                        printk( "TLAN:  Could not allocate memory for padding.\n" );
        !           444:                        kfree( dev->priv );
        !           445:                        return -ENOMEM;
        !           446:                } else {
        !           447:                        pad_allocated = 1;
        !           448:                        memset( TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE );
        !           449:                }
        !           450:        }
        !           451: 
        !           452:        priv = (TLanPrivateInfo *) dev->priv;
        !           453: 
        !           454:        dev->name = priv->devName;
        !           455:        strcpy( priv->devName, "    " );
        !           456: 
        !           457:        dev = init_etherdev( dev, sizeof(TLanPrivateInfo) );
        !           458: 
        !           459:        dev->base_addr = io_base;
        !           460:        dev->irq = irq;
        !           461: 
        !           462: 
        !           463:        priv->adapter =    &TLanAdapterList[index];
        !           464:        priv->adapterRev = rev;
        !           465:        priv->aui =        dev->mem_start & 0x01;
        !           466:        priv->duplex =     ( ( dev->mem_start & 0x0C ) == 0x0C ) ? 0 : ( dev->mem_start & 0x0C ) >> 2;
        !           467:        priv->speed =      ( ( dev->mem_start & 0x30 ) == 0x30 ) ? 0 : ( dev->mem_start & 0x30 ) >> 4;
        !           468:        if ( priv->speed == 0x1 ) {
        !           469:                priv->speed = TLAN_SPEED_10;
        !           470:        } else if ( priv->speed == 0x2 ) {
        !           471:                priv->speed = TLAN_SPEED_100;
        !           472:        }
        !           473:        priv->sa_int =     dev->mem_start & 0x02;
        !           474:        priv->debug =      dev->mem_end;
        !           475: 
        !           476: 
        !           477:        printk("TLAN %d.%d:  %s irq=%2d io=%04x, %s, Rev. %d\n",
        !           478:                TLanVersionMajor,
        !           479:                TLanVersionMinor,
        !           480:                dev->name, 
        !           481:                (int) irq, 
        !           482:                io_base,
        !           483:                priv->adapter->deviceLabel,
        !           484:                priv->adapterRev );
        !           485: 
        !           486:        TLan_Init( dev );
        !           487:                        
        !           488:        return 0;
        !           489: 
        !           490: } /* tlan_probe */
        !           491: 
        !           492: 
        !           493: #endif /* MODULE */
        !           494: 
        !           495: 
        !           496: 
        !           497: 
        !           498:        /***************************************************************
        !           499:         *      TLan_PciProbe
        !           500:         *
        !           501:         *      Returns:
        !           502:         *              1 if another TLAN card was found, 0 if not.
        !           503:         *      Parms:
        !           504:         *              pci_bus         The PCI bus the card was found
        !           505:         *                              on.
        !           506:         *              pci_dfn         The PCI whatever the card was
        !           507:         *                              found at.
        !           508:         *              pci_irq         The IRQ of the found adapter.
        !           509:         *              pci_rev         The revision of the adapter.
        !           510:         *              pci_io_base     The first IO port used by the
        !           511:         *                              adapter.
        !           512:         *              dl_ix           The index in the device list
        !           513:         *                              of the adapter.
        !           514:         *
        !           515:         *      This function searches for an adapter with PCI vendor
        !           516:         *      and device IDs matching those in the TLanAdapterList.
        !           517:         *      The function 'remembers' the last device it found,
        !           518:         *      and so finds a new device (if anymore are to be found)
        !           519:         *      each time the function is called.  It then looks up
        !           520:         *      pertinent PCI info and returns it to the caller.
        !           521:         *
        !           522:         **************************************************************/
        !           523: 
        !           524: int TLan_PciProbe( u8 *pci_bus, u8 *pci_dfn, u8 *pci_irq, u8 *pci_rev, u32 *pci_io_base, u32 *dl_ix )
        !           525: {
        !           526:        static int dl_index = 0;
        !           527:        static int pci_index = 0;
        !           528: 
        !           529:        int     not_found;
        !           530:        u8      pci_latency;
        !           531:        u16     pci_command;
        !           532:        int     reg;
        !           533: 
        !           534: 
        !           535:        if ( ! pcibios_present() ) {
        !           536:                printk( "TLAN:   PCI Bios not present.\n" );
        !           537:                return 0;
        !           538:        }
        !           539: 
        !           540:        for (; TLanAdapterList[dl_index].vendorId != 0; dl_index++) {
        !           541: 
        !           542:                not_found = pcibios_find_device(
        !           543:                        TLanAdapterList[dl_index].vendorId,
        !           544:                        TLanAdapterList[dl_index].deviceId,
        !           545:                        pci_index,
        !           546:                        pci_bus,
        !           547:                        pci_dfn
        !           548:                );
        !           549: 
        !           550:                if ( ! not_found ) {
        !           551: 
        !           552:                        TLAN_DBG(
        !           553:                                TLAN_DEBUG_GNRL,
        !           554:                                "TLAN:  found: Vendor Id = 0x%hx, Device Id = 0x%hx\n",
        !           555:                                TLanAdapterList[dl_index].vendorId,
        !           556:                                TLanAdapterList[dl_index].deviceId
        !           557:                        );
        !           558: 
        !           559:                        pcibios_read_config_byte ( *pci_bus,  *pci_dfn, PCI_REVISION_ID, pci_rev);
        !           560:                        pcibios_read_config_byte ( *pci_bus,  *pci_dfn, PCI_INTERRUPT_LINE, pci_irq);
        !           561:                        pcibios_read_config_word ( *pci_bus,  *pci_dfn, PCI_COMMAND, &pci_command);
        !           562:                        pcibios_read_config_dword( *pci_bus,  *pci_dfn, PCI_BASE_ADDRESS_0, pci_io_base);
        !           563:                        pcibios_read_config_byte ( *pci_bus,  *pci_dfn, PCI_LATENCY_TIMER, &pci_latency);
        !           564: 
        !           565:                        if (pci_latency < 0x10) {
        !           566:                                pcibios_write_config_byte( *pci_bus, *pci_dfn, PCI_LATENCY_TIMER, 0xff);
        !           567:                                TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:    Setting latency timer to max.\n");
        !           568:                        }
        !           569: 
        !           570:                        for ( reg = PCI_BASE_ADDRESS_0; reg <= PCI_BASE_ADDRESS_5; reg +=4 ) {
        !           571:                                pcibios_read_config_dword( *pci_bus, *pci_dfn, reg, pci_io_base);
        !           572:                                if ((pci_command & PCI_COMMAND_IO) && (*pci_io_base & 0x3)) {
        !           573:                                        *pci_io_base &= PCI_BASE_ADDRESS_IO_MASK;
        !           574:                                        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:    IO mapping is available at %x.\n", *pci_io_base);
        !           575:                                        break;
        !           576:                                } else {
        !           577:                                        *pci_io_base = 0;
        !           578:                                }
        !           579:                        }
        !           580: 
        !           581:                        if ( *pci_io_base == 0 )
        !           582:                                printk("TLAN:    IO mapping not available, ignoring device.\n");
        !           583: 
        !           584:                        if ( ! ( pci_command & PCI_COMMAND_MASTER ) ) {
        !           585:                                pcibios_write_config_word ( *pci_bus,  *pci_dfn, PCI_COMMAND, pci_command | PCI_COMMAND_MASTER );
        !           586:                                printk( "TLAN:  Activating PCI bus mastering for this device.\n" );
        !           587:                        }
        !           588: 
        !           589:                        pci_index++;
        !           590: 
        !           591:                        if ( *pci_io_base ) {
        !           592:                                *dl_ix = dl_index;
        !           593:                                return 1;
        !           594:                        }
        !           595: 
        !           596:                } else {
        !           597:                        pci_index = 0;
        !           598:                }
        !           599:        }
        !           600: 
        !           601:        return 0;
        !           602: 
        !           603: } /* TLan_PciProbe */
        !           604: 
        !           605: 
        !           606: 
        !           607: 
        !           608:        /***************************************************************
        !           609:         *      TLan_Init
        !           610:         *
        !           611:         *      Returns:
        !           612:         *              0 on success, error code otherwise.
        !           613:         *      Parms:
        !           614:         *              dev     The structure of the device to be
        !           615:         *                      init'ed.
        !           616:         *
        !           617:         *      This function completes the initialization of the
        !           618:         *      device structure and driver.  It reserves the IO
        !           619:         *      addresses, allocates memory for the lists and bounce
        !           620:         *      buffers, retrieves the MAC address from the eeprom
        !           621:         *      and assignes the device's methods.
        !           622:         *      
        !           623:         **************************************************************/
        !           624: 
        !           625: int TLan_Init( struct device *dev )
        !           626: {
        !           627:        int             dma_size;
        !           628:        int             err;
        !           629:        int             i;
        !           630:        TLanPrivateInfo *priv;
        !           631: 
        !           632:        priv = (TLanPrivateInfo *) dev->priv;
        !           633: 
        !           634:        err = check_region( dev->base_addr, 0x10 );
        !           635:        if ( err ) {
        !           636:                printk( "TLAN:  %s: Io port region 0x%lx size 0x%x in use.\n",
        !           637:                        dev->name,
        !           638:                        dev->base_addr,
        !           639:                        0x10 );
        !           640:                return -EIO;
        !           641:        }
        !           642:        request_region( dev->base_addr, 0x10, TLanSignature );
        !           643: 
        !           644:        if ( bbuf ) {
        !           645:                dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
        !           646:                   * ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE );
        !           647:        } else {
        !           648:                dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
        !           649:                   * ( sizeof(TLanList) );
        !           650:        }
        !           651: 
        !           652:        priv->dmaStorage = kmalloc( dma_size, GFP_KERNEL | GFP_DMA );
        !           653:        if ( priv->dmaStorage == NULL ) {
        !           654:                printk( "TLAN:  Could not allocate lists and buffers for %s.\n",
        !           655:                        dev->name );
        !           656:                return -ENOMEM;
        !           657:        }
        !           658:        memset( priv->dmaStorage, 0, dma_size );
        !           659:        priv->rxList = (TLanList *) 
        !           660:                       ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 );
        !           661:        priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
        !           662: 
        !           663:        if ( bbuf ) {
        !           664:                priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
        !           665:                priv->txBuffer = priv->rxBuffer
        !           666:                                 + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
        !           667:        }
        !           668: 
        !           669:        err = 0;
        !           670:        for ( i = 0;  i < 6 ; i++ )
        !           671:                err |= TLan_EeReadByte( dev,
        !           672:                                        (u8) priv->adapter->addrOfs + i,
        !           673:                                        (u8 *) &dev->dev_addr[i] );
        !           674:        if ( err ) {
        !           675:                printk( "TLAN:  %s: Error reading MAC from eeprom: %d\n",
        !           676:                        dev->name,
        !           677:                        err );
        !           678:        }
        !           679: 
        !           680:        dev->addr_len = 6;
        !           681: 
        !           682:        dev->open = &TLan_Open;
        !           683:        dev->hard_start_xmit = &TLan_StartTx;
        !           684:        dev->stop = &TLan_Close;
        !           685:        dev->get_stats = &TLan_GetStats;
        !           686:        dev->set_multicast_list = &TLan_SetMulticastList;
        !           687: 
        !           688: 
        !           689:        return 0;
        !           690: 
        !           691: } /* TLan_Init */
        !           692: 
        !           693: 
        !           694: 
        !           695: 
        !           696:        /***************************************************************
        !           697:         *      TLan_Open
        !           698:         *
        !           699:         *      Returns:
        !           700:         *              0 on success, error code otherwise.
        !           701:         *      Parms:
        !           702:         *              dev     Structure of device to be opened.
        !           703:         *
        !           704:         *      This routine puts the driver and TLAN adapter in a
        !           705:         *      state where it is ready to send and receive packets.
        !           706:         *      It allocates the IRQ, resets and brings the adapter
        !           707:         *      out of reset, and allows interrupts.  It also delays
        !           708:         *      the startup for autonegotiation or sends a Rx GO
        !           709:         *      command to the adapter, as appropriate.
        !           710:         *
        !           711:         **************************************************************/
        !           712: 
        !           713: int TLan_Open( struct device *dev )
        !           714: {
        !           715:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !           716:        int             err;
        !           717: 
        !           718:        priv->tlanRev = TLan_DioRead8( dev->base_addr, TLAN_DEF_REVISION );
        !           719:        if ( priv->sa_int ) {
        !           720:                TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:   Using SA_INTERRUPT\n" ); 
        !           721:                err = request_irq( dev->irq, TLan_HandleInterrupt, SA_SHIRQ | SA_INTERRUPT, TLanSignature, dev );
        !           722:        } else {
        !           723:                err = request_irq( dev->irq, TLan_HandleInterrupt, SA_SHIRQ, TLanSignature, dev );
        !           724:        }
        !           725:        if ( err ) {
        !           726:                printk( "TLAN:  Cannot open %s because IRQ %d is already in use.\n", dev->name, dev->irq );
        !           727:                return -EAGAIN;
        !           728:        }
        !           729:        
        !           730:        MOD_INC_USE_COUNT;
        !           731: 
        !           732:        dev->tbusy = 0;
        !           733:        dev->interrupt = 0;
        !           734:        dev->start = 1;
        !           735: 
        !           736:        /* NOTE: It might not be necessary to read the stats before a
        !           737:                         reset if you don't care what the values are.
        !           738:        */
        !           739:        TLan_ResetLists( dev );
        !           740:        TLan_ReadAndClearStats( dev, TLAN_IGNORE );
        !           741:        TLan_ResetAdapter( dev );
        !           742: 
        !           743:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Opened.  TLAN Chip Rev: %x\n", dev->name, priv->tlanRev );
        !           744: 
        !           745:        return 0;
        !           746: 
        !           747: } /* TLan_Open */
        !           748: 
        !           749: 
        !           750: 
        !           751: 
        !           752:        /***************************************************************
        !           753:         *      TLan_StartTx
        !           754:         *  
        !           755:         *      Returns:
        !           756:         *              0 on success, non-zero on failure.
        !           757:         *      Parms:
        !           758:         *              skb     A pointer to the sk_buff containing the
        !           759:         *                      frame to be sent.
        !           760:         *              dev     The device to send the data on.
        !           761:         *
        !           762:         *      This function adds a frame to the Tx list to be sent
        !           763:         *      ASAP.  First it verifies that the adapter is ready and
        !           764:         *      there is room in the queue.  Then it sets up the next
        !           765:         *      available list, copies the frame to the corresponding
        !           766:         *      buffer.  If the adapter Tx channel is idle, it gives
        !           767:         *      the adapter a Tx Go command on the list, otherwise it
        !           768:         *      sets the forward address of the previous list to point
        !           769:         *      to this one.  Then it frees the sk_buff.
        !           770:         *
        !           771:         **************************************************************/
        !           772: 
        !           773: int TLan_StartTx( struct sk_buff *skb, struct device *dev )
        !           774: {
        !           775:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !           776:        TLanList        *tail_list;
        !           777:        u8              *tail_buffer;
        !           778:        int             pad;
        !           779: 
        !           780:        if ( ! priv->phyOnline ) {
        !           781:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  %s PHY is not ready\n", dev->name );
        !           782:                dev_kfree_skb( skb, FREE_WRITE );
        !           783:                return 0;
        !           784:        }
        !           785: 
        !           786:        tail_list = priv->txList + priv->txTail;
        !           787: 
        !           788:        if ( tail_list->cStat != TLAN_CSTAT_UNUSED ) {
        !           789:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  %s is busy (Head=%d Tail=%d)\n", dev->name, priv->txHead, priv->txTail );
        !           790:                dev->tbusy = 1;
        !           791:                priv->txBusyCount++;
        !           792:                return 1;
        !           793:        }
        !           794: 
        !           795:        tail_list->forward = 0;
        !           796: 
        !           797:        if ( bbuf ) {
        !           798:                tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
        !           799:                memcpy( tail_buffer, skb->data, skb->len );
        !           800:        } else {
        !           801:                tail_list->buffer[0].address = virt_to_bus( skb->data );
        !           802:                tail_list->buffer[9].address = (u32) skb;
        !           803:        }
        !           804: 
        !           805:        pad = TLAN_MIN_FRAME_SIZE - skb->len;
        !           806: 
        !           807:        if ( pad > 0 ) {
        !           808:                tail_list->frameSize = (u16) skb->len + pad;
        !           809:                tail_list->buffer[0].count = (u32) skb->len;
        !           810:                tail_list->buffer[1].count = TLAN_LAST_BUFFER | (u32) pad;
        !           811:                tail_list->buffer[1].address = virt_to_bus( TLanPadBuffer );
        !           812:        } else {
        !           813:                tail_list->frameSize = (u16) skb->len;
        !           814:                tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len;
        !           815:                tail_list->buffer[1].count = 0;
        !           816:                tail_list->buffer[1].address = 0;
        !           817:        }
        !           818: 
        !           819:        cli();
        !           820:        tail_list->cStat = TLAN_CSTAT_READY;
        !           821:        if ( ! priv->txInProgress ) {
        !           822:                priv->txInProgress = 1;
        !           823:                outw( 0x4, dev->base_addr + TLAN_HOST_INT );
        !           824:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  Starting TX on buffer %d\n", priv->txTail );
        !           825:                outl( virt_to_bus( tail_list ), dev->base_addr + TLAN_CH_PARM );
        !           826:                outl( TLAN_HC_GO | TLAN_HC_ACK, dev->base_addr + TLAN_HOST_CMD );
        !           827:        } else {
        !           828:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  Adding buffer %d to TX channel\n", priv->txTail );
        !           829:                if ( priv->txTail == 0 ) {
        !           830:                        ( priv->txList + ( TLAN_NUM_TX_LISTS - 1 ) )->forward = virt_to_bus( tail_list );
        !           831:                } else {
        !           832:                        ( priv->txList + ( priv->txTail - 1 ) )->forward = virt_to_bus( tail_list );
        !           833:                }
        !           834:        }
        !           835:        sti();
        !           836: 
        !           837:        CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
        !           838: 
        !           839:        if ( bbuf ) {
        !           840:                dev_kfree_skb( skb, FREE_WRITE );
        !           841:        }
        !           842:                
        !           843:        dev->trans_start = jiffies;
        !           844:        return 0;
        !           845: 
        !           846: } /* TLan_StartTx */
        !           847: 
        !           848: 
        !           849: 
        !           850: 
        !           851:        /***************************************************************
        !           852:         *      TLan_HandleInterrupt
        !           853:         *  
        !           854:         *      Returns:        
        !           855:         *              Nothing
        !           856:         *      Parms:
        !           857:         *              irq     The line on which the interrupt
        !           858:         *                      occurred.
        !           859:         *              dev_id  A pointer to the device assigned to
        !           860:         *                      this irq line.
        !           861:         *              regs    ???
        !           862:         *
        !           863:         *      This function handles an interrupt generated by its
        !           864:         *      assigned TLAN adapter.  The function deactivates
        !           865:         *      interrupts on its adapter, records the type of
        !           866:         *      interrupt, executes the appropriate subhandler, and
        !           867:         *      acknowdges the interrupt to the adapter (thus
        !           868:         *      re-enabling adapter interrupts.
        !           869:         *
        !           870:         **************************************************************/
        !           871: 
        !           872: void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs)
        !           873: {
        !           874:        u32             ack;
        !           875:        struct device   *dev;
        !           876:        u32             host_cmd;
        !           877:        u16             host_int;
        !           878:        int             type;
        !           879: 
        !           880:        dev = (struct device *) dev_id;
        !           881: 
        !           882:        cli();
        !           883:        if ( dev->interrupt ) {
        !           884:                printk( "TLAN:   Re-entering interrupt handler for %s: %d.\n" , dev->name, dev->interrupt );
        !           885:        }
        !           886:        dev->interrupt++;
        !           887: 
        !           888:        host_int = inw( dev->base_addr + TLAN_HOST_INT );
        !           889:        outw( host_int, dev->base_addr + TLAN_HOST_INT );
        !           890: 
        !           891:        type = ( host_int & TLAN_HI_IT_MASK ) >> 2;
        !           892: 
        !           893:        ack = TLanIntVector[type]( dev, host_int );
        !           894: 
        !           895:        if ( ack ) {
        !           896:                host_cmd = TLAN_HC_ACK | ack | ( type << 18 );
        !           897:                outl( host_cmd, dev->base_addr + TLAN_HOST_CMD );
        !           898:        }
        !           899: 
        !           900:        dev->interrupt--;
        !           901:        sti();
        !           902: 
        !           903: } /* TLan_HandleInterrupts */
        !           904: 
        !           905: 
        !           906: 
        !           907: 
        !           908:        /***************************************************************
        !           909:         *      TLan_Close
        !           910:         *  
        !           911:         *      Returns:
        !           912:         *              An error code.
        !           913:         *      Parms:
        !           914:         *              dev     The device structure of the device to
        !           915:         *                      close.
        !           916:         *
        !           917:         *      This function shuts down the adapter.  It records any
        !           918:         *      stats, puts the adapter into reset state, deactivates
        !           919:         *      its time as needed, and frees the irq it is using.
        !           920:         *
        !           921:         **************************************************************/
        !           922: 
        !           923: int TLan_Close(struct device *dev)
        !           924: {
        !           925:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !           926: 
        !           927:        dev->start = 0;
        !           928:        dev->tbusy = 1;
        !           929: 
        !           930:        TLan_ReadAndClearStats( dev, TLAN_RECORD );
        !           931:        outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
        !           932:        if ( priv->timer.function != NULL )
        !           933:                del_timer( &priv->timer );
        !           934:        free_irq( dev->irq, dev );
        !           935:        TLan_FreeLists( dev );
        !           936:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  Device %s closed.\n", dev->name );
        !           937: 
        !           938:        MOD_DEC_USE_COUNT;
        !           939: 
        !           940:        return 0;
        !           941: 
        !           942: } /* TLan_Close */
        !           943: 
        !           944: 
        !           945: 
        !           946: 
        !           947:        /***************************************************************
        !           948:         *      TLan_GetStats
        !           949:         *  
        !           950:         *      Returns:
        !           951:         *              A pointer to the device's statistics structure.
        !           952:         *      Parms:
        !           953:         *              dev     The device structure to return the
        !           954:         *                      stats for.
        !           955:         *
        !           956:         *      This function updates the devices statistics by reading
        !           957:         *      the TLAN chip's onboard registers.  Then it returns the
        !           958:         *      address of the statistics structure.
        !           959:         *
        !           960:         **************************************************************/
        !           961: 
        !           962: struct net_device_stats *TLan_GetStats( struct device *dev )
        !           963: {
        !           964:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !           965:        int i;
        !           966: 
        !           967:        /* Should only read stats if open ? */
        !           968:        TLan_ReadAndClearStats( dev, TLAN_RECORD );
        !           969: 
        !           970:        TLAN_DBG( TLAN_DEBUG_RX, "TLAN RECEIVE:  %s EOC count = %d\n", dev->name, priv->rxEocCount );
        !           971:        TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  %s Busy count = %d\n", dev->name, priv->txBusyCount );
        !           972:        if ( debug & TLAN_DEBUG_GNRL ) {
        !           973:                TLan_PrintDio( dev->base_addr );
        !           974:                TLan_PhyPrint( dev );
        !           975:        }
        !           976:        if ( debug & TLAN_DEBUG_LIST ) {
        !           977:                for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ )
        !           978:                        TLan_PrintList( priv->rxList + i, "RX", i );
        !           979:                for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ )
        !           980:                        TLan_PrintList( priv->txList + i, "TX", i );
        !           981:        }
        !           982:        
        !           983:        return ( &( (TLanPrivateInfo *) dev->priv )->stats );
        !           984: 
        !           985: } /* TLan_GetStats */
        !           986: 
        !           987: 
        !           988: 
        !           989: 
        !           990:        /***************************************************************
        !           991:         *      TLan_SetMulticastList
        !           992:         *  
        !           993:         *      Returns:
        !           994:         *              Nothing
        !           995:         *      Parms:
        !           996:         *              dev     The device structure to set the
        !           997:         *                      multicast list for.
        !           998:         *
        !           999:         *      This function sets the TLAN adaptor to various receive
        !          1000:         *      modes.  If the IFF_PROMISC flag is set, promiscuous
        !          1001:         *      mode is acitviated.  Otherwise, promiscuous mode is
        !          1002:         *      turned off.  If the IFF_ALLMULTI flag is set, then
        !          1003:         *      the hash table is set to receive all group addresses.
        !          1004:         *      Otherwise, the first three multicast addresses are
        !          1005:         *      stored in AREG_1-3, and the rest are selected via the
        !          1006:         *      hash table, as necessary.
        !          1007:         *
        !          1008:         **************************************************************/
        !          1009: 
        !          1010: void TLan_SetMulticastList( struct device *dev )
        !          1011: {      
        !          1012:        struct dev_mc_list      *dmi = dev->mc_list;
        !          1013:        u32                     hash1 = 0;
        !          1014:        u32                     hash2 = 0;
        !          1015:        int                     i;
        !          1016:        u32                     offset;
        !          1017:        u8                      tmp;
        !          1018: 
        !          1019:        if ( dev->flags & IFF_PROMISC ) {
        !          1020:                tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
        !          1021:                TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp | TLAN_NET_CMD_CAF );
        !          1022:        } else {
        !          1023:                tmp = TLan_DioRead8( dev->base_addr, TLAN_NET_CMD );
        !          1024:                TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, tmp & ~TLAN_NET_CMD_CAF );
        !          1025:                if ( dev->flags & IFF_ALLMULTI ) {
        !          1026:                        for ( i = 0; i < 3; i++ ) 
        !          1027:                                TLan_SetMac( dev, i + 1, NULL );
        !          1028:                        TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, 0xFFFFFFFF );
        !          1029:                        TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, 0xFFFFFFFF );
        !          1030:                } else {
        !          1031:                        for ( i = 0; i < dev->mc_count; i++ ) {
        !          1032:                                if ( i < 3 ) {
        !          1033:                                        TLan_SetMac( dev, i + 1, (char *) &dmi->dmi_addr );
        !          1034:                                } else {
        !          1035:                                        offset = TLan_HashFunc( (u8 *) &dmi->dmi_addr );
        !          1036:                                        if ( offset < 32 ) 
        !          1037:                                                hash1 |= ( 1 << offset );
        !          1038:                                        else
        !          1039:                                                hash2 |= ( 1 << ( offset - 32 ) );
        !          1040:                                }
        !          1041:                                dmi = dmi->next;
        !          1042:                        }
        !          1043:                        for ( ; i < 3; i++ ) 
        !          1044:                                TLan_SetMac( dev, i + 1, NULL );
        !          1045:                        TLan_DioWrite32( dev->base_addr, TLAN_HASH_1, hash1 );
        !          1046:                        TLan_DioWrite32( dev->base_addr, TLAN_HASH_2, hash2 );
        !          1047:                }
        !          1048:        }
        !          1049: 
        !          1050: } /* TLan_SetMulticastList */
        !          1051: 
        !          1052: 
        !          1053: 
        !          1054: /*****************************************************************************
        !          1055: ******************************************************************************
        !          1056: 
        !          1057:         ThunderLAN Driver Interrupt Vectors and Table
        !          1058: 
        !          1059:        Please see Chap. 4, "Interrupt Handling" of the "ThunderLAN
        !          1060:        Programmer's Guide" for more informations on handling interrupts
        !          1061:        generated by TLAN based adapters.  
        !          1062: 
        !          1063: ******************************************************************************
        !          1064: *****************************************************************************/
        !          1065: 
        !          1066: 
        !          1067:        /***************************************************************
        !          1068:         *      TLan_HandleInvalid
        !          1069:         *
        !          1070:         *      Returns:
        !          1071:         *              0
        !          1072:         *      Parms:
        !          1073:         *              dev             Device assigned the IRQ that was
        !          1074:         *                              raised.
        !          1075:         *              host_int        The contents of the HOST_INT
        !          1076:         *                              port.
        !          1077:         *
        !          1078:         *      This function handles invalid interrupts.  This should
        !          1079:         *      never happen unless some other adapter is trying to use
        !          1080:         *      the IRQ line assigned to the device.
        !          1081:         *
        !          1082:         **************************************************************/
        !          1083: 
        !          1084: u32 TLan_HandleInvalid( struct device *dev, u16 host_int )
        !          1085: {
        !          1086:        host_int = 0;
        !          1087:        /* printk( "TLAN:  Invalid interrupt on %s.\n", dev->name ); */
        !          1088:        return 0;
        !          1089: 
        !          1090: } /* TLan_HandleInvalid */
        !          1091: 
        !          1092: 
        !          1093: 
        !          1094: 
        !          1095:        /***************************************************************
        !          1096:         *      TLan_HandleTxEOF
        !          1097:         *
        !          1098:         *      Returns:
        !          1099:         *              1
        !          1100:         *      Parms:
        !          1101:         *              dev             Device assigned the IRQ that was
        !          1102:         *                              raised.
        !          1103:         *              host_int        The contents of the HOST_INT
        !          1104:         *                              port.
        !          1105:         *
        !          1106:         *      This function handles Tx EOF interrupts which are raised
        !          1107:         *      by the adapter when it has completed sending the
        !          1108:         *      contents of a buffer.  If detemines which list/buffer
        !          1109:         *      was completed and resets it.  If the buffer was the last
        !          1110:         *      in the channel (EOC), then the function checks to see if
        !          1111:         *      another buffer is ready to send, and if so, sends a Tx
        !          1112:         *      Go command.  Finally, the driver activates/continues the
        !          1113:         *      activity LED.
        !          1114:         *
        !          1115:         **************************************************************/
        !          1116: 
        !          1117: u32 TLan_HandleTxEOF( struct device *dev, u16 host_int )
        !          1118: {
        !          1119:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1120:        int             eoc = 0;
        !          1121:        TLanList        *head_list;
        !          1122:        u32             ack = 1;
        !          1123: 
        !          1124:        TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  Handling TX EOF (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
        !          1125:        host_int = 0;
        !          1126:        head_list = priv->txList + priv->txHead;
        !          1127: 
        !          1128:        if ( ! bbuf ) {
        !          1129:                dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address, FREE_WRITE );
        !          1130:                head_list->buffer[9].address = 0;
        !          1131:        }
        !          1132: 
        !          1133:        if ( head_list->cStat & TLAN_CSTAT_EOC )
        !          1134:                eoc = 1;
        !          1135:        if ( ! head_list->cStat & TLAN_CSTAT_FRM_CMP ) {
        !          1136:                printk( "TLAN:  Received interrupt for uncompleted TX frame.\n" );
        !          1137:        }
        !          1138: 
        !          1139: #if LINUX_KERNEL_VERSION > 0x20100
        !          1140:        priv->stats->tx_bytes += head_list->frameSize;
        !          1141: #endif
        !          1142: 
        !          1143:        head_list->cStat = TLAN_CSTAT_UNUSED;
        !          1144:        dev->tbusy = 0;
        !          1145:        CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS );
        !          1146:        if ( eoc ) {
        !          1147:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
        !          1148:                head_list = priv->txList + priv->txHead;
        !          1149:                if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
        !          1150:                        outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
        !          1151:                        ack |= TLAN_HC_GO;
        !          1152:                } else {
        !          1153:                        priv->txInProgress = 0;
        !          1154:                }
        !          1155:        }
        !          1156: 
        !          1157:        if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
        !          1158:                TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
        !          1159:                if ( priv->timer.function == NULL ) {
        !          1160:                        TLan_SetTimer( dev, TLAN_TIMER_ACT_DELAY, TLAN_TIMER_ACTIVITY );
        !          1161:                } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
        !          1162:                        priv->timerSetAt = jiffies;
        !          1163:                }
        !          1164:        }
        !          1165: 
        !          1166:        return ack;
        !          1167: 
        !          1168: } /* TLan_HandleTxEOF */
        !          1169: 
        !          1170: 
        !          1171: 
        !          1172: 
        !          1173:        /***************************************************************
        !          1174:         *      TLan_HandleStatOverflow
        !          1175:         *
        !          1176:         *      Returns:
        !          1177:         *              1
        !          1178:         *      Parms:
        !          1179:         *              dev             Device assigned the IRQ that was
        !          1180:         *                              raised.
        !          1181:         *              host_int        The contents of the HOST_INT
        !          1182:         *                              port.
        !          1183:         *
        !          1184:         *      This function handles the Statistics Overflow interrupt
        !          1185:         *      which means that one or more of the TLAN statistics
        !          1186:         *      registers has reached 1/2 capacity and needs to be read.
        !          1187:         *
        !          1188:         **************************************************************/
        !          1189: 
        !          1190: u32 TLan_HandleStatOverflow( struct device *dev, u16 host_int )
        !          1191: {
        !          1192:        host_int = 0;
        !          1193:        TLan_ReadAndClearStats( dev, TLAN_RECORD );
        !          1194: 
        !          1195:        return 1;
        !          1196: 
        !          1197: } /* TLan_HandleStatOverflow */
        !          1198: 
        !          1199: 
        !          1200: 
        !          1201: 
        !          1202:        /***************************************************************
        !          1203:         *      TLan_HandleRxEOF
        !          1204:         *
        !          1205:         *      Returns:
        !          1206:         *              1
        !          1207:         *      Parms:
        !          1208:         *              dev             Device assigned the IRQ that was
        !          1209:         *                              raised.
        !          1210:         *              host_int        The contents of the HOST_INT
        !          1211:         *                              port.
        !          1212:         *
        !          1213:         *      This function handles the Rx EOF interrupt which
        !          1214:         *      indicates a frame has been received by the adapter from
        !          1215:         *      the net and the frame has been transferred to memory.
        !          1216:         *      The function determines the bounce buffer the frame has
        !          1217:         *      been loaded into, creates a new sk_buff big enough to
        !          1218:         *      hold the frame, and sends it to protocol stack.  It
        !          1219:         *      then resets the used buffer and appends it to the end
        !          1220:         *      of the list.  If the frame was the last in the Rx
        !          1221:         *      channel (EOC), the function restarts the receive channel
        !          1222:         *      by sending an Rx Go command to the adapter.  Then it
        !          1223:         *      activates/continues the activity LED.
        !          1224:         *
        !          1225:         **************************************************************/
        !          1226: 
        !          1227: u32 TLan_HandleRxEOF( struct device *dev, u16 host_int )
        !          1228: {
        !          1229:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1230:        u32             ack = 1;
        !          1231:        int             eoc = 0;
        !          1232:        u8              *head_buffer;
        !          1233:        TLanList        *head_list;
        !          1234:        struct sk_buff  *skb;
        !          1235:        TLanList        *tail_list;
        !          1236:        void            *t;
        !          1237: 
        !          1238:        TLAN_DBG( TLAN_DEBUG_RX, "TLAN RECEIVE:  Handling RX EOF (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
        !          1239:        host_int = 0;
        !          1240:        head_list = priv->rxList + priv->rxHead;
        !          1241:        tail_list = priv->rxList + priv->rxTail;
        !          1242: 
        !          1243:        if ( head_list->cStat & TLAN_CSTAT_EOC ) {
        !          1244:                eoc = 1;
        !          1245:        }
        !          1246: 
        !          1247:        if ( ! head_list->cStat & TLAN_CSTAT_FRM_CMP ) {
        !          1248:                printk( "TLAN:  Received interrupt for uncompleted RX frame.\n" );
        !          1249:        } else if ( bbuf ) {
        !          1250:                skb = dev_alloc_skb( head_list->frameSize + 7 );
        !          1251:                if ( skb == NULL ) { 
        !          1252:                        printk( "TLAN:  Couldn't allocate memory for received data.\n" );
        !          1253:                } else {
        !          1254:                        head_buffer = priv->rxBuffer + ( priv->rxHead * TLAN_MAX_FRAME_SIZE );
        !          1255:                        skb->dev = dev;
        !          1256:                        skb_reserve( skb, 2 );
        !          1257:                        t = (void *) skb_put( skb, head_list->frameSize );
        !          1258: 
        !          1259: #if LINUX_KERNEL_VERSION > 0x20100
        !          1260:                        priv->stats->rx_bytes += head_list->frameSize;
        !          1261: #endif
        !          1262: 
        !          1263:                        memcpy( t, head_buffer, head_list->frameSize );
        !          1264:                        skb->protocol = eth_type_trans( skb, dev );
        !          1265:                        netif_rx( skb );
        !          1266:                }
        !          1267:        } else {
        !          1268:                skb = (struct sk_buff *) head_list->buffer[9].address;
        !          1269:                head_list->buffer[9].address = 0;
        !          1270:                skb_trim( skb, head_list->frameSize );
        !          1271: 
        !          1272: #if LINUX_KERNEL_VERSION > 0x20100
        !          1273:                        priv->stats->rx_bytes += head_list->frameSize;
        !          1274: #endif
        !          1275: 
        !          1276:                skb->protocol = eth_type_trans( skb, dev );
        !          1277:                netif_rx( skb );
        !          1278: 
        !          1279:                skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
        !          1280:                if ( skb == NULL ) {
        !          1281:                        printk( "TLAN:  Couldn't allocate memory for received data.\n" );
        !          1282:                        /* If this ever happened it would be a problem */
        !          1283:                } else {
        !          1284:                        skb->dev = dev;
        !          1285:                        skb_reserve( skb, 2 );
        !          1286:                        t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
        !          1287:                        head_list->buffer[0].address = virt_to_bus( t );
        !          1288:                        head_list->buffer[9].address = (u32) skb;
        !          1289:                }
        !          1290:        }
        !          1291: 
        !          1292:        head_list->forward = 0;
        !          1293:        head_list->frameSize = TLAN_MAX_FRAME_SIZE;
        !          1294:        head_list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
        !          1295:        tail_list->forward = virt_to_bus( head_list );
        !          1296: 
        !          1297:        CIRC_INC( priv->rxHead, TLAN_NUM_RX_LISTS );
        !          1298:        CIRC_INC( priv->rxTail, TLAN_NUM_RX_LISTS );
        !          1299: 
        !          1300:        if ( eoc ) { 
        !          1301:                TLAN_DBG( TLAN_DEBUG_RX, "TLAN RECEIVE:  Handling RX EOC (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
        !          1302:                head_list = priv->rxList + priv->rxHead;
        !          1303:                outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
        !          1304:                ack |= TLAN_HC_GO | TLAN_HC_RT;
        !          1305:                priv->rxEocCount++;
        !          1306:        }
        !          1307: 
        !          1308:        if ( priv->adapter->flags & TLAN_ADAPTER_ACTIVITY_LED ) {
        !          1309:                TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK | TLAN_LED_ACT );
        !          1310:                if ( priv->timer.function == NULL )  {
        !          1311:                        TLan_SetTimer( dev, TLAN_TIMER_ACT_DELAY, TLAN_TIMER_ACTIVITY );
        !          1312:                } else if ( priv->timerType == TLAN_TIMER_ACTIVITY ) {
        !          1313:                        priv->timerSetAt = jiffies;
        !          1314:                }
        !          1315:        }
        !          1316: 
        !          1317:        dev->last_rx = jiffies;
        !          1318: 
        !          1319:        return ack;
        !          1320: 
        !          1321: } /* TLan_HandleRxEOF */
        !          1322: 
        !          1323: 
        !          1324: 
        !          1325: 
        !          1326:        /***************************************************************
        !          1327:         *      TLan_HandleDummy
        !          1328:         *
        !          1329:         *      Returns:
        !          1330:         *              1
        !          1331:         *      Parms:
        !          1332:         *              dev             Device assigned the IRQ that was
        !          1333:         *                              raised.
        !          1334:         *              host_int        The contents of the HOST_INT
        !          1335:         *                              port.
        !          1336:         *
        !          1337:         *      This function handles the Dummy interrupt, which is
        !          1338:         *      raised whenever a test interrupt is generated by setting
        !          1339:         *      the Req_Int bit of HOST_CMD to 1.
        !          1340:         *
        !          1341:         **************************************************************/
        !          1342: 
        !          1343: u32 TLan_HandleDummy( struct device *dev, u16 host_int )
        !          1344: {
        !          1345:        host_int = 0;
        !          1346:        printk( "TLAN:  Test interrupt on %s.\n", dev->name );
        !          1347:        return 1;
        !          1348: 
        !          1349: } /* TLan_HandleDummy */
        !          1350: 
        !          1351: 
        !          1352: 
        !          1353: 
        !          1354:        /***************************************************************
        !          1355:         *      TLan_HandleTxEOC
        !          1356:         *
        !          1357:         *      Returns:
        !          1358:         *              1
        !          1359:         *      Parms:
        !          1360:         *              dev             Device assigned the IRQ that was
        !          1361:         *                              raised.
        !          1362:         *              host_int        The contents of the HOST_INT
        !          1363:         *                              port.
        !          1364:         *
        !          1365:         *      This driver is structured to determine EOC occurances by
        !          1366:         *      reading the CSTAT member of the list structure.  Tx EOC
        !          1367:         *      interrupts are disabled via the DIO INTDIS register.
        !          1368:         *      However, TLAN chips before revision 3.0 didn't have this
        !          1369:         *      functionality, so process EOC events if this is the
        !          1370:         *      case.
        !          1371:         *
        !          1372:         **************************************************************/
        !          1373: 
        !          1374: u32 TLan_HandleTxEOC( struct device *dev, u16 host_int )
        !          1375: {
        !          1376:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1377:        TLanList                *head_list;
        !          1378:        u32                             ack = 1;
        !          1379: 
        !          1380:        host_int = 0;
        !          1381:        if ( priv->tlanRev < 0x30 ) {
        !          1382:                TLAN_DBG( TLAN_DEBUG_TX, "TLAN TRANSMIT:  Handling TX EOC (Head=%d Tail=%d) -- IRQ\n", priv->txHead, priv->txTail );
        !          1383:                head_list = priv->txList + priv->txHead;
        !          1384:                if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
        !          1385:                        outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
        !          1386:                        ack |= TLAN_HC_GO;
        !          1387:                } else {
        !          1388:                        priv->txInProgress = 0;
        !          1389:                }
        !          1390:        }
        !          1391: 
        !          1392:        return ack;
        !          1393: 
        !          1394: } /* TLan_HandleTxEOC */
        !          1395: 
        !          1396: 
        !          1397: 
        !          1398: 
        !          1399:        /***************************************************************
        !          1400:         *      TLan_HandleStatusCheck
        !          1401:         *
        !          1402:         *      Returns:
        !          1403:         *              0 if Adapter check, 1 if Network Status check.
        !          1404:         *      Parms:
        !          1405:         *              dev             Device assigned the IRQ that was
        !          1406:         *                              raised.
        !          1407:         *              host_int        The contents of the HOST_INT
        !          1408:         *                              port.
        !          1409:         *
        !          1410:         *      This function handles Adapter Check/Network Status
        !          1411:         *      interrupts generated by the adapter.  It checks the
        !          1412:         *      vector in the HOST_INT register to determine if it is
        !          1413:         *      an Adapter Check interrupt.  If so, it resets the
        !          1414:         *      adapter.  Otherwise it clears the status registers
        !          1415:         *      and services the PHY.
        !          1416:         *
        !          1417:         **************************************************************/
        !          1418: 
        !          1419: u32 TLan_HandleStatusCheck( struct device *dev, u16 host_int )
        !          1420: {      
        !          1421:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1422:        u32             ack;
        !          1423:        u32             error;
        !          1424:        u8              net_sts;
        !          1425:        u32             phy;
        !          1426:        u16             tlphy_ctl;
        !          1427:        u16             tlphy_sts;
        !          1428:        
        !          1429:        ack = 1;
        !          1430:        if ( host_int & TLAN_HI_IV_MASK ) {
        !          1431:                error = inl( dev->base_addr + TLAN_CH_PARM );
        !          1432:                printk( "TLAN:  %s: Adaptor Error = 0x%x\n", dev->name, error );
        !          1433:                TLan_ReadAndClearStats( dev, TLAN_RECORD );
        !          1434:                outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
        !          1435:                TLan_FreeLists( dev );
        !          1436:                TLan_ResetLists( dev );
        !          1437:                TLan_ResetAdapter( dev );
        !          1438:                dev->tbusy = 0;
        !          1439:                ack = 0;
        !          1440:        } else {
        !          1441:                TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Status Check\n", dev->name );
        !          1442:                phy = priv->phy[priv->phyNum];
        !          1443: 
        !          1444:                net_sts = TLan_DioRead8( dev->base_addr, TLAN_NET_STS );
        !          1445:                if ( net_sts ) {
        !          1446:                        TLan_DioWrite8( dev->base_addr, TLAN_NET_STS, net_sts );
        !          1447:                        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s:    Net_Sts = %x\n", dev->name, (unsigned) net_sts );
        !          1448:                }
        !          1449:                if ( ( net_sts & TLAN_NET_STS_MIRQ ) &&  ( priv->phyNum == 0 ) ) {
        !          1450:                        TLan_MiiReadReg( dev, phy, TLAN_TLPHY_STS, &tlphy_sts );
        !          1451:                        TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
        !          1452:                        if ( ! ( tlphy_sts & TLAN_TS_POLOK ) && ! ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
        !          1453:                                tlphy_ctl |= TLAN_TC_SWAPOL;
        !          1454:                                TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
        !          1455:                        } else if ( ( tlphy_sts & TLAN_TS_POLOK ) && ( tlphy_ctl & TLAN_TC_SWAPOL ) ) {
        !          1456:                                tlphy_ctl &= ~TLAN_TC_SWAPOL;
        !          1457:                                TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl);
        !          1458:                        }
        !          1459: 
        !          1460:                        if (debug) {
        !          1461:                                TLan_PhyPrint( dev );
        !          1462:                        }
        !          1463:                }
        !          1464:        }
        !          1465: 
        !          1466:        return ack;
        !          1467: 
        !          1468: } /* TLan_HandleStatusCheck */
        !          1469: 
        !          1470: 
        !          1471: 
        !          1472: 
        !          1473:        /***************************************************************
        !          1474:         *      TLan_HandleRxEOC
        !          1475:         *
        !          1476:         *      Returns:
        !          1477:         *              1
        !          1478:         *      Parms:
        !          1479:         *              dev             Device assigned the IRQ that was
        !          1480:         *                              raised.
        !          1481:         *              host_int        The contents of the HOST_INT
        !          1482:         *                              port.
        !          1483:         *
        !          1484:         *      This driver is structured to determine EOC occurances by
        !          1485:         *      reading the CSTAT member of the list structure.  Rx EOC
        !          1486:         *      interrupts are disabled via the DIO INTDIS register.
        !          1487:         *      However, TLAN chips before revision 3.0 didn't have this
        !          1488:         *      CSTAT member or a INTDIS register, so if this chip is
        !          1489:         *      pre-3.0, process EOC interrupts normally.
        !          1490:         *
        !          1491:         **************************************************************/
        !          1492: 
        !          1493: u32 TLan_HandleRxEOC( struct device *dev, u16 host_int )
        !          1494: {
        !          1495:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1496:        TLanList        *head_list;
        !          1497:        u32             ack = 1;
        !          1498: 
        !          1499:        host_int = 0;
        !          1500:        if (  priv->tlanRev < 0x30 ) {
        !          1501:                TLAN_DBG( TLAN_DEBUG_RX, "TLAN RECEIVE:  Handling RX EOC (Head=%d Tail=%d) -- IRQ\n", priv->rxHead, priv->rxTail );
        !          1502:                head_list = priv->rxList + priv->rxHead;
        !          1503:                outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
        !          1504:                ack |= TLAN_HC_GO | TLAN_HC_RT;
        !          1505:                priv->rxEocCount++;
        !          1506:        }
        !          1507: 
        !          1508:        return ack;
        !          1509: 
        !          1510: } /* TLan_HandleRxEOC */
        !          1511: 
        !          1512: 
        !          1513: 
        !          1514: 
        !          1515: /*****************************************************************************
        !          1516: ******************************************************************************
        !          1517: 
        !          1518:        ThunderLAN Driver Timer Function
        !          1519: 
        !          1520: ******************************************************************************
        !          1521: *****************************************************************************/
        !          1522: 
        !          1523: 
        !          1524:        /***************************************************************
        !          1525:         *      TLan_Timer
        !          1526:         *
        !          1527:         *      Returns:
        !          1528:         *              Nothing
        !          1529:         *      Parms:
        !          1530:         *              data    A value given to add timer when
        !          1531:         *                      add_timer was called.
        !          1532:         *
        !          1533:         *      This function handles timed functionality for the
        !          1534:         *      TLAN driver.  The two current timer uses are for
        !          1535:         *      delaying for autonegotionation and driving the ACT LED.
        !          1536:         *      -       Autonegotiation requires being allowed about
        !          1537:         *              2 1/2 seconds before attempting to transmit a
        !          1538:         *              packet.  It would be a very bad thing to hang
        !          1539:         *              the kernel this long, so the driver doesn't
        !          1540:         *              allow transmission 'til after this time, for
        !          1541:         *              certain PHYs.  It would be much nicer if all
        !          1542:         *              PHYs were interrupt-capable like the internal
        !          1543:         *              PHY.
        !          1544:         *      -       The ACT LED, which shows adapter activity, is
        !          1545:         *              driven by the driver, and so must be left on
        !          1546:         *              for a short period to power up the LED so it
        !          1547:         *              can be seen.  This delay can be changed by
        !          1548:         *              changing the TLAN_TIMER_ACT_DELAY in tlan.h,
        !          1549:         *              if desired.  10 jiffies produces a slightly
        !          1550:         *              sluggish response.
        !          1551:         *
        !          1552:         **************************************************************/
        !          1553: 
        !          1554: void TLan_Timer( unsigned long data )
        !          1555: {
        !          1556:        struct device   *dev = (struct device *) data;
        !          1557:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1558:        u32             elapsed;
        !          1559: 
        !          1560:        priv->timer.function = NULL;
        !          1561: 
        !          1562:        switch ( priv->timerType ) {
        !          1563:                case TLAN_TIMER_PHY_PDOWN:
        !          1564:                        TLan_PhyPowerDown( dev );
        !          1565:                        break;
        !          1566:                case TLAN_TIMER_PHY_PUP:
        !          1567:                        TLan_PhyPowerUp( dev );
        !          1568:                        break;
        !          1569:                case TLAN_TIMER_PHY_RESET:
        !          1570:                        TLan_PhyReset( dev );
        !          1571:                        break;
        !          1572:                case TLAN_TIMER_PHY_START_LINK:
        !          1573:                        TLan_PhyStartLink( dev );
        !          1574:                        break;
        !          1575:                case TLAN_TIMER_PHY_FINISH_AN:
        !          1576:                        TLan_PhyFinishAutoNeg( dev );
        !          1577:                        break;
        !          1578:                case TLAN_TIMER_FINISH_RESET:
        !          1579:                        TLan_FinishReset( dev );
        !          1580:                        break;
        !          1581:                case TLAN_TIMER_ACTIVITY:
        !          1582:                        cli();
        !          1583:                        if ( priv->timer.function == NULL ) {
        !          1584:                                elapsed = jiffies - priv->timerSetAt;
        !          1585:                                if ( elapsed >= TLAN_TIMER_ACT_DELAY ) {
        !          1586:                                        TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
        !          1587:                                } else  {
        !          1588:                                        priv->timer.function = &TLan_Timer;
        !          1589:                                        priv->timer.expires = priv->timerSetAt + TLAN_TIMER_ACT_DELAY;
        !          1590:                                        sti();
        !          1591:                                        add_timer( &priv->timer );
        !          1592:                                }
        !          1593:                        }
        !          1594:                        sti();
        !          1595:                        break;
        !          1596:                default:
        !          1597:                        break;
        !          1598:        }
        !          1599: 
        !          1600: } /* TLan_Timer */
        !          1601: 
        !          1602: 
        !          1603: 
        !          1604: 
        !          1605: /*****************************************************************************
        !          1606: ******************************************************************************
        !          1607: 
        !          1608:        ThunderLAN Driver Adapter Related Routines
        !          1609: 
        !          1610: ******************************************************************************
        !          1611: *****************************************************************************/
        !          1612: 
        !          1613: 
        !          1614:        /***************************************************************
        !          1615:         *      TLan_ResetLists
        !          1616:         *  
        !          1617:         *      Returns:
        !          1618:         *              Nothing
        !          1619:         *      Parms:
        !          1620:         *              dev     The device structure with the list
        !          1621:         *                      stuctures to be reset.
        !          1622:         *
        !          1623:         *      This routine sets the variables associated with managing
        !          1624:         *      the TLAN lists to their initial values.
        !          1625:         *
        !          1626:         **************************************************************/
        !          1627: 
        !          1628: void TLan_ResetLists( struct device *dev )
        !          1629: {
        !          1630:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1631:        int             i;
        !          1632:        TLanList        *list;
        !          1633:        struct sk_buff  *skb;
        !          1634:        void            *t = NULL;
        !          1635: 
        !          1636:        priv->txHead = 0;
        !          1637:        priv->txTail = 0;
        !          1638:        for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
        !          1639:                list = priv->txList + i;
        !          1640:                list->cStat = TLAN_CSTAT_UNUSED;
        !          1641:                if ( bbuf ) {
        !          1642:                        list->buffer[0].address = virt_to_bus( priv->txBuffer + ( i * TLAN_MAX_FRAME_SIZE ) );
        !          1643:                } else {
        !          1644:                        list->buffer[0].address = 0;
        !          1645:                }
        !          1646:                list->buffer[2].count = 0;
        !          1647:                list->buffer[2].address = 0;
        !          1648:        }
        !          1649: 
        !          1650:        priv->rxHead = 0;
        !          1651:        priv->rxTail = TLAN_NUM_RX_LISTS - 1;
        !          1652:        for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
        !          1653:                list = priv->rxList + i;
        !          1654:                list->cStat = TLAN_CSTAT_READY;
        !          1655:                list->frameSize = TLAN_MAX_FRAME_SIZE;
        !          1656:                list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
        !          1657:                if ( bbuf ) {
        !          1658:                        list->buffer[0].address = virt_to_bus( priv->rxBuffer + ( i * TLAN_MAX_FRAME_SIZE ) );
        !          1659:                } else {
        !          1660:                        skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
        !          1661:                        if ( skb == NULL ) {
        !          1662:                                printk( "TLAN:  Couldn't allocate memory for received data.\n" );
        !          1663:                                /* If this ever happened it would be a problem */
        !          1664:                        } else {
        !          1665:                                skb->dev = dev;
        !          1666:                                skb_reserve( skb, 2 );
        !          1667:                                t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
        !          1668:                        }
        !          1669:                        list->buffer[0].address = virt_to_bus( t );
        !          1670:                        list->buffer[9].address = (u32) skb;
        !          1671:                }
        !          1672:                list->buffer[1].count = 0;
        !          1673:                list->buffer[1].address = 0;
        !          1674:                if ( i < TLAN_NUM_RX_LISTS - 1 )
        !          1675:                        list->forward = virt_to_bus( list + 1 );
        !          1676:                else
        !          1677:                        list->forward = 0;
        !          1678:        }
        !          1679: 
        !          1680: } /* TLan_ResetLists */
        !          1681: 
        !          1682: 
        !          1683: void TLan_FreeLists( struct device *dev )
        !          1684: {
        !          1685:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1686:        int             i;
        !          1687:        TLanList        *list;
        !          1688:        struct sk_buff  *skb;
        !          1689: 
        !          1690:        if ( ! bbuf ) {
        !          1691:                for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
        !          1692:                        list = priv->txList + i;
        !          1693:                        skb = (struct sk_buff *) list->buffer[9].address;
        !          1694:                        if ( skb ) {
        !          1695:                                dev_kfree_skb( skb, FREE_WRITE );
        !          1696:                                list->buffer[9].address = 0;
        !          1697:                        }
        !          1698:                }
        !          1699: 
        !          1700:                for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
        !          1701:                        list = priv->rxList + i;
        !          1702:                        skb = (struct sk_buff *) list->buffer[9].address;
        !          1703:                        if ( skb ) {
        !          1704:                                dev_kfree_skb( skb, FREE_READ );
        !          1705:                                list->buffer[9].address = 0;
        !          1706:                        }
        !          1707:                }
        !          1708:        }
        !          1709: 
        !          1710: } /* TLan_FreeLists */
        !          1711: 
        !          1712: 
        !          1713: 
        !          1714: 
        !          1715:        /***************************************************************
        !          1716:         *      TLan_PrintDio
        !          1717:         *  
        !          1718:         *      Returns:
        !          1719:         *              Nothing
        !          1720:         *      Parms:
        !          1721:         *              io_base         Base IO port of the device of
        !          1722:         *                              which to print DIO registers.
        !          1723:         *
        !          1724:         *      This function prints out all the internal (DIO)
        !          1725:         *      registers of a TLAN chip.
        !          1726:         *
        !          1727:         **************************************************************/
        !          1728: 
        !          1729: void TLan_PrintDio( u16 io_base )
        !          1730: {
        !          1731:        u32 data0, data1;
        !          1732:        int     i;
        !          1733: 
        !          1734:        printk( "TLAN:   Contents of internal registers for io base 0x%04hx.\n", io_base );
        !          1735:        printk( "TLAN:      Off.  +0         +4\n" );
        !          1736:        for ( i = 0; i < 0x4C; i+= 8 ) {
        !          1737:                data0 = TLan_DioRead32( io_base, i );
        !          1738:                data1 = TLan_DioRead32( io_base, i + 0x4 );
        !          1739:                printk( "TLAN:      0x%02x  0x%08x 0x%08x\n", i, data0, data1 );
        !          1740:        }
        !          1741: 
        !          1742: } /* TLan_PrintDio */
        !          1743: 
        !          1744: 
        !          1745: 
        !          1746: 
        !          1747:        /***************************************************************
        !          1748:         *      TLan_PrintList
        !          1749:         *  
        !          1750:         *      Returns:
        !          1751:         *              Nothing
        !          1752:         *      Parms:
        !          1753:         *              list    A pointer to the TLanList structure to
        !          1754:         *                      be printed.
        !          1755:         *              type    A string to designate type of list,
        !          1756:         *                      "Rx" or "Tx".
        !          1757:         *              num     The index of the list.
        !          1758:         *
        !          1759:         *      This function prints out the contents of the list
        !          1760:         *      pointed to by the list parameter.
        !          1761:         *
        !          1762:         **************************************************************/
        !          1763: 
        !          1764: void TLan_PrintList( TLanList *list, char *type, int num)
        !          1765: {
        !          1766:        int i;
        !          1767: 
        !          1768:        printk( "TLAN:   %s List %d at 0x%08x\n", type, num, (u32) list );
        !          1769:        printk( "TLAN:      Forward    = 0x%08x\n",  list->forward );
        !          1770:        printk( "TLAN:      CSTAT      = 0x%04hx\n", list->cStat );
        !          1771:        printk( "TLAN:      Frame Size = 0x%04hx\n", list->frameSize );
        !          1772:        /* for ( i = 0; i < 10; i++ ) { */
        !          1773:        for ( i = 0; i < 2; i++ ) {
        !          1774:                printk( "TLAN:      Buffer[%d].count, addr = 0x%08x, 0x%08x\n", i, list->buffer[i].count, list->buffer[i].address );
        !          1775:        }
        !          1776: 
        !          1777: } /* TLan_PrintList */
        !          1778: 
        !          1779: 
        !          1780: 
        !          1781: 
        !          1782:        /***************************************************************
        !          1783:         *      TLan_ReadAndClearStats
        !          1784:         *
        !          1785:         *      Returns:
        !          1786:         *              Nothing
        !          1787:         *      Parms:
        !          1788:         *              dev     Pointer to device structure of adapter
        !          1789:         *                      to which to read stats.
        !          1790:         *              record  Flag indicating whether to add 
        !          1791:         *
        !          1792:         *      This functions reads all the internal status registers
        !          1793:         *      of the TLAN chip, which clears them as a side effect.
        !          1794:         *      It then either adds the values to the device's status
        !          1795:         *      struct, or discards them, depending on whether record
        !          1796:         *      is TLAN_RECORD (!=0)  or TLAN_IGNORE (==0).
        !          1797:         *
        !          1798:         **************************************************************/
        !          1799: 
        !          1800: void TLan_ReadAndClearStats( struct device *dev, int record )
        !          1801: {
        !          1802:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1803:        u32             tx_good, tx_under;
        !          1804:        u32             rx_good, rx_over;
        !          1805:        u32             def_tx, crc, code;
        !          1806:        u32             multi_col, single_col;
        !          1807:        u32             excess_col, late_col, loss;
        !          1808: 
        !          1809:        outw( TLAN_GOOD_TX_FRMS, dev->base_addr + TLAN_DIO_ADR );
        !          1810:        tx_good  = inb( dev->base_addr + TLAN_DIO_DATA );
        !          1811:        tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
        !          1812:        tx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
        !          1813:        tx_under = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
        !          1814: 
        !          1815:        outw( TLAN_GOOD_RX_FRMS, dev->base_addr + TLAN_DIO_ADR );
        !          1816:        rx_good  = inb( dev->base_addr + TLAN_DIO_DATA );
        !          1817:        rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
        !          1818:        rx_good += inb( dev->base_addr + TLAN_DIO_DATA + 2 ) << 16;
        !          1819:        rx_over  = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
        !          1820:                
        !          1821:        outw( TLAN_DEFERRED_TX, dev->base_addr + TLAN_DIO_ADR );
        !          1822:        def_tx  = inb( dev->base_addr + TLAN_DIO_DATA );
        !          1823:        def_tx += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
        !          1824:        crc     = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
        !          1825:        code    = inb( dev->base_addr + TLAN_DIO_DATA + 3 );
        !          1826:        
        !          1827:        outw( TLAN_MULTICOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
        !          1828:        multi_col   = inb( dev->base_addr + TLAN_DIO_DATA );
        !          1829:        multi_col  += inb( dev->base_addr + TLAN_DIO_DATA + 1 ) << 8;
        !          1830:        single_col  = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
        !          1831:        single_col += inb( dev->base_addr + TLAN_DIO_DATA + 3 ) << 8;
        !          1832: 
        !          1833:        outw( TLAN_EXCESSCOL_FRMS, dev->base_addr + TLAN_DIO_ADR );
        !          1834:        excess_col = inb( dev->base_addr + TLAN_DIO_DATA );
        !          1835:        late_col   = inb( dev->base_addr + TLAN_DIO_DATA + 1 );
        !          1836:        loss       = inb( dev->base_addr + TLAN_DIO_DATA + 2 );
        !          1837: 
        !          1838:        if ( record ) {
        !          1839:                priv->stats.rx_packets += rx_good;
        !          1840:                priv->stats.rx_errors  += rx_over + crc + code;
        !          1841:                priv->stats.tx_packets += tx_good;
        !          1842:                priv->stats.tx_errors  += tx_under + loss;
        !          1843:                priv->stats.collisions += multi_col + single_col + excess_col + late_col;
        !          1844: 
        !          1845:                priv->stats.rx_over_errors    += rx_over;
        !          1846:                priv->stats.rx_crc_errors     += crc;
        !          1847:                priv->stats.rx_frame_errors   += code;
        !          1848: 
        !          1849:                priv->stats.tx_aborted_errors += tx_under;
        !          1850:                priv->stats.tx_carrier_errors += loss;
        !          1851:        }
        !          1852:                        
        !          1853: } /* TLan_ReadAndClearStats */
        !          1854: 
        !          1855: 
        !          1856: 
        !          1857: 
        !          1858:        /***************************************************************
        !          1859:         *      TLan_Reset
        !          1860:         *
        !          1861:         *      Returns:
        !          1862:         *              0
        !          1863:         *      Parms:
        !          1864:         *              dev     Pointer to device structure of adapter
        !          1865:         *                      to be reset.
        !          1866:         *
        !          1867:         *      This function resets the adapter and it's physical
        !          1868:         *      device.  See Chap. 3, pp. 9-10 of the "ThunderLAN
        !          1869:         *      Programmer's Guide" for details.  The routine tries to
        !          1870:         *      implement what is detailed there, though adjustments
        !          1871:         *      have been made.
        !          1872:         *
        !          1873:         **************************************************************/
        !          1874: 
        !          1875: void
        !          1876: TLan_ResetAdapter( struct device *dev )
        !          1877: {
        !          1878:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1879:        int             i;
        !          1880:        u32             addr;
        !          1881:        u32             data;
        !          1882:        u8              data8;
        !          1883: 
        !          1884:        priv->tlanFullDuplex = FALSE;
        !          1885: /*  1. Assert reset bit. */
        !          1886: 
        !          1887:        data = inl(dev->base_addr + TLAN_HOST_CMD);
        !          1888:        data |= TLAN_HC_AD_RST;
        !          1889:        outl(data, dev->base_addr + TLAN_HOST_CMD);
        !          1890:        
        !          1891:        udelay(1000);
        !          1892: 
        !          1893: /*  2. Turn off interrupts. ( Probably isn't necessary ) */
        !          1894: 
        !          1895:        data = inl(dev->base_addr + TLAN_HOST_CMD);
        !          1896:        data |= TLAN_HC_INT_OFF;
        !          1897:        outl(data, dev->base_addr + TLAN_HOST_CMD);
        !          1898: 
        !          1899: /*  3. Clear AREGs and HASHs. */
        !          1900: 
        !          1901:        for ( i = TLAN_AREG_0; i <= TLAN_HASH_2; i += 4 ) {
        !          1902:                TLan_DioWrite32( dev->base_addr, (u16) i, 0 );
        !          1903:        }
        !          1904: 
        !          1905: /*  4. Setup NetConfig register. */
        !          1906: 
        !          1907:        data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
        !          1908:        TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
        !          1909: 
        !          1910: /*  5. Load Ld_Tmr and Ld_Thr in HOST_CMD. */
        !          1911: 
        !          1912:        outl( TLAN_HC_LD_TMR | 0x0, dev->base_addr + TLAN_HOST_CMD );
        !          1913:        outl( TLAN_HC_LD_THR | 0x1, dev->base_addr + TLAN_HOST_CMD );
        !          1914: 
        !          1915: /*  6. Unreset the MII by setting NMRST (in NetSio) to 1. */
        !          1916: 
        !          1917:        outw( TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR );
        !          1918:        addr = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          1919:        TLan_SetBit( TLAN_NET_SIO_NMRST, addr );
        !          1920: 
        !          1921: /*  7. Setup the remaining registers. */
        !          1922: 
        !          1923:        if ( priv->tlanRev >= 0x30 ) {
        !          1924:                data8 = TLAN_ID_TX_EOC | TLAN_ID_RX_EOC;
        !          1925:                TLan_DioWrite8( dev->base_addr, TLAN_INT_DIS, data8 );
        !          1926:        }
        !          1927:        TLan_PhyDetect( dev );
        !          1928:        data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN;
        !          1929:        if ( priv->adapter->flags & TLAN_ADAPTER_BIT_RATE_PHY ) {
        !          1930:                data |= TLAN_NET_CFG_BIT;
        !          1931:                if ( priv->aui == 1 ) {
        !          1932:                        TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x0a );
        !          1933:                } else if ( priv->duplex == TLAN_DUPLEX_FULL ) {
        !          1934:                        TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x00 );
        !          1935:                        priv->tlanFullDuplex = TRUE;
        !          1936:                } else {
        !          1937:                        TLan_DioWrite8( dev->base_addr, TLAN_ACOMMIT, 0x08 );
        !          1938:                }
        !          1939:        }
        !          1940:        if ( priv->phyNum == 0 ) {
        !          1941:                data |= TLAN_NET_CFG_PHY_EN;
        !          1942:        }
        !          1943:        TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, (u16) data );
        !          1944: 
        !          1945:        if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
        !          1946:                TLan_FinishReset( dev );
        !          1947:        } else {
        !          1948:                TLan_PhyPowerDown( dev );
        !          1949:        }
        !          1950: 
        !          1951: } /* TLan_ResetAdapter */
        !          1952: 
        !          1953: 
        !          1954: 
        !          1955: 
        !          1956: void
        !          1957: TLan_FinishReset( struct device *dev )
        !          1958: {
        !          1959:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          1960:        u8              data;
        !          1961:        u32             phy;
        !          1962:        u8              sio;
        !          1963:        u16             status;
        !          1964:        u16             tlphy_ctl;
        !          1965: 
        !          1966:        phy = priv->phy[priv->phyNum];
        !          1967: 
        !          1968:        data = TLAN_NET_CMD_NRESET | TLAN_NET_CMD_NWRAP;
        !          1969:        if ( priv->tlanFullDuplex ) {
        !          1970:                data |= TLAN_NET_CMD_DUPLEX;
        !          1971:        }
        !          1972:        TLan_DioWrite8( dev->base_addr, TLAN_NET_CMD, data );
        !          1973:        data = TLAN_NET_MASK_MASK4 | TLAN_NET_MASK_MASK5; 
        !          1974:        if ( priv->phyNum == 0 ) {
        !          1975:                data |= TLAN_NET_MASK_MASK7; 
        !          1976:        }
        !          1977:        TLan_DioWrite8( dev->base_addr, TLAN_NET_MASK, data );
        !          1978:        TLan_DioWrite16( dev->base_addr, TLAN_MAX_RX, TLAN_MAX_FRAME_SIZE );
        !          1979: 
        !          1980:        if ( ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) || ( priv->aui ) ) {
        !          1981:                status = MII_GS_LINK;
        !          1982:                printk( "TLAN:  %s: Link forced.\n", dev->name );
        !          1983:        } else {
        !          1984:                TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
        !          1985:                udelay( 1000 );
        !          1986:                TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
        !          1987:                if ( status & MII_GS_LINK ) {
        !          1988:                        printk( "TLAN:  %s: Link active.\n", dev->name );
        !          1989:                        TLan_DioWrite8( dev->base_addr, TLAN_LED_REG, TLAN_LED_LINK );
        !          1990:                }
        !          1991:        }
        !          1992: 
        !          1993:        if ( priv->phyNum == 0 ) {
        !          1994:                TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tlphy_ctl );
        !          1995:                tlphy_ctl |= TLAN_TC_INTEN;
        !          1996:                TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tlphy_ctl );
        !          1997:                sio = TLan_DioRead8( dev->base_addr, TLAN_NET_SIO );
        !          1998:                sio |= TLAN_NET_SIO_MINTEN;
        !          1999:                TLan_DioWrite8( dev->base_addr, TLAN_NET_SIO, sio );
        !          2000:        }
        !          2001: 
        !          2002:        if ( status & MII_GS_LINK ) {
        !          2003:                TLan_SetMac( dev, 0, dev->dev_addr );
        !          2004:                priv->phyOnline = 1;
        !          2005:                outb( ( TLAN_HC_INT_ON >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
        !          2006:                if ( debug >= 1 ) {
        !          2007:                        outb( ( TLAN_HC_REQ_INT >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
        !          2008:                }
        !          2009:                outl( virt_to_bus( priv->rxList ), dev->base_addr + TLAN_CH_PARM );
        !          2010:                outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD );
        !          2011:        } else {
        !          2012:                printk( "TLAN:  %s: Link inactive, will retry in 10 secs...\n", dev->name );
        !          2013:                TLan_SetTimer( dev, 1000, TLAN_TIMER_FINISH_RESET );
        !          2014:                return;
        !          2015:        }
        !          2016: 
        !          2017: } /* TLan_FinishReset */
        !          2018: 
        !          2019: 
        !          2020: 
        !          2021: 
        !          2022:        /***************************************************************
        !          2023:         *      TLan_SetMac
        !          2024:         *
        !          2025:         *      Returns:
        !          2026:         *              Nothing
        !          2027:         *      Parms:
        !          2028:         *              dev     Pointer to device structure of adapter
        !          2029:         *                      on which to change the AREG.
        !          2030:         *              areg    The AREG to set the address in (0 - 3).
        !          2031:         *              mac     A pointer to an array of chars.  Each
        !          2032:         *                      element stores one byte of the address.
        !          2033:         *                      IE, it isn't in ascii.
        !          2034:         *
        !          2035:         *      This function transfers a MAC address to one of the
        !          2036:         *      TLAN AREGs (address registers).  The TLAN chip locks
        !          2037:         *      the register on writing to offset 0 and unlocks the
        !          2038:         *      register after writing to offset 5.  If NULL is passed
        !          2039:         *      in mac, then the AREG is filled with 0's.
        !          2040:         *
        !          2041:         **************************************************************/
        !          2042: 
        !          2043: void TLan_SetMac( struct device *dev, int areg, char *mac )
        !          2044: {
        !          2045:        int i;
        !          2046:                        
        !          2047:        areg *= 6;
        !          2048: 
        !          2049:        if ( mac != NULL ) {
        !          2050:                for ( i = 0; i < 6; i++ )
        !          2051:                        TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, mac[i] );
        !          2052:        } else {
        !          2053:                for ( i = 0; i < 6; i++ )
        !          2054:                        TLan_DioWrite8( dev->base_addr, TLAN_AREG_0 + areg + i, 0 );
        !          2055:        }
        !          2056: 
        !          2057: } /* TLan_SetMac */
        !          2058: 
        !          2059: 
        !          2060: 
        !          2061: 
        !          2062: /*****************************************************************************
        !          2063: ******************************************************************************
        !          2064: 
        !          2065:        ThunderLAN Driver PHY Layer Routines
        !          2066: 
        !          2067: ******************************************************************************
        !          2068: *****************************************************************************/
        !          2069: 
        !          2070: 
        !          2071: 
        !          2072:        /*********************************************************************
        !          2073:         *      TLan_PhyPrint
        !          2074:         *
        !          2075:         *      Returns:
        !          2076:         *              Nothing
        !          2077:         *      Parms:
        !          2078:         *              dev     A pointer to the device structure of the
        !          2079:         *                      TLAN device having the PHYs to be detailed.
        !          2080:         *                              
        !          2081:         *      This function prints the registers a PHY (aka tranceiver).
        !          2082:         *
        !          2083:         ********************************************************************/
        !          2084: 
        !          2085: void TLan_PhyPrint( struct device *dev )
        !          2086: {
        !          2087:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2088:        u16 i, data0, data1, data2, data3, phy;
        !          2089: 
        !          2090:        phy = priv->phy[priv->phyNum];
        !          2091: 
        !          2092:        if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
        !          2093:                printk( "TLAN:   Device %s, Unmanaged PHY.\n", dev->name );
        !          2094:        } else if ( phy <= TLAN_PHY_MAX_ADDR ) {
        !          2095:                printk( "TLAN:   Device %s, PHY 0x%02x.\n", dev->name, phy );
        !          2096:                printk( "TLAN:      Off.  +0     +1     +2     +3 \n" );
        !          2097:                 for ( i = 0; i < 0x20; i+= 4 ) {
        !          2098:                        printk( "TLAN:      0x%02x", i );
        !          2099:                        TLan_MiiReadReg( dev, phy, i, &data0 );
        !          2100:                        printk( " 0x%04hx", data0 );
        !          2101:                        TLan_MiiReadReg( dev, phy, i + 1, &data1 );
        !          2102:                        printk( " 0x%04hx", data1 );
        !          2103:                        TLan_MiiReadReg( dev, phy, i + 2, &data2 );
        !          2104:                        printk( " 0x%04hx", data2 );
        !          2105:                        TLan_MiiReadReg( dev, phy, i + 3, &data3 );
        !          2106:                        printk( " 0x%04hx\n", data3 );
        !          2107:                }
        !          2108:        } else {
        !          2109:                printk( "TLAN:   Device %s, Invalid PHY.\n", dev->name );
        !          2110:        }
        !          2111: 
        !          2112: } /* TLan_PhyPrint */
        !          2113: 
        !          2114: 
        !          2115: 
        !          2116: 
        !          2117:        /*********************************************************************
        !          2118:         *      TLan_PhyDetect
        !          2119:         *
        !          2120:         *      Returns:
        !          2121:         *              Nothing
        !          2122:         *      Parms:
        !          2123:         *              dev     A pointer to the device structure of the adapter
        !          2124:         *                      for which the PHY needs determined.
        !          2125:         *
        !          2126:         *      So far I've found that adapters which have external PHYs
        !          2127:         *      may also use the internal PHY for part of the functionality.
        !          2128:         *      (eg, AUI/Thinnet).  This function finds out if this TLAN
        !          2129:         *      chip has an internal PHY, and then finds the first external
        !          2130:         *      PHY (starting from address 0) if it exists).
        !          2131:         *
        !          2132:         ********************************************************************/
        !          2133: 
        !          2134: void TLan_PhyDetect( struct device *dev )
        !          2135: {
        !          2136:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2137:        u16             control;
        !          2138:        u16             hi;
        !          2139:        u16             lo;
        !          2140:        u32             phy;
        !          2141: 
        !          2142:        if ( priv->adapter->flags & TLAN_ADAPTER_UNMANAGED_PHY ) {
        !          2143:                priv->phyNum = 0xFFFF;
        !          2144:                return;
        !          2145:        }
        !          2146: 
        !          2147:        TLan_MiiReadReg( dev, TLAN_PHY_MAX_ADDR, MII_GEN_ID_HI, &hi );
        !          2148: 
        !          2149:        if ( hi != 0xFFFF ) {
        !          2150:                priv->phy[0] = TLAN_PHY_MAX_ADDR;
        !          2151:        } else {
        !          2152:                priv->phy[0] = TLAN_PHY_NONE;
        !          2153:        }
        !          2154: 
        !          2155:        priv->phy[1] = TLAN_PHY_NONE;
        !          2156:        for ( phy = 0; phy <= TLAN_PHY_MAX_ADDR; phy++ ) {
        !          2157:                TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &control );
        !          2158:                TLan_MiiReadReg( dev, phy, MII_GEN_ID_HI, &hi );
        !          2159:                TLan_MiiReadReg( dev, phy, MII_GEN_ID_LO, &lo );
        !          2160:                if ( ( control != 0xFFFF ) || ( hi != 0xFFFF ) || ( lo != 0xFFFF ) ) {
        !          2161:                        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN: PHY found at %02x %04x %04x %04x\n", phy, control, hi, lo );
        !          2162:                        if ( ( priv->phy[1] == TLAN_PHY_NONE ) && ( phy != TLAN_PHY_MAX_ADDR ) ) {
        !          2163:                                priv->phy[1] = phy;
        !          2164:                        }
        !          2165:                }
        !          2166:        }
        !          2167: 
        !          2168:        if ( priv->phy[1] != TLAN_PHY_NONE ) {
        !          2169:                priv->phyNum = 1;
        !          2170:        } else if ( priv->phy[0] != TLAN_PHY_NONE ) {
        !          2171:                priv->phyNum = 0;
        !          2172:        } else {
        !          2173:                printk( "TLAN:  Cannot initialize device, no PHY was found!\n" );
        !          2174:        }
        !          2175: 
        !          2176: } /* TLan_PhyDetect */
        !          2177: 
        !          2178: 
        !          2179: 
        !          2180: 
        !          2181: void TLan_PhyPowerDown( struct device *dev )
        !          2182: {
        !          2183:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2184:        u16             value;
        !          2185: 
        !          2186:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Powering down PHY(s).\n", dev->name );
        !          2187:        value = MII_GC_PDOWN | MII_GC_LOOPBK | MII_GC_ISOLATE;
        !          2188:        TLan_MiiSync( dev->base_addr );
        !          2189:        TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
        !          2190:        if ( ( priv->phyNum == 0 ) && ( priv->phy[1] != TLAN_PHY_NONE ) && ( ! ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) ) ) {
        !          2191:                TLan_MiiSync( dev->base_addr );
        !          2192:                TLan_MiiWriteReg( dev, priv->phy[1], MII_GEN_CTL, value );
        !          2193:        }
        !          2194: 
        !          2195:        /* Wait for 5 jiffies (50 ms) and powerup
        !          2196:         * This is abitrary.  It is intended to make sure the
        !          2197:         * tranceiver settles.
        !          2198:         */
        !          2199:        TLan_SetTimer( dev, 5, TLAN_TIMER_PHY_PUP );
        !          2200: 
        !          2201: } /* TLan_PhyPowerDown */
        !          2202: 
        !          2203: 
        !          2204: 
        !          2205: 
        !          2206: void TLan_PhyPowerUp( struct device *dev )
        !          2207: {
        !          2208:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2209:        u16             value;
        !          2210: 
        !          2211:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Powering up PHY.\n", dev->name );
        !          2212:        TLan_MiiSync( dev->base_addr );
        !          2213:        value = MII_GC_LOOPBK;
        !          2214:        TLan_MiiWriteReg( dev, priv->phy[priv->phyNum], MII_GEN_CTL, value );
        !          2215: 
        !          2216:        /* Wait for 50 jiffies (500 ms) and reset the
        !          2217:         * tranceiver.  The TLAN docs say both 50 ms and
        !          2218:         * 500 ms, so do the longer, just in case
        !          2219:         */
        !          2220:        TLan_SetTimer( dev, 50, TLAN_TIMER_PHY_RESET );
        !          2221: 
        !          2222: } /* TLan_PhyPowerUp */
        !          2223: 
        !          2224: 
        !          2225: 
        !          2226: 
        !          2227: void TLan_PhyReset( struct device *dev )
        !          2228: {
        !          2229:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2230:        u16             phy;
        !          2231:        u16             value;
        !          2232: 
        !          2233:        phy = priv->phy[priv->phyNum];
        !          2234: 
        !          2235:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Reseting PHY.\n", dev->name );
        !          2236:        TLan_MiiSync( dev->base_addr );
        !          2237:        value = MII_GC_LOOPBK | MII_GC_RESET;
        !          2238:        TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, value );
        !          2239:        TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
        !          2240:        while ( value & MII_GC_RESET ) {
        !          2241:                TLan_MiiReadReg( dev, phy, MII_GEN_CTL, &value );
        !          2242:        }
        !          2243:        TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0 );
        !          2244: 
        !          2245:        /* Wait for 50 jiffies (500 ms) and initialize.
        !          2246:         * I don't remember why I wait this long.
        !          2247:         */
        !          2248:        TLan_SetTimer( dev, 50, TLAN_TIMER_PHY_START_LINK );
        !          2249: 
        !          2250: } /* TLan_PhyReset */
        !          2251: 
        !          2252: 
        !          2253: 
        !          2254: 
        !          2255: void TLan_PhyStartLink( struct device *dev )
        !          2256: {
        !          2257:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2258:        u16             ability;
        !          2259:        u16             control;
        !          2260:        u16             data;
        !          2261:        u16             phy;
        !          2262:        u16             status;
        !          2263:        u16             tctl;
        !          2264: 
        !          2265:        phy = priv->phy[priv->phyNum];
        !          2266: 
        !          2267:        TLAN_DBG( TLAN_DEBUG_GNRL, "TLAN:  %s: Trying to activate link.\n", dev->name );
        !          2268:        TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
        !          2269:        if ( ( status & MII_GS_AUTONEG ) && 
        !          2270:             ( priv->duplex == TLAN_DUPLEX_DEFAULT ) && 
        !          2271:             ( priv->speed == TLAN_SPEED_DEFAULT ) &&
        !          2272:             ( ! priv->aui ) ) {
        !          2273:                ability = status >> 11;
        !          2274: 
        !          2275:                if ( priv->speed == TLAN_SPEED_10 ) {
        !          2276:                        ability &= 0x0003;
        !          2277:                } else if ( priv->speed == TLAN_SPEED_100 ) {
        !          2278:                        ability &= 0x001C;
        !          2279:                }
        !          2280: 
        !          2281:                if ( priv->duplex == TLAN_DUPLEX_FULL ) {
        !          2282:                        ability &= 0x000A;
        !          2283:                } else if ( priv->duplex == TLAN_DUPLEX_HALF ) {
        !          2284:                        ability &= 0x0005;
        !          2285:                }
        !          2286: 
        !          2287:                TLan_MiiWriteReg( dev, phy, MII_AN_ADV, ( ability << 5 ) | 1 );
        !          2288:                        TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1000 );
        !          2289:                TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, 0x1200 );
        !          2290: 
        !          2291:                /* Wait for 400 jiffies (4 sec) for autonegotiation
        !          2292:                 * to complete.  The max spec time is less than this
        !          2293:                 * but the card need additional time to start AN.
        !          2294:                 * .5 sec should be plenty extra.
        !          2295:                 */
        !          2296:                printk( "TLAN:  %s: Starting autonegotiation.\n", dev->name );
        !          2297:                TLan_SetTimer( dev, 400, TLAN_TIMER_PHY_FINISH_AN );
        !          2298:                return;
        !          2299:        }
        !          2300: 
        !          2301:        if ( ( priv->aui ) && ( priv->phyNum != 0 ) ) {
        !          2302:                priv->phyNum = 0;
        !          2303:                data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
        !          2304:                TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
        !          2305:                TLan_SetTimer( dev, 4, TLAN_TIMER_PHY_PDOWN );
        !          2306:                return;
        !          2307:        } else if ( priv->phyNum == 0 ) {
        !          2308:                TLan_MiiReadReg( dev, phy, TLAN_TLPHY_CTL, &tctl );
        !          2309:                if ( priv->aui ) {
        !          2310:                        tctl |= TLAN_TC_AUISEL;
        !          2311:                } else {
        !          2312:                        tctl &= ~TLAN_TC_AUISEL;
        !          2313:                        control = 0;
        !          2314:                        if ( priv->duplex == TLAN_DUPLEX_FULL ) {
        !          2315:                                control |= MII_GC_DUPLEX;
        !          2316:                                priv->tlanFullDuplex = TRUE;
        !          2317:                        }
        !          2318:                        if ( priv->speed == TLAN_SPEED_100 ) {
        !          2319:                                control |= MII_GC_SPEEDSEL;
        !          2320:                        }
        !          2321:                                TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, control );
        !          2322:                }
        !          2323:                TLan_MiiWriteReg( dev, phy, TLAN_TLPHY_CTL, tctl );
        !          2324:        }
        !          2325: 
        !          2326:        /* Wait for 100 jiffies (1 sec) to give the tranceiver time
        !          2327:         * to establish link.
        !          2328:         */
        !          2329:        TLan_SetTimer( dev, 100, TLAN_TIMER_FINISH_RESET );
        !          2330: 
        !          2331: } /* TLan_PhyStartLink */
        !          2332: 
        !          2333: 
        !          2334: 
        !          2335: 
        !          2336: void TLan_PhyFinishAutoNeg( struct device *dev )
        !          2337: {
        !          2338:        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        !          2339:        u16             an_adv;
        !          2340:        u16             an_lpa;
        !          2341:        u16             data;
        !          2342:        u16             mode;
        !          2343:        u16             phy;
        !          2344:        u16             status;
        !          2345:        
        !          2346:        phy = priv->phy[priv->phyNum];
        !          2347: 
        !          2348:        TLan_MiiReadReg( dev, phy, MII_GEN_STS, &status );
        !          2349:        if ( ! ( status & MII_GS_AUTOCMPLT ) ) {
        !          2350:                /* Wait for 800 jiffies (8 sec) to give the process
        !          2351:                 * more time.  Perhaps we should fail after a while.
        !          2352:                 */
        !          2353:                printk( "TLAN:  Giving autonegotiation more time.\n" );
        !          2354:                TLan_SetTimer( dev, 800, TLAN_TIMER_PHY_FINISH_AN );
        !          2355:                return;
        !          2356:        }
        !          2357: 
        !          2358:        printk( "TLAN:  %s: Autonegotiation complete.\n", dev->name );
        !          2359:        TLan_MiiReadReg( dev, phy, MII_AN_ADV, &an_adv );
        !          2360:        TLan_MiiReadReg( dev, phy, MII_AN_LPA, &an_lpa );
        !          2361:        mode = an_adv & an_lpa & 0x03E0;
        !          2362:        if ( mode & 0x0100 ) {
        !          2363:                priv->tlanFullDuplex = TRUE;
        !          2364:        } else if ( ! ( mode & 0x0080 ) && ( mode & 0x0040 ) ) {
        !          2365:                priv->tlanFullDuplex = TRUE;
        !          2366:        }
        !          2367: 
        !          2368:        if ( ( ! ( mode & 0x0180 ) ) && ( priv->adapter->flags & TLAN_ADAPTER_USE_INTERN_10 ) && ( priv->phyNum != 0 ) ) {
        !          2369:                priv->phyNum = 0;
        !          2370:                data = TLAN_NET_CFG_1FRAG | TLAN_NET_CFG_1CHAN | TLAN_NET_CFG_PHY_EN;
        !          2371:                TLan_DioWrite16( dev->base_addr, TLAN_NET_CONFIG, data );
        !          2372:                TLan_SetTimer( dev, 40, TLAN_TIMER_PHY_PDOWN );
        !          2373:                return;
        !          2374:        }
        !          2375: 
        !          2376:        if ( priv->phyNum == 0 ) {
        !          2377:                if ( ( priv->duplex == TLAN_DUPLEX_FULL ) || ( an_adv & an_lpa & 0x0040 ) ) {
        !          2378:                        TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB | MII_GC_DUPLEX );
        !          2379:                        printk( "TLAN:  Starting internal PHY with DUPLEX\n" );
        !          2380:                } else {
        !          2381:                        TLan_MiiWriteReg( dev, phy, MII_GEN_CTL, MII_GC_AUTOENB );
        !          2382:                        printk( "TLAN:  Starting internal PHY with HALF-DUPLEX\n" );
        !          2383:                }
        !          2384:        }
        !          2385: 
        !          2386:        /* Wait for 10 jiffies (100 ms).  No reason in partiticular.
        !          2387:         */
        !          2388:        TLan_SetTimer( dev, 10, TLAN_TIMER_FINISH_RESET );
        !          2389:                
        !          2390: } /* TLan_PhyFinishAutoNeg */
        !          2391: 
        !          2392: 
        !          2393: 
        !          2394: 
        !          2395: /*****************************************************************************
        !          2396: ******************************************************************************
        !          2397: 
        !          2398:        ThunderLAN Driver MII Routines
        !          2399: 
        !          2400:        These routines are based on the information in Chap. 2 of the
        !          2401:        "ThunderLAN Programmer's Guide", pp. 15-24.
        !          2402: 
        !          2403: ******************************************************************************
        !          2404: *****************************************************************************/
        !          2405: 
        !          2406: 
        !          2407:        /***************************************************************
        !          2408:         *      TLan_MiiReadReg
        !          2409:         *
        !          2410:         *      Returns:
        !          2411:         *              0       if ack received ok
        !          2412:         *              1       otherwise.
        !          2413:         *
        !          2414:         *      Parms:
        !          2415:         *              dev             The device structure containing
        !          2416:         *                              The io address and interrupt count
        !          2417:         *                              for this device.
        !          2418:         *              phy             The address of the PHY to be queried.
        !          2419:         *              reg             The register whose contents are to be
        !          2420:         *                              retreived.
        !          2421:         *              val             A pointer to a variable to store the
        !          2422:         *                              retrieved value.
        !          2423:         *
        !          2424:         *      This function uses the TLAN's MII bus to retreive the contents
        !          2425:         *      of a given register on a PHY.  It sends the appropriate info
        !          2426:         *      and then reads the 16-bit register value from the MII bus via
        !          2427:         *      the TLAN SIO register.
        !          2428:         *
        !          2429:         **************************************************************/
        !          2430: 
        !          2431: int TLan_MiiReadReg( struct device *dev, u16 phy, u16 reg, u16 *val )
        !          2432: {
        !          2433:        u8      nack;
        !          2434:        u16     sio, tmp;
        !          2435:        u32     i;
        !          2436:        int     err;
        !          2437:        int     minten;
        !          2438: 
        !          2439:        err = FALSE;
        !          2440:        outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
        !          2441:        sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2442: 
        !          2443:        if ( dev->interrupt == 0 )
        !          2444:                cli();
        !          2445:        dev->interrupt++;
        !          2446: 
        !          2447:        TLan_MiiSync(dev->base_addr);
        !          2448: 
        !          2449:        minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
        !          2450:        if ( minten )
        !          2451:                TLan_ClearBit(TLAN_NET_SIO_MINTEN, sio);
        !          2452: 
        !          2453:        TLan_MiiSendData( dev->base_addr, 0x1, 2 );     /* Start ( 01b ) */
        !          2454:        TLan_MiiSendData( dev->base_addr, 0x2, 2 );     /* Read  ( 10b ) */
        !          2455:        TLan_MiiSendData( dev->base_addr, phy, 5 );     /* Device #      */
        !          2456:        TLan_MiiSendData( dev->base_addr, reg, 5 );     /* Register #    */
        !          2457: 
        !          2458: 
        !          2459:        TLan_ClearBit(TLAN_NET_SIO_MTXEN, sio);         /* Change direction */
        !          2460: 
        !          2461:        TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);          /* Clock Idle bit */
        !          2462:        TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
        !          2463:        TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);          /* Wait 300ns */
        !          2464: 
        !          2465:        nack = TLan_GetBit(TLAN_NET_SIO_MDATA, sio);    /* Check for ACK */
        !          2466:        TLan_SetBit(TLAN_NET_SIO_MCLK, sio);            /* Finish ACK */
        !          2467:        if (nack) {                                     /* No ACK, so fake it */
        !          2468:                for (i = 0; i < 16; i++) {
        !          2469:                        TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
        !          2470:                        TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
        !          2471:                }
        !          2472:                tmp = 0xffff;
        !          2473:                err = TRUE;
        !          2474:        } else {                                        /* ACK, so read data */
        !          2475:                for (tmp = 0, i = 0x8000; i; i >>= 1) {
        !          2476:                        TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);
        !          2477:                        if (TLan_GetBit(TLAN_NET_SIO_MDATA, sio))
        !          2478:                                tmp |= i;
        !          2479:                        TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
        !          2480:                }
        !          2481:        }
        !          2482: 
        !          2483: 
        !          2484:        TLan_ClearBit(TLAN_NET_SIO_MCLK, sio);          /* Idle cycle */
        !          2485:        TLan_SetBit(TLAN_NET_SIO_MCLK, sio);
        !          2486: 
        !          2487:        if ( minten )
        !          2488:                TLan_SetBit(TLAN_NET_SIO_MINTEN, sio);
        !          2489: 
        !          2490:        *val = tmp;
        !          2491: 
        !          2492:        dev->interrupt--;
        !          2493:        if ( dev->interrupt == 0 )
        !          2494:                sti();
        !          2495: 
        !          2496:        return err;
        !          2497: 
        !          2498: } /* TLan_MiiReadReg */
        !          2499: 
        !          2500: 
        !          2501: 
        !          2502: 
        !          2503:        /***************************************************************
        !          2504:         *      TLan_MiiSendData
        !          2505:         *
        !          2506:         *      Returns:
        !          2507:         *              Nothing
        !          2508:         *      Parms:
        !          2509:         *              base_port       The base IO port of the adapter in
        !          2510:         *                              question.
        !          2511:         *              dev             The address of the PHY to be queried.
        !          2512:         *              data            The value to be placed on the MII bus.
        !          2513:         *              num_bits        The number of bits in data that are to
        !          2514:         *                              be placed on the MII bus.
        !          2515:         *
        !          2516:         *      This function sends on sequence of bits on the MII
        !          2517:         *      configuration bus.
        !          2518:         *
        !          2519:         **************************************************************/
        !          2520: 
        !          2521: void TLan_MiiSendData( u16 base_port, u32 data, unsigned num_bits )
        !          2522: {
        !          2523:        u16 sio;
        !          2524:        u32 i;
        !          2525: 
        !          2526:        if ( num_bits == 0 )
        !          2527:                return;
        !          2528: 
        !          2529:        outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
        !          2530:        sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2531:        TLan_SetBit( TLAN_NET_SIO_MTXEN, sio );
        !          2532: 
        !          2533:        for ( i = ( 0x1 << ( num_bits - 1 ) ); i; i >>= 1 ) {
        !          2534:                TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
        !          2535:                TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
        !          2536:                if ( data & i )
        !          2537:                        TLan_SetBit( TLAN_NET_SIO_MDATA, sio );
        !          2538:                else
        !          2539:                        TLan_ClearBit( TLAN_NET_SIO_MDATA, sio );
        !          2540:                TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
        !          2541:                TLan_GetBit( TLAN_NET_SIO_MCLK, sio );
        !          2542:        }
        !          2543: 
        !          2544: } /* TLan_MiiSendData */
        !          2545: 
        !          2546: 
        !          2547: 
        !          2548: 
        !          2549:        /***************************************************************
        !          2550:         *      TLan_MiiSync
        !          2551:         *
        !          2552:         *      Returns:
        !          2553:         *              Nothing
        !          2554:         *      Parms:
        !          2555:         *              base_port       The base IO port of the adapter in
        !          2556:         *                              question.
        !          2557:         *
        !          2558:         *      This functions syncs all PHYs in terms of the MII configuration
        !          2559:         *      bus.
        !          2560:         *
        !          2561:         **************************************************************/
        !          2562: 
        !          2563: void TLan_MiiSync( u16 base_port )
        !          2564: {
        !          2565:        int i;
        !          2566:        u16 sio;
        !          2567: 
        !          2568:        outw( TLAN_NET_SIO, base_port + TLAN_DIO_ADR );
        !          2569:        sio = base_port + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2570: 
        !          2571:        TLan_ClearBit( TLAN_NET_SIO_MTXEN, sio );
        !          2572:        for ( i = 0; i < 32; i++ ) {
        !          2573:                TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );
        !          2574:                TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
        !          2575:        }
        !          2576: 
        !          2577: } /* TLan_MiiSync */
        !          2578: 
        !          2579: 
        !          2580: 
        !          2581: 
        !          2582:        /***************************************************************
        !          2583:         *      TLan_MiiWriteReg
        !          2584:         *
        !          2585:         *      Returns:
        !          2586:         *              Nothing
        !          2587:         *      Parms:
        !          2588:         *              dev             The device structure for the device
        !          2589:         *                              to write to.
        !          2590:         *              phy             The address of the PHY to be written to.
        !          2591:         *              reg             The register whose contents are to be
        !          2592:         *                              written.
        !          2593:         *              val             The value to be written to the register.
        !          2594:         *
        !          2595:         *      This function uses the TLAN's MII bus to write the contents of a
        !          2596:         *      given register on a PHY.  It sends the appropriate info and then
        !          2597:         *      writes the 16-bit register value from the MII configuration bus
        !          2598:         *      via the TLAN SIO register.
        !          2599:         *
        !          2600:         **************************************************************/
        !          2601: 
        !          2602: void TLan_MiiWriteReg( struct device *dev, u16 phy, u16 reg, u16 val )
        !          2603: {
        !          2604:        u16     sio;
        !          2605:        int     minten;
        !          2606: 
        !          2607:        outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
        !          2608:        sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2609: 
        !          2610:        if ( dev->interrupt == 0 )
        !          2611:                cli();
        !          2612:        dev->interrupt++;
        !          2613: 
        !          2614:        TLan_MiiSync( dev->base_addr );
        !          2615: 
        !          2616:        minten = TLan_GetBit( TLAN_NET_SIO_MINTEN, sio );
        !          2617:        if ( minten )
        !          2618:                TLan_ClearBit( TLAN_NET_SIO_MINTEN, sio );
        !          2619: 
        !          2620:        TLan_MiiSendData( dev->base_addr, 0x1, 2 );     /* Start ( 01b ) */
        !          2621:        TLan_MiiSendData( dev->base_addr, 0x1, 2 );     /* Write ( 01b ) */
        !          2622:        TLan_MiiSendData( dev->base_addr, phy, 5 );     /* Device #      */
        !          2623:        TLan_MiiSendData( dev->base_addr, reg, 5 );     /* Register #    */
        !          2624: 
        !          2625:        TLan_MiiSendData( dev->base_addr, 0x2, 2 );     /* Send ACK */
        !          2626:        TLan_MiiSendData( dev->base_addr, val, 16 );    /* Send Data */
        !          2627: 
        !          2628:        TLan_ClearBit( TLAN_NET_SIO_MCLK, sio );        /* Idle cycle */
        !          2629:        TLan_SetBit( TLAN_NET_SIO_MCLK, sio );
        !          2630: 
        !          2631:        if ( minten )
        !          2632:                TLan_SetBit( TLAN_NET_SIO_MINTEN, sio );
        !          2633: 
        !          2634:        dev->interrupt--;
        !          2635:        if ( dev->interrupt == 0 )
        !          2636:                sti();
        !          2637: 
        !          2638: } /* TLan_MiiWriteReg */
        !          2639: 
        !          2640: 
        !          2641: 
        !          2642: 
        !          2643: /*****************************************************************************
        !          2644: ******************************************************************************
        !          2645: 
        !          2646:        ThunderLAN Driver Eeprom routines
        !          2647: 
        !          2648:        The Compaq Netelligent 10 and 10/100 cards use a Microchip 24C02A
        !          2649:        EEPROM.  These functions are based on information in Microchip's
        !          2650:        data sheet.  I don't know how well this functions will work with
        !          2651:        other EEPROMs.
        !          2652: 
        !          2653: ******************************************************************************
        !          2654: *****************************************************************************/
        !          2655: 
        !          2656: 
        !          2657:        /***************************************************************
        !          2658:         *      TLan_EeSendStart
        !          2659:         *
        !          2660:         *      Returns:
        !          2661:         *              Nothing
        !          2662:         *      Parms:  
        !          2663:         *              io_base         The IO port base address for the
        !          2664:         *                              TLAN device with the EEPROM to
        !          2665:         *                              use.
        !          2666:         *
        !          2667:         *      This function sends a start cycle to an EEPROM attached
        !          2668:         *      to a TLAN chip.
        !          2669:         *
        !          2670:         **************************************************************/
        !          2671: 
        !          2672: void TLan_EeSendStart( u16 io_base )
        !          2673: {
        !          2674:        u16     sio;
        !          2675: 
        !          2676:        outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
        !          2677:        sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2678: 
        !          2679:        TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2680:        TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
        !          2681:        TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
        !          2682:        TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
        !          2683:        TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2684: 
        !          2685: } /* TLan_EeSendStart */
        !          2686: 
        !          2687: 
        !          2688: 
        !          2689: 
        !          2690:        /***************************************************************
        !          2691:         *      TLan_EeSendByte
        !          2692:         *
        !          2693:         *      Returns:
        !          2694:         *              If the correct ack was received, 0, otherwise 1
        !          2695:         *      Parms:  io_base         The IO port base address for the
        !          2696:         *                              TLAN device with the EEPROM to
        !          2697:         *                              use.
        !          2698:         *              data            The 8 bits of information to
        !          2699:         *                              send to the EEPROM.
        !          2700:         *              stop            If TLAN_EEPROM_STOP is passed, a
        !          2701:         *                              stop cycle is sent after the
        !          2702:         *                              byte is sent after the ack is
        !          2703:         *                              read.
        !          2704:         *
        !          2705:         *      This function sends a byte on the serial EEPROM line,
        !          2706:         *      driving the clock to send each bit. The function then
        !          2707:         *      reverses transmission direction and reads an acknowledge
        !          2708:         *      bit.
        !          2709:         *
        !          2710:         **************************************************************/
        !          2711: 
        !          2712: int TLan_EeSendByte( u16 io_base, u8 data, int stop )
        !          2713: {
        !          2714:        int     err;
        !          2715:        u8      place;
        !          2716:        u16     sio;
        !          2717: 
        !          2718:        outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
        !          2719:        sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2720: 
        !          2721:        /* Assume clock is low, tx is enabled; */
        !          2722:        for ( place = 0x80; place != 0; place >>= 1 ) {
        !          2723:                if ( place & data )
        !          2724:                        TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
        !          2725:                else
        !          2726:                        TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );
        !          2727:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2728:                TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2729:        }
        !          2730:        TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
        !          2731:        TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2732:        err = TLan_GetBit( TLAN_NET_SIO_EDATA, sio );
        !          2733:        TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2734:        TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
        !          2735: 
        !          2736:        if ( ( ! err ) && stop ) {
        !          2737:                TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );       /* STOP, raise data while clock is high */
        !          2738:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2739:                TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
        !          2740:        }
        !          2741: 
        !          2742:        return ( err );
        !          2743: 
        !          2744: } /* TLan_EeSendByte */
        !          2745: 
        !          2746: 
        !          2747: 
        !          2748: 
        !          2749:        /***************************************************************
        !          2750:         *      TLan_EeReceiveByte
        !          2751:         *
        !          2752:         *      Returns:
        !          2753:         *              Nothing
        !          2754:         *      Parms:
        !          2755:         *              io_base         The IO port base address for the
        !          2756:         *                              TLAN device with the EEPROM to
        !          2757:         *                              use.
        !          2758:         *              data            An address to a char to hold the
        !          2759:         *                              data sent from the EEPROM.
        !          2760:         *              stop            If TLAN_EEPROM_STOP is passed, a
        !          2761:         *                              stop cycle is sent after the
        !          2762:         *                              byte is received, and no ack is
        !          2763:         *                              sent.
        !          2764:         *
        !          2765:         *      This function receives 8 bits of data from the EEPROM
        !          2766:         *      over the serial link.  It then sends and ack bit, or no
        !          2767:         *      ack and a stop bit.  This function is used to retrieve
        !          2768:         *      data after the address of a byte in the EEPROM has been
        !          2769:         *      sent.
        !          2770:         *
        !          2771:         **************************************************************/
        !          2772: 
        !          2773: void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop )
        !          2774: {
        !          2775:        u8  place;
        !          2776:        u16 sio;
        !          2777: 
        !          2778:        outw( TLAN_NET_SIO, io_base + TLAN_DIO_ADR );
        !          2779:        sio = io_base + TLAN_DIO_DATA + TLAN_NET_SIO;
        !          2780:        *data = 0;
        !          2781: 
        !          2782:        /* Assume clock is low, tx is enabled; */
        !          2783:        TLan_ClearBit( TLAN_NET_SIO_ETXEN, sio );
        !          2784:        for ( place = 0x80; place; place >>= 1 ) {
        !          2785:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2786:                if ( TLan_GetBit( TLAN_NET_SIO_EDATA, sio ) )
        !          2787:                        *data |= place;
        !          2788:                TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2789:        }
        !          2790: 
        !          2791:        TLan_SetBit( TLAN_NET_SIO_ETXEN, sio );
        !          2792:        if ( ! stop ) {
        !          2793:                TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );       /* Ack = 0 */
        !          2794:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2795:                TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2796:        } else {
        !          2797:                TLan_SetBit( TLAN_NET_SIO_EDATA, sio );         /* No ack = 1 (?) */
        !          2798:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2799:                TLan_ClearBit( TLAN_NET_SIO_ECLOK, sio );
        !          2800:                TLan_ClearBit( TLAN_NET_SIO_EDATA, sio );       /* STOP, raise data while clock is high */
        !          2801:                TLan_SetBit( TLAN_NET_SIO_ECLOK, sio );
        !          2802:                TLan_SetBit( TLAN_NET_SIO_EDATA, sio );
        !          2803:        }
        !          2804: 
        !          2805: } /* TLan_EeReceiveByte */
        !          2806: 
        !          2807: 
        !          2808: 
        !          2809: 
        !          2810:        /***************************************************************
        !          2811:         *      TLan_EeReadByte
        !          2812:         *
        !          2813:         *      Returns:
        !          2814:         *              No error = 0, else, the stage at which the error
        !          2815:         *              occured.
        !          2816:         *      Parms:
        !          2817:         *              io_base         The IO port base address for the
        !          2818:         *                              TLAN device with the EEPROM to
        !          2819:         *                              use.
        !          2820:         *              ee_addr         The address of the byte in the
        !          2821:         *                              EEPROM whose contents are to be
        !          2822:         *                              retrieved.
        !          2823:         *              data            An address to a char to hold the
        !          2824:         *                              data obtained from the EEPROM.
        !          2825:         *
        !          2826:         *      This function reads a byte of information from an byte
        !          2827:         *      cell in the EEPROM.
        !          2828:         *
        !          2829:         **************************************************************/
        !          2830: 
        !          2831: int TLan_EeReadByte( struct device *dev, u8 ee_addr, u8 *data )
        !          2832: {
        !          2833:        int err;
        !          2834: 
        !          2835:        if ( dev->interrupt == 0 )
        !          2836:                cli();
        !          2837:        dev->interrupt++;
        !          2838: 
        !          2839:        TLan_EeSendStart( dev->base_addr );
        !          2840:        err = TLan_EeSendByte( dev->base_addr, 0xA0, TLAN_EEPROM_ACK );
        !          2841:        if (err)
        !          2842:                return 1;
        !          2843:        err = TLan_EeSendByte( dev->base_addr, ee_addr, TLAN_EEPROM_ACK );
        !          2844:        if (err)
        !          2845:                return 2;
        !          2846:        TLan_EeSendStart( dev->base_addr );
        !          2847:        err = TLan_EeSendByte( dev->base_addr, 0xA1, TLAN_EEPROM_ACK );
        !          2848:        if (err)
        !          2849:                return 3;
        !          2850:        TLan_EeReceiveByte( dev->base_addr, data, TLAN_EEPROM_STOP );
        !          2851: 
        !          2852:        dev->interrupt--;
        !          2853:        if ( dev->interrupt == 0 )
        !          2854:                sti();
        !          2855: 
        !          2856:        return 0;
        !          2857: 
        !          2858: } /* TLan_EeReadByte */
        !          2859: 
        !          2860: 
        !          2861: 
        !          2862: 
        !          2863: 

unix.superglobalmegacorp.com

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