Lines Matching +full:rx +full:- +full:input +full:- +full:m
1 // SPDX-License-Identifier: GPL-1.0+
2 /* mac8390.c: New driver for 8390-based Nubus (or Nubus-alike)
6 Jes Sorensen, and ne2k-pci.c by Donald Becker and Paul Gortmaker. */
8 /* 2000-02-28: support added for Dayna and Kinetics cards by
10 /* 2000-04-04: support added for Dayna2 by bart@etpmod.phys.tue.nl */
11 /* 2001-04-18: support for DaynaPort E/LC-M by rayk@knightsmanor.org */
12 /* 2001-05-15: support for Cabletron ported from old daynaport driver
15 /* 2002-12-30: Try to support more cards, some clues from NetBSD driver */
16 /* 2003-12-26: Make sure Asante cards always work. */
43 "v0.4 2001-05-15 David Huggins-Daines <dhd@debian.org> and others\n";
45 #define EI_SHIFT(x) (ei_local->reg_offset[x])
54 #define CABLETRON_RX_START_PG 0x00 /* First page of RX buffer */
55 #define CABLETRON_RX_STOP_PG 0x30 /* Last page +1 of RX ring */
76 MAC8390_NONE = -1,
132 /* Sane (32-bit chunk memory read/write) - Some Farallon and Apple do this*/
146 /* Dayna - Dayna/Kinetics use this */
154 /* Slow Sane (16-bit chunk memory read/write) Cabletron uses this */
166 switch (fres->dr_sw) { in mac8390_ident()
168 switch (fres->dr_hw) { in mac8390_ident()
178 switch (fres->dr_hw) { in mac8390_ident()
193 if (fres->dr_hw == NUBUS_DRHW_CABLETRON) in mac8390_ident()
202 switch (fres->dr_hw) { in mac8390_ident()
214 if (fres->dr_hw == NUBUS_DRHW_SMC9194 || in mac8390_ident()
215 fres->dr_hw == NUBUS_DRHW_INTERLAN) in mac8390_ident()
256 volatile unsigned short *m = (unsigned short *)(membase + (i * 0x1000)); in mac8390_memsize() local
258 /* Unwriteable - we have a fully decoded card and the in mac8390_memsize()
260 if (hwreg_present(m) == 0) in mac8390_memsize()
264 *m = 0xA5A0 | i; in mac8390_memsize()
266 if (*m != (0xA5A0 | i)) in mac8390_memsize()
288 struct nubus_board *board = fres->board; in mac8390_rsrc_init()
295 dev->irq = SLOT2IRQ(board->slot); in mac8390_rsrc_init()
297 dev->base_addr = board->slot_addr | ((board->slot & 0xf) << 20); in mac8390_rsrc_init()
300 * Get some Nubus info - we will trust the card's idea in mac8390_rsrc_init()
304 if (nubus_get_func_dir(fres, &dir) == -1) { in mac8390_rsrc_init()
305 dev_err(&board->dev, in mac8390_rsrc_init()
311 if (nubus_find_rsrc(&dir, NUBUS_RESID_MAC_ADDRESS, &ent) == -1) { in mac8390_rsrc_init()
312 dev_info(&board->dev, "MAC address resource not found\n"); in mac8390_rsrc_init()
322 &ent) == -1) { in mac8390_rsrc_init()
323 dev_err(&board->dev, in mac8390_rsrc_init()
328 dev->mem_start = dev->base_addr + offset; in mac8390_rsrc_init()
330 dev->base_addr = dev->mem_start + 0x10000; in mac8390_rsrc_init()
333 &ent) == -1) { in mac8390_rsrc_init()
334 dev_info(&board->dev, in mac8390_rsrc_init()
336 offset = mac8390_memsize(dev->mem_start); in mac8390_rsrc_init()
340 dev->mem_end = dev->mem_start + offset; in mac8390_rsrc_init()
345 dev->base_addr = (int)(board->slot_addr + in mac8390_rsrc_init()
347 dev->mem_start = (int)(board->slot_addr + in mac8390_rsrc_init()
349 dev->mem_end = dev->mem_start + in mac8390_rsrc_init()
350 mac8390_memsize(dev->mem_start); in mac8390_rsrc_init()
353 dev->base_addr = (int)(board->slot_addr + in mac8390_rsrc_init()
355 dev->mem_start = (int)(board->slot_addr + in mac8390_rsrc_init()
357 dev->mem_end = dev->mem_start + in mac8390_rsrc_init()
358 mac8390_memsize(dev->mem_start); in mac8390_rsrc_init()
361 dev->base_addr = (int)(board->slot_addr + in mac8390_rsrc_init()
363 dev->mem_start = (int)(board->slot_addr + in mac8390_rsrc_init()
371 i = (void *)dev->base_addr; in mac8390_rsrc_init()
373 dev->mem_end = dev->mem_start + in mac8390_rsrc_init()
374 mac8390_memsize(dev->mem_start); in mac8390_rsrc_init()
378 dev_err(&board->dev, in mac8390_rsrc_init()
390 int err = -ENODEV; in mac8390_device_probe()
396 return -ENOMEM; in mac8390_device_probe()
398 SET_NETDEV_DEV(dev, &board->dev); in mac8390_device_probe()
401 if (fres->category != NUBUS_CAT_NETWORK || in mac8390_device_probe()
402 fres->type != NUBUS_TYPE_ETHERNET) in mac8390_device_probe()
448 MODULE_AUTHOR("David Huggins-Daines <dhd@debian.org> and others");
449 MODULE_DESCRIPTION("Macintosh NS8390-based Nubus Ethernet driver");
503 dev->netdev_ops = &mac8390_netdev_ops; in mac8390_initdev()
509 /* Cabletron's TX/RX buffers are backwards */ in mac8390_initdev()
514 ei_status.rmem_start = dev->mem_start; in mac8390_initdev()
515 ei_status.rmem_end = dev->mem_start + CABLETRON_RX_STOP_PG*256; in mac8390_initdev()
519 ei_status.stop_page = (dev->mem_end - dev->mem_start)/256; in mac8390_initdev()
520 ei_status.rmem_start = dev->mem_start + TX_PAGES*256; in mac8390_initdev()
521 ei_status.rmem_end = dev->mem_end; in mac8390_initdev()
524 /* Fill in model-specific information and functions */ in mac8390_initdev()
528 switch (mac8390_testio(dev->mem_start)) { in mac8390_initdev()
530 dev_err(&board->dev, in mac8390_initdev()
532 return -ENODEV; in mac8390_initdev()
597 dev_err(&board->dev, "Unsupported card type\n"); in mac8390_initdev()
598 return -ENODEV; in mac8390_initdev()
604 dev_info(&board->dev, "%s (type %s)\n", board->name, cardname[type]); in mac8390_initdev()
605 dev_info(&board->dev, "MAC %pM, IRQ %d, %d KB shared memory at %#lx, %d-bit access.\n", in mac8390_initdev()
606 dev->dev_addr, dev->irq, in mac8390_initdev()
607 (unsigned int)(dev->mem_end - dev->mem_start) >> 10, in mac8390_initdev()
608 dev->mem_start, access_bitmode ? 32 : 16); in mac8390_initdev()
617 err = request_irq(dev->irq, __ei_interrupt, 0, "8390 Ethernet", dev); in mac8390_open()
619 pr_err("%s: unable to get IRQ %d\n", dev->name, dev->irq); in mac8390_open()
625 free_irq(dev->irq, dev); in mac8390_close()
640 unsigned char *target = nubus_slot_addr(IRQ2SLOT(dev->irq)); in interlan_reset()
659 ptr = (unsigned char *)(dev->mem_start+from); in dayna_memcpy_fromcard()
662 *target++ = ptr[-1]; in dayna_memcpy_fromcard()
664 count--; in dayna_memcpy_fromcard()
670 count -= 2; in dayna_memcpy_fromcard()
683 ptr = (unsigned short *)(dev->mem_start+to); in dayna_memcpy_tocard()
686 ptr[-1] = (ptr[-1]&0xFF00)|*src++; in dayna_memcpy_tocard()
688 count--; in dayna_memcpy_tocard()
694 count -= 2; in dayna_memcpy_tocard()
703 /* sane block input/output */
707 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in sane_get_8390_hdr()
708 memcpy_fromio(hdr, (void __iomem *)dev->mem_start + hdr_start, 4); in sane_get_8390_hdr()
710 hdr->count = swab16(hdr->count); in sane_get_8390_hdr()
716 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in sane_block_input()
717 unsigned long xfer_start = xfer_base + dev->mem_start; in sane_block_input()
720 /* We must wrap the input move. */ in sane_block_input()
721 int semi_count = ei_status.rmem_end - xfer_start; in sane_block_input()
722 memcpy_fromio(skb->data, in sane_block_input()
723 (void __iomem *)dev->mem_start + xfer_base, in sane_block_input()
725 count -= semi_count; in sane_block_input()
726 memcpy_fromio(skb->data + semi_count, in sane_block_input()
729 memcpy_fromio(skb->data, in sane_block_input()
730 (void __iomem *)dev->mem_start + xfer_base, in sane_block_input()
738 long shmem = (start_page - WD_START_PG)<<8; in sane_block_output()
740 memcpy_toio((void __iomem *)dev->mem_start + shmem, buf, count); in sane_block_output()
743 /* dayna block input/output */
747 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in dayna_get_8390_hdr()
751 hdr->count = (hdr->count & 0xFF) << 8 | (hdr->count >> 8); in dayna_get_8390_hdr()
757 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in dayna_block_input()
758 unsigned long xfer_start = xfer_base+dev->mem_start; in dayna_block_input()
764 /* We must wrap the input move. */ in dayna_block_input()
765 int semi_count = ei_status.rmem_end - xfer_start; in dayna_block_input()
766 dayna_memcpy_fromcard(dev, skb->data, xfer_base, semi_count); in dayna_block_input()
767 count -= semi_count; in dayna_block_input()
768 dayna_memcpy_fromcard(dev, skb->data + semi_count, in dayna_block_input()
769 ei_status.rmem_start - dev->mem_start, in dayna_block_input()
772 dayna_memcpy_fromcard(dev, skb->data, xfer_base, count); in dayna_block_input()
780 long shmem = (start_page - WD_START_PG)<<8; in dayna_block_output()
790 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; in slow_sane_get_8390_hdr()
791 word_memcpy_fromcard(hdr, dev->mem_start + hdr_start, 4); in slow_sane_get_8390_hdr()
792 /* Register endianism - fix here rather than 8390.c */ in slow_sane_get_8390_hdr()
793 hdr->count = (hdr->count&0xFF)<<8|(hdr->count>>8); in slow_sane_get_8390_hdr()
799 unsigned long xfer_base = ring_offset - (WD_START_PG<<8); in slow_sane_block_input()
800 unsigned long xfer_start = xfer_base+dev->mem_start; in slow_sane_block_input()
803 /* We must wrap the input move. */ in slow_sane_block_input()
804 int semi_count = ei_status.rmem_end - xfer_start; in slow_sane_block_input()
805 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base, in slow_sane_block_input()
807 count -= semi_count; in slow_sane_block_input()
808 word_memcpy_fromcard(skb->data + semi_count, in slow_sane_block_input()
811 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base, in slow_sane_block_input()
819 long shmem = (start_page - WD_START_PG)<<8; in slow_sane_block_output()
821 word_memcpy_tocard(dev->mem_start + shmem, buf, count); in slow_sane_block_output()
832 while (count--) in word_memcpy_tocard()
844 while (count--) in word_memcpy_fromcard()