Lines Matching +full:10 +full:base +full:- +full:t1

3 *    pcnet32.c -- Etherboot device driver for the AMD PCnet32
4 * Written 2003-2003 by Timothy Legge <tlegge@rogers.com>
23 * (C) 1996-1999 Thomas Bogendoerfer
27 * lance.c - LANCE NIC driver for Etherboot written by Ken Yap
34 * v1.0 08-06-2003 timlegge Initial port of Linux driver
35 * v1.1 08-23-2003 timlegge Add multicast support
36 * v1.2 01-17-2004 timlegge Initial driver output cleanup
37 * v1.3 03-29-2004 timlegge More driver cleanup
39 * Indent Options: indent -kr -i8
55 #define drv_date "03-29-2004"
90 static int tx_start = 1; /* Mapping -- 0:20, 1:64, 2:128, 3:~220 (depends on chip vers) */
115 PCNET32_PORT_ASEL, /* 0 Auto-select */
119 PCNET32_PORT_10BT | PCNET32_PORT_FD, /* 4 10baseT-FD */
124 PCNET32_PORT_MII, /* 9 MII 10baseT */
125 PCNET32_PORT_MII | PCNET32_PORT_FD, /* 10 MII 10baseT-FD */
127 PCNET32_PORT_10BT, /* 12 10BaseT */
129 PCNET32_PORT_MII | PCNET32_PORT_100 | PCNET32_PORT_FD, /* 14 MII 100BaseTx-FD */
160 #define TX_RING_MOD_MASK (TX_RING_SIZE - 1)
165 #define RX_RING_MOD_MASK (RX_RING_SIZE - 1)
170 /* Offsets from base I/O address. */
199 u32 base; member
207 u32 base; member
214 /* The PCNET32 32-Bit initialization block, described in databook. */
221 /* Receive and transmit ring base, along with extra bits. */
261 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
269 ltint:1, /* enable TxDone-intr inhibitor */
408 lp->tx_full = 0; in pcnet32_init_ring()
409 lp->cur_rx = lp->cur_tx = 0; in pcnet32_init_ring()
412 rx_ring[i].base = (u32) virt_to_le32desc(&rxb[i]); in pcnet32_init_ring()
413 rx_ring[i].buf_length = le16_to_cpu(-PKT_BUF_SZ); in pcnet32_init_ring()
420 tx_ring[i].base = 0; in pcnet32_init_ring()
425 lp->init_block.tlen_rlen = in pcnet32_init_ring()
428 lp->init_block.phys_addr[i] = nic->node_addr[i]; in pcnet32_init_ring()
429 lp->init_block.rx_ring = (u32) virt_to_le32desc(&rx_ring[0]); in pcnet32_init_ring()
430 lp->init_block.tx_ring = (u32) virt_to_le32desc(&tx_ring[0]); in pcnet32_init_ring()
435 RESET - Reset adapter
444 lp->a.reset(ioaddr); in pcnet32_reset()
447 lp->a.write_bcr(ioaddr, 20, 2); in pcnet32_reset()
450 val = lp->a.read_bcr(ioaddr, 2) & ~2; in pcnet32_reset()
451 if (lp->options & PCNET32_PORT_ASEL) in pcnet32_reset()
453 lp->a.write_bcr(ioaddr, 2, val); in pcnet32_reset()
455 if (lp->full_duplex) { in pcnet32_reset()
456 val = lp->a.read_bcr(ioaddr, 9) & ~3; in pcnet32_reset()
457 if (lp->options & PCNET32_PORT_FD) { in pcnet32_reset()
459 if (lp->options == in pcnet32_reset()
462 } else if (lp->options & PCNET32_PORT_ASEL) { in pcnet32_reset()
464 i = ((lp->a. in pcnet32_reset()
466 88) | (lp->a.read_csr(ioaddr, in pcnet32_reset()
472 lp->a.write_bcr(ioaddr, 9, val); in pcnet32_reset()
476 val = lp->a.read_csr(ioaddr, 124) & ~0x10; in pcnet32_reset()
477 if ((lp->options & PCNET32_PORT_PORTSEL) == PCNET32_PORT_GPSI) in pcnet32_reset()
479 lp->a.write_csr(ioaddr, 124, val); in pcnet32_reset()
481 if (lp->mii && !(lp->options & PCNET32_PORT_ASEL)) { in pcnet32_reset()
482 val = lp->a.read_bcr(ioaddr, 32) & ~0x38; /* disable Auto Negotiation, set 10Mbps, HD */ in pcnet32_reset()
483 if (lp->options & PCNET32_PORT_FD) in pcnet32_reset()
485 if (lp->options & PCNET32_PORT_100) in pcnet32_reset()
487 lp->a.write_bcr(ioaddr, 32, val); in pcnet32_reset()
489 if (lp->options & PCNET32_PORT_ASEL) { /* enable auto negotiate, setup, disable fd */ in pcnet32_reset()
490 val = lp->a.read_bcr(ioaddr, 32) & ~0x98; in pcnet32_reset()
492 lp->a.write_bcr(ioaddr, 32, val); in pcnet32_reset()
497 if (lp->dxsuflo) { /* Disable transmit stop on underflow */ in pcnet32_reset()
498 val = lp->a.read_csr(ioaddr, 3); in pcnet32_reset()
500 lp->a.write_csr(ioaddr, 3, val); in pcnet32_reset()
504 if (lp->ltint) { /* Enable TxDone-intr inhibitor */ in pcnet32_reset()
505 val = lp->a.read_csr(ioaddr, 5); in pcnet32_reset()
507 lp->a.write_csr(ioaddr, 5, val); in pcnet32_reset()
509 lp->init_block.mode = in pcnet32_reset()
510 le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); in pcnet32_reset()
511 lp->init_block.filter[0] = 0xffffffff; in pcnet32_reset()
512 lp->init_block.filter[1] = 0xffffffff; in pcnet32_reset()
517 /* Re-initialize the PCNET32, and start it when done. */ in pcnet32_reset()
518 lp->a.write_csr(ioaddr, 1, in pcnet32_reset()
519 (virt_to_bus(&lp->init_block)) & 0xffff); in pcnet32_reset()
520 lp->a.write_csr(ioaddr, 2, (virt_to_bus(&lp->init_block)) >> 16); in pcnet32_reset()
521 lp->a.write_csr(ioaddr, 4, 0x0915); in pcnet32_reset()
522 lp->a.write_csr(ioaddr, 0, 0x0001); in pcnet32_reset()
527 if (lp->a.read_csr(ioaddr, 0) & 0x0100) in pcnet32_reset()
533 lp->a.write_csr(ioaddr, 0, 0x0042); in pcnet32_reset()
535 dprintf(("pcnet32 open, csr0 %hX.\n", lp->a.read_csr(ioaddr, 0))); in pcnet32_reset()
540 POLL - Wait for a frame
545 /* nic->packet should contain data on return */ in pcnet32_poll()
546 /* nic->packetlen should contain length of data */ in pcnet32_poll()
551 entry = lp->cur_rx & RX_RING_MOD_MASK; in pcnet32_poll()
560 nic->packetlen = in pcnet32_poll()
561 (le32_to_cpu(rx_ring[entry].msg_length) & 0xfff) - 4; in pcnet32_poll()
562 memcpy(nic->packet, &rxb[entry], nic->packetlen); in pcnet32_poll()
566 rx_ring[entry].buf_length = le16_to_cpu(-PKT_BUF_SZ); in pcnet32_poll()
569 lp->cur_rx++; in pcnet32_poll()
579 TRANSMIT - Transmit a frame
591 int entry = 0; /*lp->cur_tx & TX_RING_MOD_MASK; */ in pcnet32_transmit()
595 ptxb = txb + (lp->cur_tx * PKT_BUF_SZ); in pcnet32_transmit()
599 memcpy(ptxb + ETH_ALEN, nic->node_addr, ETH_ALEN); /* src */ in pcnet32_transmit()
608 tx_ring[entry].length = le16_to_cpu(-s); in pcnet32_transmit()
610 tx_ring[entry].base = (u32) virt_to_le32desc(ptxb); in pcnet32_transmit()
617 lp->a.write_csr(ioaddr, 0, 0x0048); in pcnet32_transmit()
620 lp->cur_tx = 0; /* (lp->cur_tx + 1); */ in pcnet32_transmit()
630 tx_ring[entry].base = 0; in pcnet32_transmit()
635 DISABLE - Turn off ethernet interface
639 /* Stop the PCNET32 here -- it ocassionally polls memory if we don't */ in pcnet32_disable()
640 lp->a.write_csr(ioaddr, 0, 0x0004); in pcnet32_disable()
643 * Switch back to 16-bit mode to avoid problesm with dumb in pcnet32_disable()
646 lp->a.write_bcr(ioaddr, 20, 4); in pcnet32_disable()
650 IRQ - Enable, Disable, or Force interrupts
665 PROBE - Look for an adapter, this routine's visible to the outside
666 You should omit the last argument struct pci_device * for a non-PCI NIC
679 if (pci->ioaddr == 0) in pcnet32_probe()
682 /* BASE is used throughout to address the card */ in pcnet32_probe()
683 ioaddr = pci->ioaddr; in pcnet32_probe()
685 pci->name, pci->vendor, pci->dev_id); in pcnet32_probe()
687 nic->irqno = 0; in pcnet32_probe()
688 nic->ioaddr = pci->ioaddr & ~3; in pcnet32_probe()
693 /* NOTE: 16-bit check is first, otherwise some older PCnet chips fail */ in pcnet32_probe()
707 a->read_csr(ioaddr, 88) | (a->read_csr(ioaddr, 89) << 16); in pcnet32_probe()
760 media = a->read_bcr(ioaddr, 49); in pcnet32_probe()
763 a->write_bcr(ioaddr, 49, media); in pcnet32_probe()
779 * one for latency - although on PCI this isnt a big loss. Older chips in pcnet32_probe()
784 a->write_bcr(ioaddr, 18, in pcnet32_probe()
785 (a->read_bcr(ioaddr, 18) | 0x0800)); in pcnet32_probe()
786 a->write_csr(ioaddr, 80, in pcnet32_probe()
787 (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); in pcnet32_probe()
800 nic->node_addr[i] = promaddr[i]; in pcnet32_probe()
803 printf("%s: %! at ioaddr %hX, ", pci->name, nic->node_addr, in pcnet32_probe()
814 i = a->read_csr(ioaddr, 80) & 0x0C00; /* Check tx_start_pt */ in pcnet32_probe()
816 switch (i >> 10) { in pcnet32_probe()
830 i = a->read_bcr(ioaddr, 18); /* Check Burst/Bus control */ in pcnet32_probe()
840 i = a->read_bcr(ioaddr, 25); in pcnet32_probe()
842 i = a->read_bcr(ioaddr, 26); in pcnet32_probe()
844 i = a->read_bcr(ioaddr, 27); in pcnet32_probe()
849 lp->name = chipname; in pcnet32_probe()
850 lp->shared_irq = shared; in pcnet32_probe()
851 lp->full_duplex = fdx; in pcnet32_probe()
852 lp->dxsuflo = dxsuflo; in pcnet32_probe()
853 lp->ltint = ltint; in pcnet32_probe()
854 lp->mii = mii; in pcnet32_probe()
858 lp->options = PCNET32_PORT_ASEL; in pcnet32_probe()
860 lp->options = options_mapping[options[cards_found]]; in pcnet32_probe()
862 if (fdx && !(lp->options & PCNET32_PORT_ASEL) && in pcnet32_probe()
864 lp->options |= PCNET32_PORT_FD; in pcnet32_probe()
870 lp->a = *a; in pcnet32_probe()
872 /* detect special T1/E1 WAN card by checking for MAC address */ in pcnet32_probe()
873 if (nic->node_addr[0] == 0x00 && nic->node_addr[1] == 0xe0 in pcnet32_probe()
874 && nic->node_addr[2] == 0x75) in pcnet32_probe()
875 lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; in pcnet32_probe()
877 lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */ in pcnet32_probe()
878 lp->init_block.tlen_rlen = in pcnet32_probe()
881 lp->init_block.phys_addr[i] = nic->node_addr[i]; in pcnet32_probe()
882 lp->init_block.filter[0] = 0xffffffff; in pcnet32_probe()
883 lp->init_block.filter[1] = 0xffffffff; in pcnet32_probe()
884 lp->init_block.rx_ring = virt_to_bus(&rx_ring); in pcnet32_probe()
885 lp->init_block.tx_ring = virt_to_bus(&tx_ring); in pcnet32_probe()
888 a->write_bcr(ioaddr, 20, 2); in pcnet32_probe()
891 a->write_csr(ioaddr, 1, (virt_to_bus(&lp->init_block)) & 0xffff); in pcnet32_probe()
892 a->write_csr(ioaddr, 2, (virt_to_bus(&lp->init_block)) >> 16); in pcnet32_probe()
895 * To auto-IRQ we enable the initialization-done and DMA error in pcnet32_probe()
901 a->write_csr(ioaddr, 0, 0x41); in pcnet32_probe()
912 lp->phys[0] = 1; /* Default Setting */ in pcnet32_probe()
916 lp->phys[phy_idx++] = phy; in pcnet32_probe()
917 lp->mii_if.advertising = in pcnet32_probe()
923 lp->mii_if.advertising)); in pcnet32_probe()
929 lp->mii_if.phy_id = lp->phys[0]; in pcnet32_probe()
931 lp->mii_if.advertising = in pcnet32_probe()
932 mdio_read(nic, lp->phys[0], MII_ADVERTISE); in pcnet32_probe()
934 mii_lpa = mdio_read(nic, lp->phys[0], MII_LPA); in pcnet32_probe()
935 lp->mii_if.advertising &= mii_lpa; in pcnet32_probe()
936 if (lp->mii_if.advertising & ADVERTISE_100FULL) in pcnet32_probe()
937 printf("100Mbps Full-Duplex\n"); in pcnet32_probe()
938 else if (lp->mii_if.advertising & ADVERTISE_100HALF) in pcnet32_probe()
939 printf("100Mbps Half-Duplex\n"); in pcnet32_probe()
940 else if (lp->mii_if.advertising & ADVERTISE_10FULL) in pcnet32_probe()
941 printf("10Mbps Full-Duplex\n"); in pcnet32_probe()
942 else if (lp->mii_if.advertising & ADVERTISE_10HALF) in pcnet32_probe()
943 printf("10Mbps Half-Duplex\n"); in pcnet32_probe()
948 nic->poll = pcnet32_poll; in pcnet32_probe()
949 nic->transmit = pcnet32_transmit; in pcnet32_probe()
950 dev->disable = pcnet32_disable; in pcnet32_probe()
951 nic->irq = pcnet32_irq; in pcnet32_probe()
960 if (!lp->mii) in mdio_read()
963 phyaddr = lp->a.read_bcr(ioaddr, 33); in mdio_read()
965 lp->a.write_bcr(ioaddr, 33, in mdio_read()
967 val_out = lp->a.read_bcr(ioaddr, 34); in mdio_read()
968 lp->a.write_bcr(ioaddr, 33, phyaddr); in mdio_read()
979 if (!lp->mii)
982 phyaddr = lp->a.read_bcr(ioaddr, 33);
984 lp->a.write_bcr(ioaddr, 33,
986 lp->a.write_bcr(ioaddr, 34, val);
987 lp->a.write_bcr(ioaddr, 33, phyaddr);