Bug Summary

File:obj-scan-build/../linux/src/drivers/net/hp100.c
Location:line 1816, column 3
Description:Value stored to 'val' is never read

Annotated Source Code

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