OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [net/] [tlan.c] - Blame information for rev 1777

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1626 jcastillo
/********************************************************************
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
 
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.