Lines Matching +full:functional +full:- +full:system +full:- +full:debian

1 /* mac8390.c: New driver for 8390-based Nubus (or Nubus-alike)
5 Jes Sorensen, and ne2k-pci.c by Donald Becker and Paul Gortmaker.
10 /* 2000-02-28: support added for Dayna and Kinetics cards by
12 /* 2000-04-04: support added for Dayna2 by bart@etpmod.phys.tue.nl */
13 /* 2001-04-18: support for DaynaPort E/LC-M by rayk@knightsmanor.org */
14 /* 2001-05-15: support for Cabletron ported from old daynaport driver
17 /* 2002-12-30: Try to support more cards, some clues from NetBSD driver */
18 /* 2003-12-26: Make sure Asante cards always work. */
40 #include <asm/system.h>
46 "v0.4 2001-05-15 David Huggins-Daines <dhd@debian.org> and others\n";
48 #define EI_SHIFT(x) (ei_local->reg_offset[x])
79 MAC8390_NONE = -1,
135 /* Sane (32-bit chunk memory read/write) - Some Farallon and Apple do this*/
149 /* Dayna - Dayna/Kinetics use this */
162 /* Slow Sane (16-bit chunk memory read/write) Cabletron uses this */
174 switch (dev->dr_sw) { in mac8390_ident()
176 switch (dev->dr_hw) { in mac8390_ident()
189 switch (dev->dr_hw) { in mac8390_ident()
209 if (dev->dr_hw == NUBUS_DRHW_CABLETRON) in mac8390_ident()
220 switch (dev->dr_hw) { in mac8390_ident()
235 if (dev->dr_hw == NUBUS_DRHW_SMC9194 || in mac8390_ident()
236 dev->dr_hw == NUBUS_DRHW_INTERLAN) in mac8390_ident()
273 /* Unwriteable - we have a fully decoded card and the in mac8390_memsize()
309 dev->irq = SLOT2IRQ(ndev->board->slot); in mac8390_init()
311 dev->base_addr = (ndev->board->slot_addr | in mac8390_init()
312 ((ndev->board->slot & 0xf) << 20)); in mac8390_init()
315 * Get some Nubus info - we will trust the card's idea in mac8390_init()
319 if (nubus_get_func_dir(ndev, &dir) == -1) { in mac8390_init()
320 pr_err("%s: Unable to get Nubus functional directory for slot %X!\n", in mac8390_init()
321 dev->name, ndev->board->slot); in mac8390_init()
326 if (nubus_find_rsrc(&dir, NUBUS_RESID_MAC_ADDRESS, &ent) == -1) { in mac8390_init()
327 pr_info("%s: Couldn't get MAC address!\n", dev->name); in mac8390_init()
331 nubus_get_rsrc_mem(dev->dev_addr, &ent, 6); in mac8390_init()
336 &ent) == -1) { in mac8390_init()
338 dev->name, ndev->board->slot); in mac8390_init()
342 dev->mem_start = dev->base_addr + offset; in mac8390_init()
344 dev->base_addr = dev->mem_start + 0x10000; in mac8390_init()
347 &ent) == -1) { in mac8390_init()
349 dev->name, ndev->board->slot); in mac8390_init()
350 offset = mac8390_memsize(dev->mem_start); in mac8390_init()
354 dev->mem_end = dev->mem_start + offset; in mac8390_init()
359 dev->base_addr = (int)(ndev->board->slot_addr + in mac8390_init()
361 dev->mem_start = (int)(ndev->board->slot_addr + in mac8390_init()
363 dev->mem_end = dev->mem_start + in mac8390_init()
364 mac8390_memsize(dev->mem_start); in mac8390_init()
367 dev->base_addr = (int)(ndev->board->slot_addr + in mac8390_init()
369 dev->mem_start = (int)(ndev->board->slot_addr + in mac8390_init()
371 dev->mem_end = dev->mem_start + in mac8390_init()
372 mac8390_memsize(dev->mem_start); in mac8390_init()
375 dev->base_addr = (int)(ndev->board->slot_addr + in mac8390_init()
377 dev->mem_start = (int)(ndev->board->slot_addr + in mac8390_init()
385 i = (void *)dev->base_addr; in mac8390_init()
387 dev->mem_end = dev->mem_start + in mac8390_init()
388 mac8390_memsize(dev->mem_start); in mac8390_init()
393 ndev->board->name); in mac8390_init()
405 int err = -ENODEV; in mac8390_probe()
414 return ERR_PTR(-ENODEV); in mac8390_probe()
418 return ERR_PTR(-ENOMEM); in mac8390_probe()
421 sprintf(dev->name, "eth%d", unit); in mac8390_probe()
426 if (slots & (1 << ndev->board->slot)) in mac8390_probe()
428 slots |= 1 << ndev->board->slot; in mac8390_probe()
455 MODULE_AUTHOR("David Huggins-Daines <dhd@debian.org> and others");
456 MODULE_DESCRIPTION("Macintosh NS8390-based Nubus Ethernet driver");
465 struct net_device *dev = mac8390_probe(-1); in init_module()
472 return -ENODEV; in init_module()
532 dev->netdev_ops = &mac8390_netdev_ops; in mac8390_initdev()
543 ei_status.rmem_start = dev->mem_start; in mac8390_initdev()
544 ei_status.rmem_end = dev->mem_start + CABLETRON_RX_STOP_PG*256; in mac8390_initdev()
548 ei_status.stop_page = (dev->mem_end - dev->mem_start)/256; in mac8390_initdev()
549 ei_status.rmem_start = dev->mem_start + TX_PAGES*256; in mac8390_initdev()
550 ei_status.rmem_end = dev->mem_end; in mac8390_initdev()
553 /* Fill in model-specific information and functions */ in mac8390_initdev()
557 switch (mac8390_testio(dev->mem_start)) { in mac8390_initdev()
560 return -ENODEV; in mac8390_initdev()
586 * but overwrite system memory when run at 32 bit. in mac8390_initdev()
627 ndev->board->name); in mac8390_initdev()
628 return -ENODEV; in mac8390_initdev()
635 dev->name, ndev->board->name, ndev->board->slot, in mac8390_initdev()
637 pr_info("MAC %pM IRQ %d, %d KB shared memory at %#lx, %d-bit access.\n", in mac8390_initdev()
638 dev->dev_addr, dev->irq, in mac8390_initdev()
639 (unsigned int)(dev->mem_end - dev->mem_start) >> 10, in mac8390_initdev()
640 dev->mem_start, access_bitmode ? 32 : 16); in mac8390_initdev()
649 err = request_irq(dev->irq, __ei_interrupt, 0, "8390 Ethernet", dev); in mac8390_open()
651 pr_err("%s: unable to get IRQ %d\n", dev->name, dev->irq); in mac8390_open()
657 free_irq(dev->irq, dev); in mac8390_close()
671 unsigned char *target = nubus_slot_addr(IRQ2SLOT(dev->irq)); in interlan_reset()
688 ptr = (unsigned char *)(dev->mem_start+from); in dayna_memcpy_fromcard()
691 *target++ = ptr[-1]; in dayna_memcpy_fromcard()
693 count--; in dayna_memcpy_fromcard()
699 count -= 2; in dayna_memcpy_fromcard()
712 ptr = (unsigned short *)(dev->mem_start+to); in dayna_memcpy_tocard()
715 ptr[-1] = (ptr[-1]&0xFF00)|*src++; in dayna_memcpy_tocard()
717 count--; in dayna_memcpy_tocard()
723 count -= 2; in dayna_memcpy_tocard()
736 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in sane_get_8390_hdr()
737 memcpy_fromio(hdr, dev->mem_start + hdr_start, 4); in sane_get_8390_hdr()
739 hdr->count = swab16(hdr->count); in sane_get_8390_hdr()
745 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in sane_block_input()
746 unsigned long xfer_start = xfer_base + dev->mem_start; in sane_block_input()
750 int semi_count = ei_status.rmem_end - xfer_start; in sane_block_input()
751 memcpy_fromio(skb->data, dev->mem_start + xfer_base, in sane_block_input()
753 count -= semi_count; in sane_block_input()
754 memcpy_fromio(skb->data + semi_count, ei_status.rmem_start, in sane_block_input()
757 memcpy_fromio(skb->data, dev->mem_start + xfer_base, count); in sane_block_input()
764 long shmem = (start_page - WD_START_PG)<<8; in sane_block_output()
766 memcpy_toio(dev->mem_start + shmem, buf, count); in sane_block_output()
773 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in dayna_get_8390_hdr()
777 hdr->count = (hdr->count & 0xFF) << 8 | (hdr->count >> 8); in dayna_get_8390_hdr()
783 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in dayna_block_input()
784 unsigned long xfer_start = xfer_base+dev->mem_start; in dayna_block_input()
791 int semi_count = ei_status.rmem_end - xfer_start; in dayna_block_input()
792 dayna_memcpy_fromcard(dev, skb->data, xfer_base, semi_count); in dayna_block_input()
793 count -= semi_count; in dayna_block_input()
794 dayna_memcpy_fromcard(dev, skb->data + semi_count, in dayna_block_input()
795 ei_status.rmem_start - dev->mem_start, in dayna_block_input()
798 dayna_memcpy_fromcard(dev, skb->data, xfer_base, count); in dayna_block_input()
806 long shmem = (start_page - WD_START_PG)<<8; in dayna_block_output()
816 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in slow_sane_get_8390_hdr()
817 word_memcpy_fromcard(hdr, dev->mem_start + hdr_start, 4); in slow_sane_get_8390_hdr()
818 /* Register endianism - fix here rather than 8390.c */ in slow_sane_get_8390_hdr()
819 hdr->count = (hdr->count&0xFF)<<8|(hdr->count>>8); in slow_sane_get_8390_hdr()
825 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in slow_sane_block_input()
826 unsigned long xfer_start = xfer_base+dev->mem_start; in slow_sane_block_input()
830 int semi_count = ei_status.rmem_end - xfer_start; in slow_sane_block_input()
831 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base, in slow_sane_block_input()
833 count -= semi_count; in slow_sane_block_input()
834 word_memcpy_fromcard(skb->data + semi_count, in slow_sane_block_input()
837 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base, in slow_sane_block_input()
845 long shmem = (start_page - WD_START_PG)<<8; in slow_sane_block_output()
847 word_memcpy_tocard(dev->mem_start + shmem, buf, count); in slow_sane_block_output()
858 while (count--) in word_memcpy_tocard()
870 while (count--) in word_memcpy_fromcard()