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