1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86#define HP100_DEFAULT_PRIORITY_TX 0
87
88#undef HP100_DEBUG
89#undef HP100_DEBUG_B
90#undef HP100_DEBUG_BM
91
92#undef HP100_DEBUG_TRAINING
93#undef HP100_DEBUG_TX
94#undef HP100_DEBUG_IRQ
95#undef HP100_DEBUG_RX
96
97#undef HP100_MULTICAST_FILTER
98
99#include <linux/module.h>
100#include <linux/kernel.h>
101#include <linux/sched.h>
102#include <linux/string.h>
103#include <linux/errno.h>
104#include <linux/ioport.h>
105#include <linux/interrupt.h>
106#include <linux/eisa.h>
107#include <linux/pci.h>
108#include <linux/dma-mapping.h>
109#include <linux/spinlock.h>
110#include <linux/netdevice.h>
111#include <linux/etherdevice.h>
112#include <linux/skbuff.h>
113#include <linux/types.h>
114#include <linux/delay.h>
115#include <linux/init.h>
116#include <linux/bitops.h>
117#include <linux/jiffies.h>
118
119#include <asm/io.h>
120
121#include "hp100.h"
122
123
124
125
126
127#define HP100_BUS_ISA 0
128#define HP100_BUS_EISA 1
129#define HP100_BUS_PCI 2
130
131#define HP100_REGION_SIZE 0x20
132#define HP100_SIG_LEN 8
133
134#define HP100_MAX_PACKET_SIZE (1536+4)
135#define HP100_MIN_PACKET_SIZE 60
136
137#ifndef HP100_DEFAULT_RX_RATIO
138
139#define HP100_DEFAULT_RX_RATIO 75
140#endif
141
142#ifndef HP100_DEFAULT_PRIORITY_TX
143
144#define HP100_DEFAULT_PRIORITY_TX 0
145#endif
146
147
148
149
150
151struct hp100_private {
152 spinlock_t lock;
153 char id[HP100_SIG_LEN];
154 u_short chip;
155 u_short soft_model;
156 u_int memory_size;
157 u_int virt_memory_size;
158 u_short rx_ratio;
159 u_short priority_tx;
160 u_short mode;
161 u_char bus;
162 struct pci_dev *pci_dev;
163 short mem_mapped;
164 void __iomem *mem_ptr_virt;
165 unsigned long mem_ptr_phys;
166 short lan_type;
167 int hub_status;
168 u_char mac1_mode;
169 u_char mac2_mode;
170 u_char hash_bytes[8];
171
172
173 hp100_ring_t *rxrhead;
174 hp100_ring_t *rxrtail;
175 hp100_ring_t *txrhead;
176 hp100_ring_t *txrtail;
177
178 hp100_ring_t rxring[MAX_RX_PDL];
179 hp100_ring_t txring[MAX_TX_PDL];
180
181 u_int *page_vaddr_algn;
182 u_long whatever_offset;
183 int rxrcommit;
184 int txrcommit;
185};
186
187
188
189
190#ifdef CONFIG_ISA
191static const char *hp100_isa_tbl[] = {
192 "HWPF150",
193 "HWP1950",
194};
195#endif
196
197#ifdef CONFIG_EISA
198static struct eisa_device_id hp100_eisa_tbl[] = {
199 { "HWPF180" },
200 { "HWP1920" },
201 { "HWP1940" },
202 { "HWP1990" },
203 { "CPX0301" },
204 { "CPX0401" },
205 { "" }
206};
207MODULE_DEVICE_TABLE(eisa, hp100_eisa_tbl);
208#endif
209
210#ifdef CONFIG_PCI
211static DEFINE_PCI_DEVICE_TABLE(hp100_pci_tbl) = {
212 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585A, PCI_ANY_ID, PCI_ANY_ID,},
213 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2585B, PCI_ANY_ID, PCI_ANY_ID,},
214 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2970A, PCI_ANY_ID, PCI_ANY_ID,},
215 {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_J2973A, PCI_ANY_ID, PCI_ANY_ID,},
216 {PCI_VENDOR_ID_COMPEX, PCI_DEVICE_ID_COMPEX_ENET100VG4, PCI_ANY_ID, PCI_ANY_ID,},
217 {PCI_VENDOR_ID_COMPEX2, PCI_DEVICE_ID_COMPEX2_100VG, PCI_ANY_ID, PCI_ANY_ID,},
218
219 {}
220};
221MODULE_DEVICE_TABLE(pci, hp100_pci_tbl);
222#endif
223
224static int hp100_rx_ratio = HP100_DEFAULT_RX_RATIO;
225static int hp100_priority_tx = HP100_DEFAULT_PRIORITY_TX;
226static int hp100_mode = 1;
227
228module_param(hp100_rx_ratio, int, 0);
229module_param(hp100_priority_tx, int, 0);
230module_param(hp100_mode, int, 0);
231
232
233
234
235
236static int hp100_probe1(struct net_device *dev, int ioaddr, u_char bus,
237 struct pci_dev *pci_dev);
238
239
240static int hp100_open(struct net_device *dev);
241static int hp100_close(struct net_device *dev);
242static netdev_tx_t hp100_start_xmit(struct sk_buff *skb,
243 struct net_device *dev);
244static netdev_tx_t hp100_start_xmit_bm(struct sk_buff *skb,
245 struct net_device *dev);
246static void hp100_rx(struct net_device *dev);
247static struct net_device_stats *hp100_get_stats(struct net_device *dev);
248static void hp100_misc_interrupt(struct net_device *dev);
249static void hp100_update_stats(struct net_device *dev);
250static void hp100_clear_stats(struct hp100_private *lp, int ioaddr);
251static void hp100_set_multicast_list(struct net_device *dev);
252static irqreturn_t hp100_interrupt(int irq, void *dev_id);
253static void hp100_start_interface(struct net_device *dev);
254static void hp100_stop_interface(struct net_device *dev);
255static void hp100_load_eeprom(struct net_device *dev, u_short ioaddr);
256static int hp100_sense_lan(struct net_device *dev);
257static int hp100_login_to_vg_hub(struct net_device *dev,
258 u_short force_relogin);
259static int hp100_down_vg_link(struct net_device *dev);
260static void hp100_cascade_reset(struct net_device *dev, u_short enable);
261static void hp100_BM_shutdown(struct net_device *dev);
262static void hp100_mmuinit(struct net_device *dev);
263static void hp100_init_pdls(struct net_device *dev);
264static int hp100_init_rxpdl(struct net_device *dev,
265 register hp100_ring_t * ringptr,
266 register u_int * pdlptr);
267static int hp100_init_txpdl(struct net_device *dev,
268 register hp100_ring_t * ringptr,
269 register u_int * pdlptr);
270static void hp100_rxfill(struct net_device *dev);
271static void hp100_hwinit(struct net_device *dev);
272static void hp100_clean_txring(struct net_device *dev);
273#ifdef HP100_DEBUG
274static void hp100_RegisterDump(struct net_device *dev);
275#endif
276
277
278
279
280
281
282
283static inline dma_addr_t virt_to_whatever(struct net_device *dev, u32 * ptr)
284{
285 struct hp100_private *lp = netdev_priv(dev);
286 return ((u_long) ptr) + lp->whatever_offset;
287}
288
289static inline u_int pdl_map_data(struct hp100_private *lp, void *data)
290{
291 return pci_map_single(lp->pci_dev, data,
292 MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
293}
294
295
296static void wait(void)
297{
298 mdelay(1);
299}
300
301
302
303
304
305
306
307
308
309
310
311static const char *hp100_read_id(int ioaddr)
312{
313 int i;
314 static char str[HP100_SIG_LEN];
315 unsigned char sig[4], sum;
316 unsigned short rev;
317
318 hp100_page(ID_MAC_ADDR);
319 sum = 0;
320 for (i = 0; i < 4; i++) {
321 sig[i] = hp100_inb(BOARD_ID + i);
322 sum += sig[i];
323 }
324
325 sum += hp100_inb(BOARD_ID + i);
326 if (sum != 0xff)
327 return NULL;
328
329 str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1);
330 str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1);
331 str[2] = (sig[1] & 0x1f) + ('A' - 1);
332 rev = (sig[2] << 8) | sig[3];
333 sprintf(str + 3, "%04X", rev);
334
335 return str;
336}
337
338#ifdef CONFIG_ISA
339static __init int hp100_isa_probe1(struct net_device *dev, int ioaddr)
340{
341 const char *sig;
342 int i;
343
344 if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100"))
345 goto err;
346
347 if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE) {
348 release_region(ioaddr, HP100_REGION_SIZE);
349 goto err;
350 }
351
352 sig = hp100_read_id(ioaddr);
353 release_region(ioaddr, HP100_REGION_SIZE);
354
355 if (sig == NULL)
356 goto err;
357
358 for (i = 0; i < ARRAY_SIZE(hp100_isa_tbl); i++) {
359 if (!strcmp(hp100_isa_tbl[i], sig))
360 break;
361
362 }
363
364 if (i < ARRAY_SIZE(hp100_isa_tbl))
365 return hp100_probe1(dev, ioaddr, HP100_BUS_ISA, NULL);
366 err:
367 return -ENODEV;
368
369}
370
371
372
373
374
375static int __init hp100_isa_probe(struct net_device *dev, int addr)
376{
377 int err = -ENODEV;
378
379
380 if (addr > 0xff && addr < 0x400)
381 err = hp100_isa_probe1(dev, addr);
382
383 else if (addr != 0)
384 err = -ENXIO;
385
386 else {
387
388 for (addr = 0x100; addr < 0x400; addr += 0x20) {
389 err = hp100_isa_probe1(dev, addr);
390 if (!err)
391 break;
392 }
393 }
394 return err;
395}
396#endif
397
398#if !defined(MODULE) && defined(CONFIG_ISA)
399struct net_device * __init hp100_probe(int unit)
400{
401 struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
402 int err;
403
404 if (!dev)
405 return ERR_PTR(-ENODEV);
406
407#ifdef HP100_DEBUG_B
408 hp100_outw(0x4200, TRACE);
409 printk("hp100: %s: probe\n", dev->name);
410#endif
411
412 if (unit >= 0) {
413 sprintf(dev->name, "eth%d", unit);
414 netdev_boot_setup_check(dev);
415 }
416
417 err = hp100_isa_probe(dev, dev->base_addr);
418 if (err)
419 goto out;
420
421 return dev;
422 out:
423 free_netdev(dev);
424 return ERR_PTR(err);
425}
426#endif
427
428static const struct net_device_ops hp100_bm_netdev_ops = {
429 .ndo_open = hp100_open,
430 .ndo_stop = hp100_close,
431 .ndo_start_xmit = hp100_start_xmit_bm,
432 .ndo_get_stats = hp100_get_stats,
433 .ndo_set_rx_mode = hp100_set_multicast_list,
434 .ndo_change_mtu = eth_change_mtu,
435 .ndo_set_mac_address = eth_mac_addr,
436 .ndo_validate_addr = eth_validate_addr,
437};
438
439static const struct net_device_ops hp100_netdev_ops = {
440 .ndo_open = hp100_open,
441 .ndo_stop = hp100_close,
442 .ndo_start_xmit = hp100_start_xmit,
443 .ndo_get_stats = hp100_get_stats,
444 .ndo_set_rx_mode = hp100_set_multicast_list,
445 .ndo_change_mtu = eth_change_mtu,
446 .ndo_set_mac_address = eth_mac_addr,
447 .ndo_validate_addr = eth_validate_addr,
448};
449
450static int hp100_probe1(struct net_device *dev, int ioaddr, u_char bus,
451 struct pci_dev *pci_dev)
452{
453 int i;
454 int err = -ENODEV;
455 const char *eid;
456 u_int chip;
457 u_char uc;
458 u_int memory_size = 0, virt_memory_size = 0;
459 u_short local_mode, lsw;
460 short mem_mapped;
461 unsigned long mem_ptr_phys;
462 void __iomem *mem_ptr_virt;
463 struct hp100_private *lp;
464
465#ifdef HP100_DEBUG_B
466 hp100_outw(0x4201, TRACE);
467 printk("hp100: %s: probe1\n", dev->name);
468#endif
469
470
471 if (!request_region(ioaddr, HP100_REGION_SIZE, "hp100"))
472 goto out1;
473
474 if (hp100_inw(HW_ID) != HP100_HW_ID_CASCADE)
475 goto out2;
476
477 chip = hp100_inw(PAGING) & HP100_CHIPID_MASK;
478#ifdef HP100_DEBUG
479 if (chip == HP100_CHIPID_SHASTA)
480 printk("hp100: %s: Shasta Chip detected. (This is a pre 802.12 chip)\n", dev->name);
481 else if (chip == HP100_CHIPID_RAINIER)
482 printk("hp100: %s: Rainier Chip detected. (This is a pre 802.12 chip)\n", dev->name);
483 else if (chip == HP100_CHIPID_LASSEN)
484 printk("hp100: %s: Lassen Chip detected.\n", dev->name);
485 else
486 printk("hp100: %s: Warning: Unknown CASCADE chip (id=0x%.4x).\n", dev->name, chip);
487#endif
488
489 dev->base_addr = ioaddr;
490
491 eid = hp100_read_id(ioaddr);
492 if (eid == NULL) {
493 printk(KERN_WARNING "hp100_probe: bad ID checksum at base port 0x%x\n", ioaddr);
494 goto out2;
495 }
496
497 hp100_page(ID_MAC_ADDR);
498 for (i = uc = 0; i < 7; i++)
499 uc += hp100_inb(LAN_ADDR + i);
500 if (uc != 0xff) {
501 printk(KERN_WARNING "hp100_probe: bad lan address checksum at port 0x%x)\n", ioaddr);
502 err = -EIO;
503 goto out2;
504 }
505
506
507
508 hp100_load_eeprom(dev, ioaddr);
509 wait();
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532#if 0
533 local_mode = 0x2270;
534 hp100_outw(0xfefe, OPTION_LSW);
535 hp100_outw(local_mode | HP100_SET_LB | HP100_SET_HB, OPTION_LSW);
536#endif
537
538
539 local_mode = hp100_mode;
540 if (local_mode < 1 || local_mode > 4)
541 local_mode = 1;
542#ifdef HP100_DEBUG
543 printk("hp100: %s: original LSW = 0x%x\n", dev->name,
544 hp100_inw(OPTION_LSW));
545#endif
546
547 if (local_mode == 3) {
548 hp100_outw(HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
549 hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
550 hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
551 printk("hp100: IO mapped mode forced.\n");
552 } else if (local_mode == 2) {
553 hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
554 hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
555 hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
556 printk("hp100: Shared memory mode requested.\n");
557 } else if (local_mode == 4) {
558 if (chip == HP100_CHIPID_LASSEN) {
559 hp100_outw(HP100_BM_WRITE | HP100_BM_READ | HP100_SET_HB, OPTION_LSW);
560 hp100_outw(HP100_IO_EN | HP100_MEM_EN | HP100_RESET_LB, OPTION_LSW);
561 printk("hp100: Busmaster mode requested.\n");
562 }
563 local_mode = 1;
564 }
565
566 if (local_mode == 1) {
567 lsw = hp100_inw(OPTION_LSW);
568
569 if ((lsw & HP100_IO_EN) && (~lsw & HP100_MEM_EN) &&
570 (~lsw & (HP100_BM_WRITE | HP100_BM_READ))) {
571#ifdef HP100_DEBUG
572 printk("hp100: %s: IO_EN bit is set on card.\n", dev->name);
573#endif
574 local_mode = 3;
575 } else if (chip == HP100_CHIPID_LASSEN &&
576 (lsw & (HP100_BM_WRITE | HP100_BM_READ)) == (HP100_BM_WRITE | HP100_BM_READ)) {
577
578
579
580
581
582 if((bus == HP100_BUS_PCI) &&
583 (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)))) {
584
585 goto busmasterfail;
586 }
587 printk("hp100: Busmaster mode enabled.\n");
588 hp100_outw(HP100_MEM_EN | HP100_IO_EN | HP100_RESET_LB, OPTION_LSW);
589 } else {
590 busmasterfail:
591#ifdef HP100_DEBUG
592 printk("hp100: %s: Card not configured for BM or BM not supported with this card.\n", dev->name);
593 printk("hp100: %s: Trying shared memory mode.\n", dev->name);
594#endif
595
596 local_mode = 2;
597 hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
598
599 }
600 }
601#ifdef HP100_DEBUG
602 printk("hp100: %s: new LSW = 0x%x\n", dev->name, hp100_inw(OPTION_LSW));
603#endif
604
605
606 hp100_page(HW_MAP);
607 mem_mapped = ((hp100_inw(OPTION_LSW) & (HP100_MEM_EN)) != 0);
608 mem_ptr_phys = 0UL;
609 mem_ptr_virt = NULL;
610 memory_size = (8192 << ((hp100_inb(SRAM) >> 5) & 0x07));
611 virt_memory_size = 0;
612
613
614 if (mem_mapped || (local_mode == 1)) {
615 mem_ptr_phys = (hp100_inw(MEM_MAP_LSW) | (hp100_inw(MEM_MAP_MSW) << 16));
616 mem_ptr_phys &= ~0x1fff;
617
618 if (bus == HP100_BUS_ISA && (mem_ptr_phys & ~0xfffff) != 0) {
619 printk("hp100: Can only use programmed i/o mode.\n");
620 mem_ptr_phys = 0;
621 mem_mapped = 0;
622 local_mode = 3;
623 }
624
625
626
627 if (local_mode != 1) {
628
629 for (virt_memory_size = memory_size; virt_memory_size > 16383; virt_memory_size >>= 1) {
630 if ((mem_ptr_virt = ioremap((u_long) mem_ptr_phys, virt_memory_size)) == NULL) {
631#ifdef HP100_DEBUG
632 printk("hp100: %s: ioremap for 0x%x bytes high PCI memory at 0x%lx failed\n", dev->name, virt_memory_size, mem_ptr_phys);
633#endif
634 } else {
635#ifdef HP100_DEBUG
636 printk("hp100: %s: remapped 0x%x bytes high PCI memory at 0x%lx to %p.\n", dev->name, virt_memory_size, mem_ptr_phys, mem_ptr_virt);
637#endif
638 break;
639 }
640 }
641
642 if (mem_ptr_virt == NULL) {
643 printk("hp100: Failed to ioremap the PCI card memory. Will have to use i/o mapped mode.\n");
644 local_mode = 3;
645 virt_memory_size = 0;
646 }
647 }
648 }
649
650 if (local_mode == 3) {
651 mem_mapped = 0;
652 mem_ptr_phys = 0;
653 mem_ptr_virt = NULL;
654 printk("hp100: Using (slow) programmed i/o mode.\n");
655 }
656
657
658 lp = netdev_priv(dev);
659
660 spin_lock_init(&lp->lock);
661 strlcpy(lp->id, eid, HP100_SIG_LEN);
662 lp->chip = chip;
663 lp->mode = local_mode;
664 lp->bus = bus;
665 lp->pci_dev = pci_dev;
666 lp->priority_tx = hp100_priority_tx;
667 lp->rx_ratio = hp100_rx_ratio;
668 lp->mem_ptr_phys = mem_ptr_phys;
669 lp->mem_ptr_virt = mem_ptr_virt;
670 hp100_page(ID_MAC_ADDR);
671 lp->soft_model = hp100_inb(SOFT_MODEL);
672 lp->mac1_mode = HP100_MAC1MODE3;
673 lp->mac2_mode = HP100_MAC2MODE3;
674 memset(&lp->hash_bytes, 0x00, 8);
675
676 dev->base_addr = ioaddr;
677
678 lp->memory_size = memory_size;
679 lp->virt_memory_size = virt_memory_size;
680 lp->rx_ratio = hp100_rx_ratio;
681
682 if (lp->mode == 1)
683 dev->netdev_ops = &hp100_bm_netdev_ops;
684 else
685 dev->netdev_ops = &hp100_netdev_ops;
686
687
688 if (bus == HP100_BUS_PCI) {
689 dev->irq = pci_dev->irq;
690 } else {
691 hp100_page(HW_MAP);
692 dev->irq = hp100_inb(IRQ_CHANNEL) & HP100_IRQMASK;
693 if (dev->irq == 2)
694 dev->irq = 9;
695 }
696
697 if (lp->mode == 1)
698 dev->dma = 4;
699
700
701 hp100_page(ID_MAC_ADDR);
702 for (i = uc = 0; i < 6; i++)
703 dev->dev_addr[i] = hp100_inb(LAN_ADDR + i);
704
705
706 hp100_clear_stats(lp, ioaddr);
707
708
709
710
711
712
713
714
715
716
717 if (lp->mode == 1) {
718 dma_addr_t page_baddr;
719
720
721
722
723 lp->page_vaddr_algn = pci_alloc_consistent(lp->pci_dev, MAX_RINGSIZE, &page_baddr);
724 if (!lp->page_vaddr_algn) {
725 err = -ENOMEM;
726 goto out_mem_ptr;
727 }
728 lp->whatever_offset = ((u_long) page_baddr) - ((u_long) lp->page_vaddr_algn);
729
730#ifdef HP100_DEBUG_BM
731 printk("hp100: %s: Reserved DMA memory from 0x%x to 0x%x\n", dev->name, (u_int) lp->page_vaddr_algn, (u_int) lp->page_vaddr_algn + MAX_RINGSIZE);
732#endif
733 lp->rxrcommit = lp->txrcommit = 0;
734 lp->rxrhead = lp->rxrtail = &(lp->rxring[0]);
735 lp->txrhead = lp->txrtail = &(lp->txring[0]);
736 }
737
738
739
740
741
742
743 hp100_hwinit(dev);
744
745
746 lp->lan_type = hp100_sense_lan(dev);
747
748
749 printk("hp100: at 0x%x, IRQ %d, ", ioaddr, dev->irq);
750 switch (bus) {
751 case HP100_BUS_EISA:
752 printk("EISA");
753 break;
754 case HP100_BUS_PCI:
755 printk("PCI");
756 break;
757 default:
758 printk("ISA");
759 break;
760 }
761 printk(" bus, %dk SRAM (rx/tx %d%%).\n", lp->memory_size >> 10, lp->rx_ratio);
762
763 if (lp->mode == 2) {
764 printk("hp100: Memory area at 0x%lx-0x%lx", mem_ptr_phys,
765 (mem_ptr_phys + (mem_ptr_phys > 0x100000 ? (u_long) lp->memory_size : 16 * 1024)) - 1);
766 if (mem_ptr_virt)
767 printk(" (virtual base %p)", mem_ptr_virt);
768 printk(".\n");
769
770
771 dev->mem_start = mem_ptr_phys;
772 dev->mem_end = mem_ptr_phys + lp->memory_size;
773 }
774
775 printk("hp100: ");
776 if (lp->lan_type != HP100_LAN_ERR)
777 printk("Adapter is attached to ");
778 switch (lp->lan_type) {
779 case HP100_LAN_100:
780 printk("100Mb/s Voice Grade AnyLAN network.\n");
781 break;
782 case HP100_LAN_10:
783 printk("10Mb/s network (10baseT).\n");
784 break;
785 case HP100_LAN_COAX:
786 printk("10Mb/s network (coax).\n");
787 break;
788 default:
789 printk("Warning! Link down.\n");
790 }
791
792 err = register_netdev(dev);
793 if (err)
794 goto out3;
795
796 return 0;
797out3:
798 if (local_mode == 1)
799 pci_free_consistent(lp->pci_dev, MAX_RINGSIZE + 0x0f,
800 lp->page_vaddr_algn,
801 virt_to_whatever(dev, lp->page_vaddr_algn));
802out_mem_ptr:
803 if (mem_ptr_virt)
804 iounmap(mem_ptr_virt);
805out2:
806 release_region(ioaddr, HP100_REGION_SIZE);
807out1:
808 return err;
809}
810
811
812static void hp100_hwinit(struct net_device *dev)
813{
814 int ioaddr = dev->base_addr;
815 struct hp100_private *lp = netdev_priv(dev);
816
817#ifdef HP100_DEBUG_B
818 hp100_outw(0x4202, TRACE);
819 printk("hp100: %s: hwinit\n", dev->name);
820#endif
821
822
823
824
825 hp100_page(PERFORMANCE);
826 hp100_outw(0xfefe, IRQ_MASK);
827 hp100_outw(0xffff, IRQ_STATUS);
828
829 hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
830 hp100_outw(HP100_TRI_INT | HP100_SET_HB, OPTION_LSW);
831
832 if (lp->mode == 1) {
833 hp100_BM_shutdown(dev);
834 wait();
835 } else {
836 hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
837 hp100_cascade_reset(dev, 1);
838 hp100_page(MAC_CTRL);
839 hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
840 }
841
842
843 hp100_load_eeprom(dev, 0);
844
845 wait();
846
847
848 hp100_cascade_reset(dev, 1);
849
850
851 hp100_outw(HP100_DEBUG_EN |
852 HP100_RX_HDR |
853 HP100_EE_EN |
854 HP100_BM_WRITE |
855 HP100_BM_READ | HP100_RESET_HB |
856 HP100_FAKE_INT |
857 HP100_INT_EN |
858 HP100_MEM_EN |
859 HP100_IO_EN | HP100_RESET_LB, OPTION_LSW);
860
861 hp100_outw(HP100_TRI_INT |
862 HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW);
863
864 hp100_outb(HP100_PRIORITY_TX |
865 HP100_ADV_NXT_PKT |
866 HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW);
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885 hp100_mmuinit(dev);
886
887
888 wait();
889
890
891 hp100_cascade_reset(dev, 0);
892
893
894
895
896 if ((lp->lan_type == HP100_LAN_100) || (lp->lan_type == HP100_LAN_ERR))
897 hp100_login_to_vg_hub(dev, 0);
898
899}
900
901
902
903
904
905
906static void hp100_mmuinit(struct net_device *dev)
907{
908 int ioaddr = dev->base_addr;
909 struct hp100_private *lp = netdev_priv(dev);
910 int i;
911
912#ifdef HP100_DEBUG_B
913 hp100_outw(0x4203, TRACE);
914 printk("hp100: %s: mmuinit\n", dev->name);
915#endif
916
917#ifdef HP100_DEBUG
918 if (0 != (hp100_inw(OPTION_LSW) & HP100_HW_RST)) {
919 printk("hp100: %s: Not in reset when entering mmuinit. Fix me.\n", dev->name);
920 return;
921 }
922#endif
923
924
925 hp100_page(PERFORMANCE);
926 hp100_outw(0xfefe, IRQ_MASK);
927 hp100_outw(0xffff, IRQ_STATUS);
928
929
930
931
932
933
934
935
936 hp100_outw(HP100_DEBUG_EN |
937 HP100_RX_HDR |
938 HP100_EE_EN | HP100_RESET_HB |
939 HP100_IO_EN |
940 HP100_FAKE_INT |
941 HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
942
943 hp100_outw(HP100_TRI_INT | HP100_SET_HB, OPTION_LSW);
944
945 if (lp->mode == 1) {
946 hp100_outw(HP100_BM_WRITE |
947 HP100_BM_READ |
948 HP100_MMAP_DIS | HP100_SET_HB, OPTION_LSW);
949 } else if (lp->mode == 2) {
950 hp100_outw(HP100_BM_WRITE |
951 HP100_BM_READ | HP100_RESET_HB, OPTION_LSW);
952 hp100_outw(HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW);
953 hp100_outw(HP100_MEM_EN | HP100_SET_LB, OPTION_LSW);
954 hp100_outw(HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
955 } else if (lp->mode == 3) {
956 hp100_outw(HP100_MMAP_DIS | HP100_SET_HB |
957 HP100_IO_EN | HP100_SET_LB, OPTION_LSW);
958 }
959
960 hp100_page(HW_MAP);
961 hp100_outb(0, EARLYRXCFG);
962 hp100_outw(0, EARLYTXCFG);
963
964
965
966
967 if (lp->mode == 1) {
968
969 hp100_page(HW_MAP);
970 hp100_andb(~HP100_PDL_USE3, MODECTRL1);
971 hp100_andb(~HP100_TX_DUALQ, MODECTRL1);
972
973
974 hp100_orb(HP100_EN_BUS_FAIL, MODECTRL2);
975
976 hp100_outw(HP100_BM_READ | HP100_BM_WRITE | HP100_SET_HB, OPTION_LSW);
977 hp100_page(HW_MAP);
978
979 hp100_orb(HP100_BM_BURST_RD | HP100_BM_BURST_WR, BM);
980 if ((lp->chip == HP100_CHIPID_RAINIER) || (lp->chip == HP100_CHIPID_SHASTA))
981 hp100_orb(HP100_BM_PAGE_CK, BM);
982 hp100_orb(HP100_BM_MASTER, BM);
983 } else {
984
985 hp100_page(HW_MAP);
986 hp100_andb(~HP100_BM_MASTER, BM);
987 }
988
989
990
991
992 hp100_page(MMU_CFG);
993 if (lp->mode == 1) {
994 int xmit_stop, recv_stop;
995
996 if ((lp->chip == HP100_CHIPID_RAINIER) ||
997 (lp->chip == HP100_CHIPID_SHASTA)) {
998 int pdl_stop;
999
1000
1001
1002
1003
1004
1005
1006
1007 pdl_stop = lp->memory_size;
1008 xmit_stop = (pdl_stop - 508 * (MAX_RX_PDL) - 16) & ~(0x03ff);
1009 recv_stop = (xmit_stop * (lp->rx_ratio) / 100) & ~(0x03ff);
1010 hp100_outw((pdl_stop >> 4) - 1, PDL_MEM_STOP);
1011#ifdef HP100_DEBUG_BM
1012 printk("hp100: %s: PDL_STOP = 0x%x\n", dev->name, pdl_stop);
1013#endif
1014 } else {
1015
1016 xmit_stop = (lp->memory_size) - 1;
1017 recv_stop = ((lp->memory_size * lp->rx_ratio) / 100) & ~(0x03ff);
1018 }
1019
1020 hp100_outw(xmit_stop >> 4, TX_MEM_STOP);
1021 hp100_outw(recv_stop >> 4, RX_MEM_STOP);
1022#ifdef HP100_DEBUG_BM
1023 printk("hp100: %s: TX_STOP = 0x%x\n", dev->name, xmit_stop >> 4);
1024 printk("hp100: %s: RX_STOP = 0x%x\n", dev->name, recv_stop >> 4);
1025#endif
1026 } else {
1027
1028 hp100_outw((((lp->memory_size * lp->rx_ratio) / 100) >> 4), RX_MEM_STOP);
1029 hp100_outw(((lp->memory_size - 1) >> 4), TX_MEM_STOP);
1030#ifdef HP100_DEBUG
1031 printk("hp100: %s: TX_MEM_STOP: 0x%x\n", dev->name, hp100_inw(TX_MEM_STOP));
1032 printk("hp100: %s: RX_MEM_STOP: 0x%x\n", dev->name, hp100_inw(RX_MEM_STOP));
1033#endif
1034 }
1035
1036
1037 hp100_page(MAC_ADDRESS);
1038 for (i = 0; i < 6; i++)
1039 hp100_outb(dev->dev_addr[i], MAC_ADDR + i);
1040
1041
1042 for (i = 0; i < 8; i++)
1043 hp100_outb(0x0, HASH_BYTE0 + i);
1044
1045
1046 hp100_page(MAC_CTRL);
1047
1048
1049
1050
1051 hp100_andb(~(HP100_RX_EN |
1052 HP100_TX_EN |
1053 HP100_ACC_ERRORED |
1054 HP100_ACC_MC |
1055 HP100_ACC_BC | HP100_ACC_PHY), MAC_CFG_1);
1056
1057 hp100_outb(0x00, MAC_CFG_2);
1058
1059
1060
1061 hp100_outb(0x00, VG_LAN_CFG_2);
1062
1063 if (lp->priority_tx)
1064 hp100_outb(HP100_PRIORITY_TX | HP100_SET_LB, OPTION_MSW);
1065 else
1066 hp100_outb(HP100_PRIORITY_TX | HP100_RESET_LB, OPTION_MSW);
1067
1068 hp100_outb(HP100_ADV_NXT_PKT |
1069 HP100_TX_CMD | HP100_RESET_LB, OPTION_MSW);
1070
1071
1072 if (lp->mode == 1)
1073 hp100_init_pdls(dev);
1074
1075
1076 hp100_page(PERFORMANCE);
1077 hp100_outw(0xfefe, IRQ_MASK);
1078 hp100_outw(0xffff, IRQ_STATUS);
1079}
1080
1081
1082
1083
1084
1085static int hp100_open(struct net_device *dev)
1086{
1087 struct hp100_private *lp = netdev_priv(dev);
1088#ifdef HP100_DEBUG_B
1089 int ioaddr = dev->base_addr;
1090#endif
1091
1092#ifdef HP100_DEBUG_B
1093 hp100_outw(0x4204, TRACE);
1094 printk("hp100: %s: open\n", dev->name);
1095#endif
1096
1097
1098 if (request_irq(dev->irq, hp100_interrupt,
1099 lp->bus == HP100_BUS_PCI || lp->bus ==
1100 HP100_BUS_EISA ? IRQF_SHARED : IRQF_DISABLED,
1101 "hp100", dev)) {
1102 printk("hp100: %s: unable to get IRQ %d\n", dev->name, dev->irq);
1103 return -EAGAIN;
1104 }
1105
1106 dev->trans_start = jiffies;
1107 netif_start_queue(dev);
1108
1109 lp->lan_type = hp100_sense_lan(dev);
1110 lp->mac1_mode = HP100_MAC1MODE3;
1111 lp->mac2_mode = HP100_MAC2MODE3;
1112 memset(&lp->hash_bytes, 0x00, 8);
1113
1114 hp100_stop_interface(dev);
1115
1116 hp100_hwinit(dev);
1117
1118 hp100_start_interface(dev);
1119
1120 return 0;
1121}
1122
1123
1124static int hp100_close(struct net_device *dev)
1125{
1126 int ioaddr = dev->base_addr;
1127 struct hp100_private *lp = netdev_priv(dev);
1128
1129#ifdef HP100_DEBUG_B
1130 hp100_outw(0x4205, TRACE);
1131 printk("hp100: %s: close\n", dev->name);
1132#endif
1133
1134 hp100_page(PERFORMANCE);
1135 hp100_outw(0xfefe, IRQ_MASK);
1136
1137 hp100_stop_interface(dev);
1138
1139 if (lp->lan_type == HP100_LAN_100)
1140 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1141
1142 netif_stop_queue(dev);
1143
1144 free_irq(dev->irq, dev);
1145
1146#ifdef HP100_DEBUG
1147 printk("hp100: %s: close LSW = 0x%x\n", dev->name,
1148 hp100_inw(OPTION_LSW));
1149#endif
1150
1151 return 0;
1152}
1153
1154
1155
1156
1157
1158static void hp100_init_pdls(struct net_device *dev)
1159{
1160 struct hp100_private *lp = netdev_priv(dev);
1161 hp100_ring_t *ringptr;
1162 u_int *pageptr;
1163 int i;
1164
1165#ifdef HP100_DEBUG_B
1166 int ioaddr = dev->base_addr;
1167#endif
1168
1169#ifdef HP100_DEBUG_B
1170 hp100_outw(0x4206, TRACE);
1171 printk("hp100: %s: init pdls\n", dev->name);
1172#endif
1173
1174 if (!lp->page_vaddr_algn)
1175 printk("hp100: %s: Warning: lp->page_vaddr_algn not initialised!\n", dev->name);
1176 else {
1177
1178
1179
1180
1181 memset(lp->page_vaddr_algn, 0, MAX_RINGSIZE);
1182 pageptr = lp->page_vaddr_algn;
1183
1184 lp->rxrcommit = 0;
1185 ringptr = lp->rxrhead = lp->rxrtail = &(lp->rxring[0]);
1186
1187
1188 for (i = MAX_RX_PDL - 1; i >= 0; i--) {
1189 lp->rxring[i].next = ringptr;
1190 ringptr = &(lp->rxring[i]);
1191 pageptr += hp100_init_rxpdl(dev, ringptr, pageptr);
1192 }
1193
1194
1195 lp->txrcommit = 0;
1196 ringptr = lp->txrhead = lp->txrtail = &(lp->txring[0]);
1197 for (i = MAX_TX_PDL - 1; i >= 0; i--) {
1198 lp->txring[i].next = ringptr;
1199 ringptr = &(lp->txring[i]);
1200 pageptr += hp100_init_txpdl(dev, ringptr, pageptr);
1201 }
1202 }
1203}
1204
1205
1206
1207
1208static int hp100_init_rxpdl(struct net_device *dev,
1209 register hp100_ring_t * ringptr,
1210 register u32 * pdlptr)
1211{
1212
1213
1214 if (0 != (((unsigned long) pdlptr) & 0xf))
1215 printk("hp100: %s: Init rxpdl: Unaligned pdlptr 0x%lx.\n",
1216 dev->name, (unsigned long) pdlptr);
1217
1218 ringptr->pdl = pdlptr + 1;
1219 ringptr->pdl_paddr = virt_to_whatever(dev, pdlptr + 1);
1220 ringptr->skb = NULL;
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230 *(pdlptr + 2) = (u_int) virt_to_whatever(dev, pdlptr);
1231 *(pdlptr + 3) = 4;
1232
1233 return roundup(MAX_RX_FRAG * 2 + 2, 4);
1234}
1235
1236
1237static int hp100_init_txpdl(struct net_device *dev,
1238 register hp100_ring_t * ringptr,
1239 register u32 * pdlptr)
1240{
1241 if (0 != (((unsigned long) pdlptr) & 0xf))
1242 printk("hp100: %s: Init txpdl: Unaligned pdlptr 0x%lx.\n", dev->name, (unsigned long) pdlptr);
1243
1244 ringptr->pdl = pdlptr;
1245 ringptr->pdl_paddr = virt_to_whatever(dev, pdlptr);
1246 ringptr->skb = NULL;
1247
1248 return roundup(MAX_TX_FRAG * 2 + 2, 4);
1249}
1250
1251
1252
1253
1254
1255
1256
1257
1258static int hp100_build_rx_pdl(hp100_ring_t * ringptr,
1259 struct net_device *dev)
1260{
1261#ifdef HP100_DEBUG_B
1262 int ioaddr = dev->base_addr;
1263#endif
1264#ifdef HP100_DEBUG_BM
1265 u_int *p;
1266#endif
1267
1268#ifdef HP100_DEBUG_B
1269 hp100_outw(0x4207, TRACE);
1270 printk("hp100: %s: build rx pdl\n", dev->name);
1271#endif
1272
1273
1274
1275
1276
1277 ringptr->skb = netdev_alloc_skb(dev, roundup(MAX_ETHER_SIZE + 2, 4));
1278
1279 if (NULL != ringptr->skb) {
1280
1281
1282
1283
1284
1285 skb_reserve(ringptr->skb, 2);
1286
1287 ringptr->skb->data = (u_char *) skb_put(ringptr->skb, MAX_ETHER_SIZE);
1288
1289
1290
1291
1292
1293
1294
1295
1296#ifdef HP100_DEBUG_BM
1297 printk("hp100: %s: build_rx_pdl: PDH@0x%x, skb->data (len %d) at 0x%x\n",
1298 dev->name, (u_int) ringptr->pdl,
1299 roundup(MAX_ETHER_SIZE + 2, 4),
1300 (unsigned int) ringptr->skb->data);
1301#endif
1302
1303
1304
1305 ringptr->pdl[0] = 0x00020000;
1306 ringptr->pdl[3] = pdl_map_data(netdev_priv(dev),
1307 ringptr->skb->data);
1308 ringptr->pdl[4] = MAX_ETHER_SIZE;
1309
1310#ifdef HP100_DEBUG_BM
1311 for (p = (ringptr->pdl); p < (ringptr->pdl + 5); p++)
1312 printk("hp100: %s: Adr 0x%.8x = 0x%.8x\n", dev->name, (u_int) p, (u_int) * p);
1313#endif
1314 return 1;
1315 }
1316
1317
1318
1319
1320
1321#ifdef HP100_DEBUG_BM
1322 printk("hp100: %s: build_rx_pdl: PDH@0x%x, No space for skb.\n", dev->name, (u_int) ringptr->pdl);
1323#endif
1324
1325 ringptr->pdl[0] = 0x00010000;
1326
1327 return 0;
1328}
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340static void hp100_rxfill(struct net_device *dev)
1341{
1342 int ioaddr = dev->base_addr;
1343
1344 struct hp100_private *lp = netdev_priv(dev);
1345 hp100_ring_t *ringptr;
1346
1347#ifdef HP100_DEBUG_B
1348 hp100_outw(0x4208, TRACE);
1349 printk("hp100: %s: rxfill\n", dev->name);
1350#endif
1351
1352 hp100_page(PERFORMANCE);
1353
1354 while (lp->rxrcommit < MAX_RX_PDL) {
1355
1356
1357
1358 ringptr = lp->rxrtail;
1359 if (0 == hp100_build_rx_pdl(ringptr, dev)) {
1360 return;
1361 }
1362
1363
1364
1365#ifdef HP100_DEBUG_BM
1366 printk("hp100: %s: rxfill: Hand to card: pdl #%d @0x%x phys:0x%x, buffer: 0x%x\n",
1367 dev->name, lp->rxrcommit, (u_int) ringptr->pdl,
1368 (u_int) ringptr->pdl_paddr, (u_int) ringptr->pdl[3]);
1369#endif
1370
1371 hp100_outl((u32) ringptr->pdl_paddr, RX_PDA);
1372
1373 lp->rxrcommit += 1;
1374 lp->rxrtail = ringptr->next;
1375 }
1376}
1377
1378
1379
1380
1381
1382static void hp100_BM_shutdown(struct net_device *dev)
1383{
1384 int ioaddr = dev->base_addr;
1385 struct hp100_private *lp = netdev_priv(dev);
1386 unsigned long time;
1387
1388#ifdef HP100_DEBUG_B
1389 hp100_outw(0x4209, TRACE);
1390 printk("hp100: %s: bm shutdown\n", dev->name);
1391#endif
1392
1393 hp100_page(PERFORMANCE);
1394 hp100_outw(0xfefe, IRQ_MASK);
1395 hp100_outw(0xffff, IRQ_STATUS);
1396
1397
1398 hp100_outw(HP100_INT_EN | HP100_RESET_LB, OPTION_LSW);
1399
1400
1401 hp100_page(MAC_CTRL);
1402 hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
1403
1404
1405 if (0 != (hp100_inw(OPTION_LSW) & HP100_HW_RST)) {
1406
1407
1408
1409 hp100_page(MAC_CTRL);
1410 for (time = 0; time < 5000; time++) {
1411 if ((hp100_inb(MAC_CFG_1) & (HP100_TX_IDLE | HP100_RX_IDLE)) == (HP100_TX_IDLE | HP100_RX_IDLE))
1412 break;
1413 }
1414
1415
1416 if (lp->chip == HP100_CHIPID_LASSEN) {
1417
1418 hp100_page(HW_MAP);
1419 hp100_andb(~HP100_BM_MASTER, BM);
1420
1421 for (time = 0; time < 32000; time++) {
1422 if (0 == (hp100_inb(BM) & HP100_BM_MASTER))
1423 break;
1424 }
1425 } else {
1426
1427
1428
1429 hp100_page(PERFORMANCE);
1430
1431 for (time = 0; time < 10000; time++) {
1432
1433
1434 if ((hp100_inb(RX_PDL) == 0) && (hp100_inb(RX_PKT_CNT) == 0))
1435 break;
1436 }
1437
1438 if (time >= 10000)
1439 printk("hp100: %s: BM shutdown error.\n", dev->name);
1440
1441
1442
1443
1444
1445
1446 for (time = 0; time < 10000; time++) {
1447 if ((0 == hp100_inb(TX_PKT_CNT)) &&
1448 (0 != (hp100_inb(TX_MEM_FREE) & HP100_AUTO_COMPARE)))
1449 break;
1450 }
1451
1452
1453 hp100_page(HW_MAP);
1454 hp100_andb(~HP100_BM_MASTER, BM);
1455 }
1456
1457 hp100_cascade_reset(dev, 1);
1458 }
1459 hp100_page(PERFORMANCE);
1460
1461
1462}
1463
1464static int hp100_check_lan(struct net_device *dev)
1465{
1466 struct hp100_private *lp = netdev_priv(dev);
1467
1468 if (lp->lan_type < 0) {
1469 hp100_stop_interface(dev);
1470 if ((lp->lan_type = hp100_sense_lan(dev)) < 0) {
1471 printk("hp100: %s: no connection found - check wire\n", dev->name);
1472 hp100_start_interface(dev);
1473 return -EIO;
1474 }
1475 if (lp->lan_type == HP100_LAN_100)
1476 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1477 hp100_start_interface(dev);
1478 }
1479 return 0;
1480}
1481
1482
1483
1484
1485
1486
1487static netdev_tx_t hp100_start_xmit_bm(struct sk_buff *skb,
1488 struct net_device *dev)
1489{
1490 unsigned long flags;
1491 int i, ok_flag;
1492 int ioaddr = dev->base_addr;
1493 struct hp100_private *lp = netdev_priv(dev);
1494 hp100_ring_t *ringptr;
1495
1496#ifdef HP100_DEBUG_B
1497 hp100_outw(0x4210, TRACE);
1498 printk("hp100: %s: start_xmit_bm\n", dev->name);
1499#endif
1500 if (skb->len <= 0)
1501 goto drop;
1502
1503 if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN))
1504 return NETDEV_TX_OK;
1505
1506
1507 if (lp->txrtail->next == lp->txrhead) {
1508
1509#ifdef HP100_DEBUG
1510 printk("hp100: %s: start_xmit_bm: No TX PDL available.\n", dev->name);
1511#endif
1512
1513 if (time_before(jiffies, dev_trans_start(dev) + HZ))
1514 goto drop;
1515
1516 if (hp100_check_lan(dev))
1517 goto drop;
1518
1519 if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) {
1520
1521 printk("hp100: %s: login to 100Mb/s hub retry\n", dev->name);
1522 hp100_stop_interface(dev);
1523 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1524 hp100_start_interface(dev);
1525 } else {
1526 spin_lock_irqsave(&lp->lock, flags);
1527 hp100_ints_off();
1528 i = hp100_sense_lan(dev);
1529 hp100_ints_on();
1530 spin_unlock_irqrestore(&lp->lock, flags);
1531 if (i == HP100_LAN_ERR)
1532 printk("hp100: %s: link down detected\n", dev->name);
1533 else if (lp->lan_type != i) {
1534
1535 printk("hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name);
1536 lp->lan_type = i;
1537 hp100_stop_interface(dev);
1538 if (lp->lan_type == HP100_LAN_100)
1539 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1540 hp100_start_interface(dev);
1541 } else {
1542 printk("hp100: %s: interface reset\n", dev->name);
1543 hp100_stop_interface(dev);
1544 if (lp->lan_type == HP100_LAN_100)
1545 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1546 hp100_start_interface(dev);
1547 }
1548 }
1549
1550 goto drop;
1551 }
1552
1553
1554
1555
1556
1557 spin_lock_irqsave(&lp->lock, flags);
1558 ringptr = lp->txrtail;
1559 lp->txrtail = ringptr->next;
1560
1561
1562 ok_flag = skb->len >= HP100_MIN_PACKET_SIZE;
1563 i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE;
1564
1565 ringptr->skb = skb;
1566 ringptr->pdl[0] = ((1 << 16) | i);
1567 if (lp->chip == HP100_CHIPID_SHASTA) {
1568
1569 ringptr->pdl[2] = i;
1570 } else {
1571
1572 ringptr->pdl[2] = skb->len;
1573 }
1574
1575
1576 ringptr->pdl[1] = ((u32) pci_map_single(lp->pci_dev, skb->data, ringptr->pdl[2], PCI_DMA_TODEVICE));
1577
1578
1579 hp100_outl(ringptr->pdl_paddr, TX_PDA_L);
1580
1581 lp->txrcommit++;
1582
1583 dev->stats.tx_packets++;
1584 dev->stats.tx_bytes += skb->len;
1585
1586 spin_unlock_irqrestore(&lp->lock, flags);
1587
1588 return NETDEV_TX_OK;
1589
1590drop:
1591 dev_kfree_skb(skb);
1592 return NETDEV_TX_OK;
1593}
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603static void hp100_clean_txring(struct net_device *dev)
1604{
1605 struct hp100_private *lp = netdev_priv(dev);
1606 int ioaddr = dev->base_addr;
1607 int donecount;
1608
1609#ifdef HP100_DEBUG_B
1610 hp100_outw(0x4211, TRACE);
1611 printk("hp100: %s: clean txring\n", dev->name);
1612#endif
1613
1614
1615 donecount = (lp->txrcommit) - hp100_inb(TX_PDL);
1616
1617#ifdef HP100_DEBUG
1618 if (donecount > MAX_TX_PDL)
1619 printk("hp100: %s: Warning: More PDLs transmitted than committed to card???\n", dev->name);
1620#endif
1621
1622 for (; 0 != donecount; donecount--) {
1623#ifdef HP100_DEBUG_BM
1624 printk("hp100: %s: Free skb: data @0x%.8x txrcommit=0x%x TXPDL=0x%x, done=0x%x\n",
1625 dev->name, (u_int) lp->txrhead->skb->data,
1626 lp->txrcommit, hp100_inb(TX_PDL), donecount);
1627#endif
1628
1629 pci_unmap_single(lp->pci_dev, (dma_addr_t) lp->txrhead->pdl[1], lp->txrhead->pdl[2], PCI_DMA_TODEVICE);
1630 dev_kfree_skb_any(lp->txrhead->skb);
1631 lp->txrhead->skb = NULL;
1632 lp->txrhead = lp->txrhead->next;
1633 lp->txrcommit--;
1634 }
1635}
1636
1637
1638static netdev_tx_t hp100_start_xmit(struct sk_buff *skb,
1639 struct net_device *dev)
1640{
1641 unsigned long flags;
1642 int i, ok_flag;
1643 int ioaddr = dev->base_addr;
1644 u_short val;
1645 struct hp100_private *lp = netdev_priv(dev);
1646
1647#ifdef HP100_DEBUG_B
1648 hp100_outw(0x4212, TRACE);
1649 printk("hp100: %s: start_xmit\n", dev->name);
1650#endif
1651 if (skb->len <= 0)
1652 goto drop;
1653
1654 if (hp100_check_lan(dev))
1655 goto drop;
1656
1657
1658 i = hp100_inl(TX_MEM_FREE) & 0x7fffffff;
1659 if (!(((i / 2) - 539) > (skb->len + 16) && (hp100_inb(TX_PKT_CNT) < 255))) {
1660#ifdef HP100_DEBUG
1661 printk("hp100: %s: start_xmit: tx free mem = 0x%x\n", dev->name, i);
1662#endif
1663
1664 if (time_before(jiffies, dev_trans_start(dev) + HZ)) {
1665#ifdef HP100_DEBUG
1666 printk("hp100: %s: trans_start timing problem\n",
1667 dev->name);
1668#endif
1669 goto drop;
1670 }
1671 if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) {
1672
1673 printk("hp100: %s: login to 100Mb/s hub retry\n", dev->name);
1674 hp100_stop_interface(dev);
1675 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1676 hp100_start_interface(dev);
1677 } else {
1678 spin_lock_irqsave(&lp->lock, flags);
1679 hp100_ints_off();
1680 i = hp100_sense_lan(dev);
1681 hp100_ints_on();
1682 spin_unlock_irqrestore(&lp->lock, flags);
1683 if (i == HP100_LAN_ERR)
1684 printk("hp100: %s: link down detected\n", dev->name);
1685 else if (lp->lan_type != i) {
1686
1687 printk("hp100: %s: cable change 10Mb/s <-> 100Mb/s detected\n", dev->name);
1688 lp->lan_type = i;
1689 hp100_stop_interface(dev);
1690 if (lp->lan_type == HP100_LAN_100)
1691 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1692 hp100_start_interface(dev);
1693 } else {
1694 printk("hp100: %s: interface reset\n", dev->name);
1695 hp100_stop_interface(dev);
1696 if (lp->lan_type == HP100_LAN_100)
1697 lp->hub_status = hp100_login_to_vg_hub(dev, 0);
1698 hp100_start_interface(dev);
1699 mdelay(1);
1700 }
1701 }
1702 goto drop;
1703 }
1704
1705 for (i = 0; i < 6000 && (hp100_inb(OPTION_MSW) & HP100_TX_CMD); i++) {
1706#ifdef HP100_DEBUG_TX
1707 printk("hp100: %s: start_xmit: busy\n", dev->name);
1708#endif
1709 }
1710
1711 spin_lock_irqsave(&lp->lock, flags);
1712 hp100_ints_off();
1713 val = hp100_inw(IRQ_STATUS);
1714
1715
1716 hp100_outw(HP100_TX_COMPLETE, IRQ_STATUS);
1717#ifdef HP100_DEBUG_TX
1718 printk("hp100: %s: start_xmit: irq_status=0x%.4x, irqmask=0x%.4x, len=%d\n",
1719 dev->name, val, hp100_inw(IRQ_MASK), (int) skb->len);
1720#endif
1721
1722 ok_flag = skb->len >= HP100_MIN_PACKET_SIZE;
1723 i = ok_flag ? skb->len : HP100_MIN_PACKET_SIZE;
1724
1725 hp100_outw(i, DATA32);
1726 hp100_outw(i, FRAGMENT_LEN);
1727
1728 if (lp->mode == 2) {
1729
1730 memcpy_toio(lp->mem_ptr_virt, skb->data, (skb->len + 3) & ~3);
1731 if (!ok_flag)
1732 memset_io(lp->mem_ptr_virt, 0, HP100_MIN_PACKET_SIZE - skb->len);
1733 } else {
1734 outsl(ioaddr + HP100_REG_DATA32, skb->data,
1735 (skb->len + 3) >> 2);
1736 if (!ok_flag)
1737 for (i = (skb->len + 3) & ~3; i < HP100_MIN_PACKET_SIZE; i += 4)
1738 hp100_outl(0, DATA32);
1739 }
1740
1741 hp100_outb(HP100_TX_CMD | HP100_SET_LB, OPTION_MSW);
1742
1743 dev->stats.tx_packets++;
1744 dev->stats.tx_bytes += skb->len;
1745 hp100_ints_on();
1746 spin_unlock_irqrestore(&lp->lock, flags);
1747
1748 dev_kfree_skb_any(skb);
1749
1750#ifdef HP100_DEBUG_TX
1751 printk("hp100: %s: start_xmit: end\n", dev->name);
1752#endif
1753
1754 return NETDEV_TX_OK;
1755
1756drop:
1757 dev_kfree_skb(skb);
1758 return NETDEV_TX_OK;
1759
1760}
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772static void hp100_rx(struct net_device *dev)
1773{
1774 int packets, pkt_len;
1775 int ioaddr = dev->base_addr;
1776 struct hp100_private *lp = netdev_priv(dev);
1777 u_int header;
1778 struct sk_buff *skb;
1779
1780#ifdef DEBUG_B
1781 hp100_outw(0x4213, TRACE);
1782 printk("hp100: %s: rx\n", dev->name);
1783#endif
1784
1785
1786
1787
1788 packets = hp100_inb(RX_PKT_CNT);
1789#ifdef HP100_DEBUG_RX
1790 if (packets > 1)
1791 printk("hp100: %s: rx: waiting packets = %d\n", dev->name, packets);
1792#endif
1793
1794 while (packets-- > 0) {
1795
1796
1797 for (pkt_len = 0; pkt_len < 6000 && (hp100_inb(OPTION_MSW) & HP100_ADV_NXT_PKT); pkt_len++) {
1798#ifdef HP100_DEBUG_RX
1799 printk ("hp100: %s: rx: busy, remaining packets = %d\n", dev->name, packets);
1800#endif
1801 }
1802
1803
1804
1805 if (lp->mode == 2) {
1806 header = readl(lp->mem_ptr_virt);
1807 } else
1808 header = hp100_inl(DATA32);
1809
1810 pkt_len = ((header & HP100_PKT_LEN_MASK) + 3) & ~3;
1811
1812#ifdef HP100_DEBUG_RX
1813 printk("hp100: %s: rx: new packet - length=%d, errors=0x%x, dest=0x%x\n",
1814 dev->name, header & HP100_PKT_LEN_MASK,
1815 (header >> 16) & 0xfff8, (header >> 16) & 7);
1816#endif
1817
1818
1819 skb = netdev_alloc_skb(dev, pkt_len + 2);
1820 if (skb == NULL) {
1821#ifdef HP100_DEBUG
1822 printk("hp100: %s: rx: couldn't allocate a sk_buff of size %d\n",
1823 dev->name, pkt_len);
1824#endif
1825 dev->stats.rx_dropped++;
1826 } else {
1827
1828 u_char *ptr;
1829
1830 skb_reserve(skb,2);
1831
1832
1833 skb_put(skb, pkt_len);
1834 ptr = skb->data;
1835
1836
1837 if (lp->mode == 2)
1838 memcpy_fromio(ptr, lp->mem_ptr_virt,pkt_len);
1839 else
1840 insl(ioaddr + HP100_REG_DATA32, ptr, pkt_len >> 2);
1841
1842 skb->protocol = eth_type_trans(skb, dev);
1843
1844#ifdef HP100_DEBUG_RX
1845 printk("hp100: %s: rx: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
1846 dev->name, ptr[0], ptr[1], ptr[2], ptr[3],
1847 ptr[4], ptr[5], ptr[6], ptr[7], ptr[8],
1848 ptr[9], ptr[10], ptr[11]);
1849#endif
1850 netif_rx(skb);
1851 dev->stats.rx_packets++;
1852 dev->stats.rx_bytes += pkt_len;
1853 }
1854
1855
1856 hp100_outb(HP100_ADV_NXT_PKT | HP100_SET_LB, OPTION_MSW);
1857
1858 switch (header & 0x00070000) {
1859 case (HP100_MULTI_ADDR_HASH << 16):
1860 case (HP100_MULTI_ADDR_NO_HASH << 16):
1861 dev->stats.multicast++;
1862 break;
1863 }
1864 }
1865#ifdef HP100_DEBUG_RX
1866 printk("hp100_rx: %s: end\n", dev->name);
1867#endif
1868}
1869
1870
1871
1872
1873static void hp100_rx_bm(struct net_device *dev)
1874{
1875 int ioaddr = dev->base_addr;
1876 struct hp100_private *lp = netdev_priv(dev);
1877 hp100_ring_t *ptr;
1878 u_int header;
1879 int pkt_len;
1880
1881#ifdef HP100_DEBUG_B
1882 hp100_outw(0x4214, TRACE);
1883 printk("hp100: %s: rx_bm\n", dev->name);
1884#endif
1885
1886#ifdef HP100_DEBUG
1887 if (0 == lp->rxrcommit) {
1888 printk("hp100: %s: rx_bm called although no PDLs were committed to adapter?\n", dev->name);
1889 return;
1890 } else
1891
1892
1893 if ((hp100_inw(RX_PKT_CNT) & 0x00ff) >= lp->rxrcommit) {
1894 printk("hp100: %s: More packets received than committed? RX_PKT_CNT=0x%x, commit=0x%x\n",
1895 dev->name, hp100_inw(RX_PKT_CNT) & 0x00ff,
1896 lp->rxrcommit);
1897 return;
1898 }
1899#endif
1900
1901 while ((lp->rxrcommit > hp100_inb(RX_PDL))) {
1902
1903
1904
1905
1906
1907
1908
1909
1910 ptr = lp->rxrhead;
1911
1912 header = *(ptr->pdl - 1);
1913 pkt_len = (header & HP100_PKT_LEN_MASK);
1914
1915
1916 pci_unmap_single(lp->pci_dev, (dma_addr_t) ptr->pdl[3], MAX_ETHER_SIZE, PCI_DMA_FROMDEVICE);
1917
1918#ifdef HP100_DEBUG_BM
1919 printk("hp100: %s: rx_bm: header@0x%x=0x%x length=%d, errors=0x%x, dest=0x%x\n",
1920 dev->name, (u_int) (ptr->pdl - 1), (u_int) header,
1921 pkt_len, (header >> 16) & 0xfff8, (header >> 16) & 7);
1922 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",
1923 dev->name, hp100_inb(RX_PDL), hp100_inb(TX_PDL),
1924 hp100_inb(RX_PKT_CNT), (u_int) * (ptr->pdl),
1925 (u_int) * (ptr->pdl + 3), (u_int) * (ptr->pdl + 4));
1926#endif
1927
1928 if ((pkt_len >= MIN_ETHER_SIZE) &&
1929 (pkt_len <= MAX_ETHER_SIZE)) {
1930 if (ptr->skb == NULL) {
1931 printk("hp100: %s: rx_bm: skb null\n", dev->name);
1932
1933 dev->stats.rx_dropped++;
1934 } else {
1935 skb_trim(ptr->skb, pkt_len);
1936 ptr->skb->protocol =
1937 eth_type_trans(ptr->skb, dev);
1938
1939 netif_rx(ptr->skb);
1940
1941 dev->stats.rx_packets++;
1942 dev->stats.rx_bytes += pkt_len;
1943 }
1944
1945 switch (header & 0x00070000) {
1946 case (HP100_MULTI_ADDR_HASH << 16):
1947 case (HP100_MULTI_ADDR_NO_HASH << 16):
1948 dev->stats.multicast++;
1949 break;
1950 }
1951 } else {
1952#ifdef HP100_DEBUG
1953 printk("hp100: %s: rx_bm: Received bad packet (length=%d)\n", dev->name, pkt_len);
1954#endif
1955 if (ptr->skb != NULL)
1956 dev_kfree_skb_any(ptr->skb);
1957 dev->stats.rx_errors++;
1958 }
1959
1960 lp->rxrhead = lp->rxrhead->next;
1961
1962
1963 if (0 == hp100_build_rx_pdl(lp->rxrtail, dev)) {
1964
1965#ifdef HP100_DEBUG
1966 printk("hp100: %s: rx_bm: No space for new PDL.\n", dev->name);
1967#endif
1968 return;
1969 } else {
1970 hp100_outl((u32) lp->rxrtail->pdl_paddr, RX_PDA);
1971 lp->rxrtail = lp->rxrtail->next;
1972 }
1973
1974 }
1975}
1976
1977
1978
1979
1980static struct net_device_stats *hp100_get_stats(struct net_device *dev)
1981{
1982 unsigned long flags;
1983 int ioaddr = dev->base_addr;
1984 struct hp100_private *lp = netdev_priv(dev);
1985
1986#ifdef HP100_DEBUG_B
1987 hp100_outw(0x4215, TRACE);
1988#endif
1989
1990 spin_lock_irqsave(&lp->lock, flags);
1991 hp100_ints_off();
1992 hp100_update_stats(dev);
1993 hp100_ints_on();
1994 spin_unlock_irqrestore(&lp->lock, flags);
1995 return &(dev->stats);
1996}
1997
1998static void hp100_update_stats(struct net_device *dev)
1999{
2000 int ioaddr = dev->base_addr;
2001 u_short val;
2002
2003#ifdef HP100_DEBUG_B
2004 hp100_outw(0x4216, TRACE);
2005 printk("hp100: %s: update-stats\n", dev->name);
2006#endif
2007
2008
2009 hp100_page(MAC_CTRL);
2010 val = hp100_inw(DROPPED) & 0x0fff;
2011 dev->stats.rx_errors += val;
2012 dev->stats.rx_over_errors += val;
2013 val = hp100_inb(CRC);
2014 dev->stats.rx_errors += val;
2015 dev->stats.rx_crc_errors += val;
2016 val = hp100_inb(ABORT);
2017 dev->stats.tx_errors += val;
2018 dev->stats.tx_aborted_errors += val;
2019 hp100_page(PERFORMANCE);
2020}
2021
2022static void hp100_misc_interrupt(struct net_device *dev)
2023{
2024#ifdef HP100_DEBUG_B
2025 int ioaddr = dev->base_addr;
2026#endif
2027
2028#ifdef HP100_DEBUG_B
2029 int ioaddr = dev->base_addr;
2030 hp100_outw(0x4216, TRACE);
2031 printk("hp100: %s: misc_interrupt\n", dev->name);
2032#endif
2033
2034
2035 dev->stats.rx_errors++;
2036 dev->stats.tx_errors++;
2037}
2038
2039static void hp100_clear_stats(struct hp100_private *lp, int ioaddr)
2040{
2041 unsigned long flags;
2042
2043#ifdef HP100_DEBUG_B
2044 hp100_outw(0x4217, TRACE);
2045 printk("hp100: %s: clear_stats\n", dev->name);
2046#endif
2047
2048 spin_lock_irqsave(&lp->lock, flags);
2049 hp100_page(MAC_CTRL);
2050 hp100_inw(DROPPED);
2051 hp100_inb(CRC);
2052 hp100_inb(ABORT);
2053 hp100_page(PERFORMANCE);
2054 spin_unlock_irqrestore(&lp->lock, flags);
2055}
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066static void hp100_set_multicast_list(struct net_device *dev)
2067{
2068 unsigned long flags;
2069 int ioaddr = dev->base_addr;
2070 struct hp100_private *lp = netdev_priv(dev);
2071
2072#ifdef HP100_DEBUG_B
2073 hp100_outw(0x4218, TRACE);
2074 printk("hp100: %s: set_mc_list\n", dev->name);
2075#endif
2076
2077 spin_lock_irqsave(&lp->lock, flags);
2078 hp100_ints_off();
2079 hp100_page(MAC_CTRL);
2080 hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
2081
2082 if (dev->flags & IFF_PROMISC) {
2083 lp->mac2_mode = HP100_MAC2MODE6;
2084 lp->mac1_mode = HP100_MAC1MODE6;
2085 memset(&lp->hash_bytes, 0xff, 8);
2086 } else if (!netdev_mc_empty(dev) || (dev->flags & IFF_ALLMULTI)) {
2087 lp->mac2_mode = HP100_MAC2MODE5;
2088 lp->mac1_mode = HP100_MAC1MODE5;
2089#ifdef HP100_MULTICAST_FILTER
2090 if (dev->flags & IFF_ALLMULTI) {
2091
2092 memset(&lp->hash_bytes, 0xff, 8);
2093 } else {
2094 int i, idx;
2095 u_char *addrs;
2096 struct netdev_hw_addr *ha;
2097
2098 memset(&lp->hash_bytes, 0x00, 8);
2099#ifdef HP100_DEBUG
2100 printk("hp100: %s: computing hash filter - mc_count = %i\n",
2101 dev->name, netdev_mc_count(dev));
2102#endif
2103 netdev_for_each_mc_addr(ha, dev) {
2104 addrs = ha->addr;
2105#ifdef HP100_DEBUG
2106 printk("hp100: %s: multicast = %pM, ",
2107 dev->name, addrs);
2108#endif
2109 for (i = idx = 0; i < 6; i++) {
2110 idx ^= *addrs++ & 0x3f;
2111 printk(":%02x:", idx);
2112 }
2113#ifdef HP100_DEBUG
2114 printk("idx = %i\n", idx);
2115#endif
2116 lp->hash_bytes[idx >> 3] |= (1 << (idx & 7));
2117 }
2118 }
2119#else
2120 memset(&lp->hash_bytes, 0xff, 8);
2121#endif
2122 } else {
2123 lp->mac2_mode = HP100_MAC2MODE3;
2124 lp->mac1_mode = HP100_MAC1MODE3;
2125 memset(&lp->hash_bytes, 0x00, 8);
2126 }
2127
2128 if (((hp100_inb(MAC_CFG_1) & 0x0f) != lp->mac1_mode) ||
2129 (hp100_inb(MAC_CFG_2) != lp->mac2_mode)) {
2130 int i;
2131
2132 hp100_outb(lp->mac2_mode, MAC_CFG_2);
2133 hp100_andb(HP100_MAC1MODEMASK, MAC_CFG_1);
2134 hp100_orb(lp->mac1_mode, MAC_CFG_1);
2135
2136 hp100_page(MAC_ADDRESS);
2137 for (i = 0; i < 8; i++)
2138 hp100_outb(lp->hash_bytes[i], HASH_BYTE0 + i);
2139#ifdef HP100_DEBUG
2140 printk("hp100: %s: mac1 = 0x%x, mac2 = 0x%x, multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
2141 dev->name, lp->mac1_mode, lp->mac2_mode,
2142 lp->hash_bytes[0], lp->hash_bytes[1],
2143 lp->hash_bytes[2], lp->hash_bytes[3],
2144 lp->hash_bytes[4], lp->hash_bytes[5],
2145 lp->hash_bytes[6], lp->hash_bytes[7]);
2146#endif
2147
2148 if (lp->lan_type == HP100_LAN_100) {
2149#ifdef HP100_DEBUG
2150 printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name);
2151#endif
2152 lp->hub_status = hp100_login_to_vg_hub(dev, 1);
2153 }
2154 } else {
2155 int i;
2156 u_char old_hash_bytes[8];
2157
2158 hp100_page(MAC_ADDRESS);
2159 for (i = 0; i < 8; i++)
2160 old_hash_bytes[i] = hp100_inb(HASH_BYTE0 + i);
2161 if (memcmp(old_hash_bytes, &lp->hash_bytes, 8)) {
2162 for (i = 0; i < 8; i++)
2163 hp100_outb(lp->hash_bytes[i], HASH_BYTE0 + i);
2164#ifdef HP100_DEBUG
2165 printk("hp100: %s: multicast hash = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
2166 dev->name, lp->hash_bytes[0],
2167 lp->hash_bytes[1], lp->hash_bytes[2],
2168 lp->hash_bytes[3], lp->hash_bytes[4],
2169 lp->hash_bytes[5], lp->hash_bytes[6],
2170 lp->hash_bytes[7]);
2171#endif
2172
2173 if (lp->lan_type == HP100_LAN_100) {
2174#ifdef HP100_DEBUG
2175 printk("hp100: %s: 100VG MAC settings have changed - relogin.\n", dev->name);
2176#endif
2177 lp->hub_status = hp100_login_to_vg_hub(dev, 1);
2178 }
2179 }
2180 }
2181
2182 hp100_page(MAC_CTRL);
2183 hp100_orb(HP100_RX_EN | HP100_RX_IDLE |
2184 HP100_TX_EN | HP100_TX_IDLE, MAC_CFG_1);
2185
2186 hp100_page(PERFORMANCE);
2187 hp100_ints_on();
2188 spin_unlock_irqrestore(&lp->lock, flags);
2189}
2190
2191
2192
2193
2194
2195static irqreturn_t hp100_interrupt(int irq, void *dev_id)
2196{
2197 struct net_device *dev = (struct net_device *) dev_id;
2198 struct hp100_private *lp = netdev_priv(dev);
2199
2200 int ioaddr;
2201 u_int val;
2202
2203 if (dev == NULL)
2204 return IRQ_NONE;
2205 ioaddr = dev->base_addr;
2206
2207 spin_lock(&lp->lock);
2208
2209 hp100_ints_off();
2210
2211#ifdef HP100_DEBUG_B
2212 hp100_outw(0x4219, TRACE);
2213#endif
2214
2215
2216 val = hp100_inw(IRQ_STATUS);
2217#ifdef HP100_DEBUG_IRQ
2218 printk("hp100: %s: mode=%x,IRQ_STAT=0x%.4x,RXPKTCNT=0x%.2x RXPDL=0x%.2x TXPKTCNT=0x%.2x TXPDL=0x%.2x\n",
2219 dev->name, lp->mode, (u_int) val, hp100_inb(RX_PKT_CNT),
2220 hp100_inb(RX_PDL), hp100_inb(TX_PKT_CNT), hp100_inb(TX_PDL));
2221#endif
2222
2223 if (val == 0) {
2224 spin_unlock(&lp->lock);
2225 hp100_ints_on();
2226 return IRQ_NONE;
2227 }
2228
2229
2230
2231
2232
2233
2234
2235
2236 if (val & HP100_RX_PDL_FILL_COMPL) {
2237 if (lp->mode == 1)
2238 hp100_rx_bm(dev);
2239 else {
2240 printk("hp100: %s: rx_pdl_fill_compl interrupt although not busmaster?\n", dev->name);
2241 }
2242 }
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252 if (val & HP100_RX_PACKET) {
2253 if (lp->mode != 1)
2254 hp100_rx(dev);
2255 else if (!(val & HP100_RX_PDL_FILL_COMPL)) {
2256
2257 hp100_rx_bm(dev);
2258 }
2259 }
2260
2261
2262
2263
2264
2265
2266
2267 hp100_outw(val, IRQ_STATUS);
2268
2269
2270
2271
2272
2273
2274
2275 if (val & (HP100_TX_ERROR | HP100_RX_ERROR)) {
2276#ifdef HP100_DEBUG_IRQ
2277 printk("hp100: %s: TX/RX Error IRQ\n", dev->name);
2278#endif
2279 hp100_update_stats(dev);
2280 if (lp->mode == 1) {
2281 hp100_rxfill(dev);
2282 hp100_clean_txring(dev);
2283 }
2284 }
2285
2286
2287
2288
2289 if ((lp->mode == 1) && (val & (HP100_RX_PDA_ZERO)))
2290 hp100_rxfill(dev);
2291
2292
2293
2294
2295
2296 if ((lp->mode == 1) && (val & (HP100_TX_COMPLETE)))
2297 hp100_clean_txring(dev);
2298
2299
2300
2301
2302
2303 if (val & HP100_MISC_ERROR) {
2304#ifdef HP100_DEBUG_IRQ
2305 printk
2306 ("hp100: %s: Misc. Error Interrupt - Check cabling.\n",
2307 dev->name);
2308#endif
2309 if (lp->mode == 1) {
2310 hp100_clean_txring(dev);
2311 hp100_rxfill(dev);
2312 }
2313 hp100_misc_interrupt(dev);
2314 }
2315
2316 spin_unlock(&lp->lock);
2317 hp100_ints_on();
2318 return IRQ_HANDLED;
2319}
2320
2321
2322
2323
2324
2325static void hp100_start_interface(struct net_device *dev)
2326{
2327 unsigned long flags;
2328 int ioaddr = dev->base_addr;
2329 struct hp100_private *lp = netdev_priv(dev);
2330
2331#ifdef HP100_DEBUG_B
2332 hp100_outw(0x4220, TRACE);
2333 printk("hp100: %s: hp100_start_interface\n", dev->name);
2334#endif
2335
2336 spin_lock_irqsave(&lp->lock, flags);
2337
2338
2339
2340 hp100_page(PERFORMANCE);
2341 hp100_outw(0xfefe, IRQ_MASK);
2342 hp100_outw(0xffff, IRQ_STATUS);
2343 hp100_outw(HP100_FAKE_INT | HP100_INT_EN | HP100_RESET_LB,
2344 OPTION_LSW);
2345
2346 hp100_outw(HP100_TRI_INT | HP100_RESET_HB, OPTION_LSW);
2347
2348 if (lp->mode == 1) {
2349
2350 hp100_page(HW_MAP);
2351 hp100_orb(HP100_BM_MASTER, BM);
2352 hp100_rxfill(dev);
2353 } else if (lp->mode == 2) {
2354
2355 hp100_outw(HP100_MMAP_DIS | HP100_RESET_HB, OPTION_LSW);
2356 }
2357
2358 hp100_page(PERFORMANCE);
2359 hp100_outw(0xfefe, IRQ_MASK);
2360 hp100_outw(0xffff, IRQ_STATUS);
2361
2362
2363 if (lp->mode == 1) {
2364 hp100_outw(HP100_RX_PDL_FILL_COMPL |
2365 HP100_RX_PDA_ZERO | HP100_RX_ERROR |
2366
2367 HP100_SET_HB |
2368
2369 HP100_TX_COMPLETE |
2370
2371 HP100_TX_ERROR | HP100_SET_LB, IRQ_MASK);
2372 } else {
2373 hp100_outw(HP100_RX_PACKET |
2374 HP100_RX_ERROR | HP100_SET_HB |
2375 HP100_TX_ERROR | HP100_SET_LB, IRQ_MASK);
2376 }
2377
2378
2379
2380 spin_unlock_irqrestore(&lp->lock, flags);
2381
2382
2383 hp100_set_multicast_list(dev);
2384}
2385
2386static void hp100_stop_interface(struct net_device *dev)
2387{
2388 struct hp100_private *lp = netdev_priv(dev);
2389 int ioaddr = dev->base_addr;
2390 u_int val;
2391
2392#ifdef HP100_DEBUG_B
2393 printk("hp100: %s: hp100_stop_interface\n", dev->name);
2394 hp100_outw(0x4221, TRACE);
2395#endif
2396
2397 if (lp->mode == 1)
2398 hp100_BM_shutdown(dev);
2399 else {
2400
2401 hp100_outw(HP100_INT_EN | HP100_RESET_LB |
2402 HP100_TRI_INT | HP100_MMAP_DIS | HP100_SET_HB,
2403 OPTION_LSW);
2404 val = hp100_inw(OPTION_LSW);
2405
2406 hp100_page(MAC_CTRL);
2407 hp100_andb(~(HP100_RX_EN | HP100_TX_EN), MAC_CFG_1);
2408
2409 if (!(val & HP100_HW_RST))
2410 return;
2411
2412 for (val = 0; val < 6000; val++)
2413 if ((hp100_inb(MAC_CFG_1) & (HP100_TX_IDLE | HP100_RX_IDLE)) == (HP100_TX_IDLE | HP100_RX_IDLE)) {
2414 hp100_page(PERFORMANCE);
2415 return;
2416 }
2417 printk("hp100: %s: hp100_stop_interface - timeout\n", dev->name);
2418 hp100_page(PERFORMANCE);
2419 }
2420}
2421
2422static void hp100_load_eeprom(struct net_device *dev, u_short probe_ioaddr)
2423{
2424 int i;
2425 int ioaddr = probe_ioaddr > 0 ? probe_ioaddr : dev->base_addr;
2426
2427#ifdef HP100_DEBUG_B
2428 hp100_outw(0x4222, TRACE);
2429#endif
2430
2431 hp100_page(EEPROM_CTRL);
2432 hp100_andw(~HP100_EEPROM_LOAD, EEPROM_CTRL);
2433 hp100_orw(HP100_EEPROM_LOAD, EEPROM_CTRL);
2434 for (i = 0; i < 10000; i++)
2435 if (!(hp100_inb(OPTION_MSW) & HP100_EE_LOAD))
2436 return;
2437 printk("hp100: %s: hp100_load_eeprom - timeout\n", dev->name);
2438}
2439
2440
2441
2442
2443
2444
2445static int hp100_sense_lan(struct net_device *dev)
2446{
2447 int ioaddr = dev->base_addr;
2448 u_short val_VG, val_10;
2449 struct hp100_private *lp = netdev_priv(dev);
2450
2451#ifdef HP100_DEBUG_B
2452 hp100_outw(0x4223, TRACE);
2453#endif
2454
2455 hp100_page(MAC_CTRL);
2456 val_10 = hp100_inb(10_LAN_CFG_1);
2457 val_VG = hp100_inb(VG_LAN_CFG_1);
2458 hp100_page(PERFORMANCE);
2459#ifdef HP100_DEBUG
2460 printk("hp100: %s: sense_lan: val_VG = 0x%04x, val_10 = 0x%04x\n",
2461 dev->name, val_VG, val_10);
2462#endif
2463
2464 if (val_10 & HP100_LINK_BEAT_ST)
2465 return HP100_LAN_10;
2466
2467 if (val_10 & HP100_AUI_ST) {
2468
2469
2470
2471
2472
2473 val_10 |= HP100_AUI_SEL | HP100_LOW_TH;
2474 hp100_page(MAC_CTRL);
2475 hp100_outb(val_10, 10_LAN_CFG_1);
2476 hp100_page(PERFORMANCE);
2477 return HP100_LAN_COAX;
2478 }
2479
2480
2481 if ( !strcmp(lp->id, "HWP1920") ||
2482 (lp->pci_dev &&
2483 lp->pci_dev->vendor == PCI_VENDOR_ID &&
2484 (lp->pci_dev->device == PCI_DEVICE_ID_HP_J2970A ||
2485 lp->pci_dev->device == PCI_DEVICE_ID_HP_J2973A)))
2486 return HP100_LAN_ERR;
2487
2488 if (val_VG & HP100_LINK_CABLE_ST)
2489 return HP100_LAN_100;
2490 return HP100_LAN_ERR;
2491}
2492
2493static int hp100_down_vg_link(struct net_device *dev)
2494{
2495 struct hp100_private *lp = netdev_priv(dev);
2496 int ioaddr = dev->base_addr;
2497 unsigned long time;
2498 long savelan, newlan;
2499
2500#ifdef HP100_DEBUG_B
2501 hp100_outw(0x4224, TRACE);
2502 printk("hp100: %s: down_vg_link\n", dev->name);
2503#endif
2504
2505 hp100_page(MAC_CTRL);
2506 time = jiffies + (HZ / 4);
2507 do {
2508 if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
2509 break;
2510 if (!in_interrupt())
2511 schedule_timeout_interruptible(1);
2512 } while (time_after(time, jiffies));
2513
2514 if (time_after_eq(jiffies, time))
2515 return 0;
2516
2517
2518
2519 hp100_andb(~(HP100_LOAD_ADDR | HP100_LINK_CMD), VG_LAN_CFG_1);
2520 hp100_orb(HP100_VG_SEL, VG_LAN_CFG_1);
2521
2522
2523 time = jiffies + (HZ / 2);
2524 do {
2525 if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
2526 break;
2527 if (!in_interrupt())
2528 schedule_timeout_interruptible(1);
2529 } while (time_after(time, jiffies));
2530
2531#ifdef HP100_DEBUG
2532 if (time_after_eq(jiffies, time))
2533 printk("hp100: %s: down_vg_link: Link does not go down?\n", dev->name);
2534#endif
2535
2536
2537
2538
2539 if (lp->chip == HP100_CHIPID_LASSEN) {
2540
2541
2542 hp100_andb(~HP100_VG_RESET, VG_LAN_CFG_1);
2543 udelay(1500);
2544 hp100_orb(HP100_VG_RESET, VG_LAN_CFG_1);
2545 udelay(1500);
2546 }
2547
2548
2549
2550
2551
2552
2553 if (lp->chip == HP100_CHIPID_LASSEN) {
2554
2555 savelan = newlan = hp100_inl(10_LAN_CFG_1);
2556 newlan &= ~(HP100_VG_SEL << 16);
2557 newlan |= (HP100_DOT3_MAC) << 8;
2558 hp100_andb(~HP100_AUTO_MODE, MAC_CFG_3);
2559 hp100_outl(newlan, 10_LAN_CFG_1);
2560
2561
2562 time = jiffies + (HZ * 5);
2563 do {
2564 if (!(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST))
2565 break;
2566 if (!in_interrupt())
2567 schedule_timeout_interruptible(1);
2568 } while (time_after(time, jiffies));
2569
2570 hp100_orb(HP100_AUTO_MODE, MAC_CFG_3);
2571 hp100_outl(savelan, 10_LAN_CFG_1);
2572 }
2573
2574 time = jiffies + (3 * HZ);
2575 do {
2576 if ((hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) == 0)
2577 break;
2578 if (!in_interrupt())
2579 schedule_timeout_interruptible(1);
2580 } while (time_after(time, jiffies));
2581
2582 if (time_before_eq(time, jiffies)) {
2583#ifdef HP100_DEBUG
2584 printk("hp100: %s: down_vg_link: timeout\n", dev->name);
2585#endif
2586 return -EIO;
2587 }
2588
2589 time = jiffies + (2 * HZ);
2590 do {
2591 if (!in_interrupt())
2592 schedule_timeout_interruptible(1);
2593 } while (time_after(time, jiffies));
2594
2595 return 0;
2596}
2597
2598static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin)
2599{
2600 int ioaddr = dev->base_addr;
2601 struct hp100_private *lp = netdev_priv(dev);
2602 u_short val = 0;
2603 unsigned long time;
2604 int startst;
2605
2606#ifdef HP100_DEBUG_B
2607 hp100_outw(0x4225, TRACE);
2608 printk("hp100: %s: login_to_vg_hub\n", dev->name);
2609#endif
2610
2611
2612
2613
2614
2615 hp100_page(MAC_CTRL);
2616 startst = hp100_inb(VG_LAN_CFG_1);
2617 if ((force_relogin == 1) || (hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST)) {
2618#ifdef HP100_DEBUG_TRAINING
2619 printk("hp100: %s: Start training\n", dev->name);
2620#endif
2621
2622
2623 hp100_orb(HP100_VG_RESET, VG_LAN_CFG_1);
2624
2625
2626
2627 if ((lp->chip == HP100_CHIPID_LASSEN) && (startst & HP100_LINK_CABLE_ST))
2628 hp100_andb(~HP100_DOT3_MAC, 10_LAN_CFG_2);
2629
2630
2631 hp100_andb(~(HP100_LINK_CMD ), VG_LAN_CFG_1);
2632
2633#ifdef HP100_DEBUG_TRAINING
2634 printk("hp100: %s: Bring down the link\n", dev->name);
2635#endif
2636
2637
2638 time = jiffies + (HZ / 10);
2639 do {
2640 if (~(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST))
2641 break;
2642 if (!in_interrupt())
2643 schedule_timeout_interruptible(1);
2644 } while (time_after(time, jiffies));
2645
2646
2647 if ((dev->flags) & IFF_PROMISC) {
2648 hp100_orb(HP100_PROM_MODE, VG_LAN_CFG_2);
2649 if (lp->chip == HP100_CHIPID_LASSEN)
2650 hp100_orw(HP100_MACRQ_PROMSC, TRAIN_REQUEST);
2651 } else {
2652 hp100_andb(~HP100_PROM_MODE, VG_LAN_CFG_2);
2653
2654
2655
2656 if (lp->chip == HP100_CHIPID_LASSEN) {
2657 hp100_andw(~HP100_MACRQ_PROMSC, TRAIN_REQUEST);
2658 }
2659 }
2660
2661
2662 if (lp->chip == HP100_CHIPID_LASSEN)
2663 hp100_orb(HP100_MACRQ_FRAMEFMT_EITHER, TRAIN_REQUEST);
2664
2665 hp100_orb(HP100_LINK_CMD | HP100_LOAD_ADDR | HP100_VG_RESET, VG_LAN_CFG_1);
2666
2667
2668
2669
2670
2671
2672
2673 hp100_page(MAC_CTRL);
2674 time = jiffies + (1 * HZ);
2675 do {
2676 if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST)
2677 break;
2678 if (!in_interrupt())
2679 schedule_timeout_interruptible(1);
2680 } while (time_before(jiffies, time));
2681
2682 if (time_after_eq(jiffies, time)) {
2683#ifdef HP100_DEBUG_TRAINING
2684 printk("hp100: %s: Link cable status not ok? Training aborted.\n", dev->name);
2685#endif
2686 } else {
2687#ifdef HP100_DEBUG_TRAINING
2688 printk
2689 ("hp100: %s: HUB tones detected. Trying to train.\n",
2690 dev->name);
2691#endif
2692
2693 time = jiffies + (2 * HZ);
2694 do {
2695 val = hp100_inb(VG_LAN_CFG_1);
2696 if ((val & (HP100_LINK_UP_ST))) {
2697#ifdef HP100_DEBUG_TRAINING
2698 printk("hp100: %s: Passed training.\n", dev->name);
2699#endif
2700 break;
2701 }
2702 if (!in_interrupt())
2703 schedule_timeout_interruptible(1);
2704 } while (time_after(time, jiffies));
2705 }
2706
2707
2708 if (time_before_eq(jiffies, time) && (val & HP100_LINK_UP_ST)) {
2709#ifdef HP100_DEBUG_TRAINING
2710 printk("hp100: %s: Successfully logged into the HUB.\n", dev->name);
2711 if (lp->chip == HP100_CHIPID_LASSEN) {
2712 val = hp100_inw(TRAIN_ALLOW);
2713 printk("hp100: %s: Card supports 100VG MAC Version \"%s\" ",
2714 dev->name, (hp100_inw(TRAIN_REQUEST) & HP100_CARD_MACVER) ? "802.12" : "Pre");
2715 printk("Driver will use MAC Version \"%s\"\n", (val & HP100_HUB_MACVER) ? "802.12" : "Pre");
2716 printk("hp100: %s: Frame format is %s.\n", dev->name, (val & HP100_MALLOW_FRAMEFMT) ? "802.5" : "802.3");
2717 }
2718#endif
2719 } else {
2720
2721 printk("hp100: %s: Problem logging into the HUB.\n", dev->name);
2722 if (lp->chip == HP100_CHIPID_LASSEN) {
2723
2724 val = hp100_inw(TRAIN_ALLOW);
2725#ifdef HP100_DEBUG_TRAINING
2726 printk("hp100: %s: MAC Configuration requested: 0x%04x, HUB allowed: 0x%04x\n", dev->name, hp100_inw(TRAIN_REQUEST), val);
2727#endif
2728 if (val & HP100_MALLOW_ACCDENIED)
2729 printk("hp100: %s: HUB access denied.\n", dev->name);
2730 if (val & HP100_MALLOW_CONFIGURE)
2731 printk("hp100: %s: MAC Configuration is incompatible with the Network.\n", dev->name);
2732 if (val & HP100_MALLOW_DUPADDR)
2733 printk("hp100: %s: Duplicate MAC Address on the Network.\n", dev->name);
2734 }
2735 }
2736
2737
2738
2739
2740 if ((lp->chip == HP100_CHIPID_LASSEN) && (startst & HP100_LINK_CABLE_ST)) {
2741 hp100_page(MAC_CTRL);
2742 hp100_orb(HP100_DOT3_MAC, 10_LAN_CFG_2);
2743 }
2744
2745 val = hp100_inb(VG_LAN_CFG_1);
2746
2747
2748 hp100_page(PERFORMANCE);
2749 hp100_outw(HP100_MISC_ERROR, IRQ_STATUS);
2750
2751 if (val & HP100_LINK_UP_ST)
2752 return 0;
2753 else {
2754 printk("hp100: %s: Training failed.\n", dev->name);
2755 hp100_down_vg_link(dev);
2756 return -EIO;
2757 }
2758 }
2759
2760 return -EIO;
2761}
2762
2763static void hp100_cascade_reset(struct net_device *dev, u_short enable)
2764{
2765 int ioaddr = dev->base_addr;
2766 struct hp100_private *lp = netdev_priv(dev);
2767
2768#ifdef HP100_DEBUG_B
2769 hp100_outw(0x4226, TRACE);
2770 printk("hp100: %s: cascade_reset\n", dev->name);
2771#endif
2772
2773 if (enable) {
2774 hp100_outw(HP100_HW_RST | HP100_RESET_LB, OPTION_LSW);
2775 if (lp->chip == HP100_CHIPID_LASSEN) {
2776
2777 hp100_page(HW_MAP);
2778 hp100_andb(~HP100_PCI_RESET, PCICTRL2);
2779 hp100_orb(HP100_PCI_RESET, PCICTRL2);
2780
2781
2782
2783 udelay(400);
2784 hp100_andb(~HP100_PCI_RESET, PCICTRL2);
2785 hp100_page(PERFORMANCE);
2786 }
2787 } else {
2788 hp100_outw(HP100_HW_RST | HP100_SET_LB, OPTION_LSW);
2789 udelay(400);
2790 hp100_page(PERFORMANCE);
2791 }
2792}
2793
2794#ifdef HP100_DEBUG
2795void hp100_RegisterDump(struct net_device *dev)
2796{
2797 int ioaddr = dev->base_addr;
2798 int Page;
2799 int Register;
2800
2801
2802 printk("hp100: %s: Cascade Register Dump\n", dev->name);
2803 printk("hardware id #1: 0x%.2x\n", hp100_inb(HW_ID));
2804 printk("hardware id #2/paging: 0x%.2x\n", hp100_inb(PAGING));
2805 printk("option #1: 0x%.4x\n", hp100_inw(OPTION_LSW));
2806 printk("option #2: 0x%.4x\n", hp100_inw(OPTION_MSW));
2807
2808
2809 for (Page = 0; Page < 8; Page++) {
2810
2811 printk("page: 0x%.2x\n", Page);
2812 outw(Page, ioaddr + 0x02);
2813 for (Register = 0x8; Register < 0x22; Register += 2) {
2814
2815 if (((Register != 0x10) && (Register != 0x12)) || (Page > 0)) {
2816 printk("0x%.2x = 0x%.4x\n", Register, inw(ioaddr + Register));
2817 }
2818 }
2819 }
2820 hp100_page(PERFORMANCE);
2821}
2822#endif
2823
2824
2825static void cleanup_dev(struct net_device *d)
2826{
2827 struct hp100_private *p = netdev_priv(d);
2828
2829 unregister_netdev(d);
2830 release_region(d->base_addr, HP100_REGION_SIZE);
2831
2832 if (p->mode == 1)
2833 pci_free_consistent(p->pci_dev, MAX_RINGSIZE + 0x0f,
2834 p->page_vaddr_algn,
2835 virt_to_whatever(d, p->page_vaddr_algn));
2836 if (p->mem_ptr_virt)
2837 iounmap(p->mem_ptr_virt);
2838
2839 free_netdev(d);
2840}
2841
2842#ifdef CONFIG_EISA
2843static int __init hp100_eisa_probe (struct device *gendev)
2844{
2845 struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private));
2846 struct eisa_device *edev = to_eisa_device(gendev);
2847 int err;
2848
2849 if (!dev)
2850 return -ENOMEM;
2851
2852 SET_NETDEV_DEV(dev, &edev->dev);
2853
2854 err = hp100_probe1(dev, edev->base_addr + 0xC38, HP100_BUS_EISA, NULL);
2855 if (err)
2856 goto out1;
2857
2858#ifdef HP100_DEBUG
2859 printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
2860 dev->base_addr);
2861#endif
2862 dev_set_drvdata(gendev, dev);
2863 return 0;
2864 out1:
2865 free_netdev(dev);
2866 return err;
2867}
2868
2869static int hp100_eisa_remove(struct device *gendev)
2870{
2871 struct net_device *dev = dev_get_drvdata(gendev);
2872 cleanup_dev(dev);
2873 return 0;
2874}
2875
2876static struct eisa_driver hp100_eisa_driver = {
2877 .id_table = hp100_eisa_tbl,
2878 .driver = {
2879 .name = "hp100",
2880 .probe = hp100_eisa_probe,
2881 .remove = hp100_eisa_remove,
2882 }
2883};
2884#endif
2885
2886#ifdef CONFIG_PCI
2887static int hp100_pci_probe(struct pci_dev *pdev,
2888 const struct pci_device_id *ent)
2889{
2890 struct net_device *dev;
2891 int ioaddr;
2892 u_short pci_command;
2893 int err;
2894
2895 if (pci_enable_device(pdev))
2896 return -ENODEV;
2897
2898 dev = alloc_etherdev(sizeof(struct hp100_private));
2899 if (!dev) {
2900 err = -ENOMEM;
2901 goto out0;
2902 }
2903
2904 SET_NETDEV_DEV(dev, &pdev->dev);
2905
2906 pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
2907 if (!(pci_command & PCI_COMMAND_IO)) {
2908#ifdef HP100_DEBUG
2909 printk("hp100: %s: PCI I/O Bit has not been set. Setting...\n", dev->name);
2910#endif
2911 pci_command |= PCI_COMMAND_IO;
2912 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
2913 }
2914
2915 if (!(pci_command & PCI_COMMAND_MASTER)) {
2916#ifdef HP100_DEBUG
2917 printk("hp100: %s: PCI Master Bit has not been set. Setting...\n", dev->name);
2918#endif
2919 pci_command |= PCI_COMMAND_MASTER;
2920 pci_write_config_word(pdev, PCI_COMMAND, pci_command);
2921 }
2922
2923 ioaddr = pci_resource_start(pdev, 0);
2924 err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev);
2925 if (err)
2926 goto out1;
2927
2928#ifdef HP100_DEBUG
2929 printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
2930#endif
2931 pci_set_drvdata(pdev, dev);
2932 return 0;
2933 out1:
2934 free_netdev(dev);
2935 out0:
2936 pci_disable_device(pdev);
2937 return err;
2938}
2939
2940static void hp100_pci_remove(struct pci_dev *pdev)
2941{
2942 struct net_device *dev = pci_get_drvdata(pdev);
2943
2944 cleanup_dev(dev);
2945 pci_disable_device(pdev);
2946}
2947
2948
2949static struct pci_driver hp100_pci_driver = {
2950 .name = "hp100",
2951 .id_table = hp100_pci_tbl,
2952 .probe = hp100_pci_probe,
2953 .remove = hp100_pci_remove,
2954};
2955#endif
2956
2957
2958
2959
2960
2961MODULE_LICENSE("GPL");
2962MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, "
2963 "Siegfried \"Frieder\" Loeffler (dg1sek) <floeff@mathematik.uni-stuttgart.de>");
2964MODULE_DESCRIPTION("HP CASCADE Architecture Driver for 100VG-AnyLan Network Adapters");
2965
2966
2967
2968
2969
2970
2971
2972#if defined(MODULE) && defined(CONFIG_ISA)
2973#define HP100_DEVICES 5
2974
2975static int hp100_port[HP100_DEVICES] = { 0, [1 ... (HP100_DEVICES-1)] = -1 };
2976module_param_array(hp100_port, int, NULL, 0);
2977
2978
2979static struct net_device *hp100_devlist[HP100_DEVICES];
2980
2981static int __init hp100_isa_init(void)
2982{
2983 struct net_device *dev;
2984 int i, err, cards = 0;
2985
2986
2987 if (hp100_port[0] == 0)
2988 return -ENODEV;
2989
2990
2991 for (i = 0; i < HP100_DEVICES && hp100_port[i] != -1; ++i) {
2992 dev = alloc_etherdev(sizeof(struct hp100_private));
2993 if (!dev) {
2994 while (cards > 0)
2995 cleanup_dev(hp100_devlist[--cards]);
2996
2997 return -ENOMEM;
2998 }
2999
3000 err = hp100_isa_probe(dev, hp100_port[i]);
3001 if (!err)
3002 hp100_devlist[cards++] = dev;
3003 else
3004 free_netdev(dev);
3005 }
3006
3007 return cards > 0 ? 0 : -ENODEV;
3008}
3009
3010static void hp100_isa_cleanup(void)
3011{
3012 int i;
3013
3014 for (i = 0; i < HP100_DEVICES; i++) {
3015 struct net_device *dev = hp100_devlist[i];
3016 if (dev)
3017 cleanup_dev(dev);
3018 }
3019}
3020#else
3021#define hp100_isa_init() (0)
3022#define hp100_isa_cleanup() do { } while(0)
3023#endif
3024
3025static int __init hp100_module_init(void)
3026{
3027 int err;
3028
3029 err = hp100_isa_init();
3030 if (err && err != -ENODEV)
3031 goto out;
3032#ifdef CONFIG_EISA
3033 err = eisa_driver_register(&hp100_eisa_driver);
3034 if (err && err != -ENODEV)
3035 goto out2;
3036#endif
3037#ifdef CONFIG_PCI
3038 err = pci_register_driver(&hp100_pci_driver);
3039 if (err && err != -ENODEV)
3040 goto out3;
3041#endif
3042 out:
3043 return err;
3044 out3:
3045#ifdef CONFIG_EISA
3046 eisa_driver_unregister (&hp100_eisa_driver);
3047 out2:
3048#endif
3049 hp100_isa_cleanup();
3050 goto out;
3051}
3052
3053
3054static void __exit hp100_module_exit(void)
3055{
3056 hp100_isa_cleanup();
3057#ifdef CONFIG_EISA
3058 eisa_driver_unregister (&hp100_eisa_driver);
3059#endif
3060#ifdef CONFIG_PCI
3061 pci_unregister_driver (&hp100_pci_driver);
3062#endif
3063}
3064
3065module_init(hp100_module_init)
3066module_exit(hp100_module_exit)
3067