diff options
author | gnn <gnn@FreeBSD.org> | 2006-05-14 01:47:51 +0000 |
---|---|---|
committer | gnn <gnn@FreeBSD.org> | 2006-05-14 01:47:51 +0000 |
commit | 7015de091f9c60233dbeaec478ad3ad9297bd07e (patch) | |
tree | 392ce1f8c1970eefc9e924172a86c50d2abd678e /sys | |
parent | d1e0397ab970788548aa8263516f3376118b4e61 (diff) | |
download | FreeBSD-src-7015de091f9c60233dbeaec478ad3ad9297bd07e.zip FreeBSD-src-7015de091f9c60233dbeaec478ad3ad9297bd07e.tar.gz |
Remove the old, and now deprecated lnc driver. The Lance style hardware
is supported by the le and pnc drivers.
Reviewed by: jmg
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/lnc/if_lnc.c | 1560 | ||||
-rw-r--r-- | sys/dev/lnc/if_lnc_cbus.c | 307 | ||||
-rw-r--r-- | sys/dev/lnc/if_lnc_isa.c | 278 | ||||
-rw-r--r-- | sys/dev/lnc/if_lnc_pci.c | 213 | ||||
-rw-r--r-- | sys/dev/lnc/if_lncreg.h | 209 | ||||
-rw-r--r-- | sys/dev/lnc/if_lncvar.h | 266 |
6 files changed, 0 insertions, 2833 deletions
diff --git a/sys/dev/lnc/if_lnc.c b/sys/dev/lnc/if_lnc.c deleted file mode 100644 index dba091a..0000000 --- a/sys/dev/lnc/if_lnc.c +++ /dev/null @@ -1,1560 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -/* -#define DIAGNOSTIC -#define DEBUG - * - * TODO ---- - * - * Check all the XXX comments -- some of them are just things I've left - * unfinished rather than "difficult" problems that were hacked around. - * - * Check log settings. - * - * Check how all the arpcom flags get set and used. - * - * Re-inline and re-static all routines after debugging. - * - * Remember to assign iobase in SHMEM probe routines. - * - * Replace all occurences of LANCE-controller-card etc in prints by the name - * strings of the appropriate type -- nifty window dressing - * - * Add DEPCA support -- mostly done. - * - */ - -#include "opt_inet.h" - -/* Some defines that should really be in generic locations */ -#define FCS_LEN 4 -#define MULTICAST_FILTER_LEN 8 - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/mbuf.h> -#include <sys/module.h> -#include <sys/socket.h> -#include <sys/sockio.h> -#include <sys/syslog.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_dl.h> -#include <net/if_types.h> - -#include <netinet/in.h> -#include <netinet/if_ether.h> - -#include <net/bpf.h> - -#include <machine/md_var.h> - -#include <dev/lnc/if_lncvar.h> -#include <dev/lnc/if_lncreg.h> - -devclass_t lnc_devclass; - -static char const * const nic_ident[] = { - "Unknown", - "BICC", - "NE2100", - "DEPCA", - "CNET98S", /* PC-98 */ -}; - -static char const * const ic_ident[] = { - "Unknown", - "LANCE", - "C-LANCE", - "PCnet-ISA", - "PCnet-ISA+", - "PCnet-ISA II", - "PCnet-32 VL-Bus", - "PCnet-PCI", - "PCnet-PCI II", - "PCnet-FAST", - "PCnet-FAST+", - "PCnet-Home", -}; - -static void lnc_setladrf(struct lnc_softc *sc); -static void lnc_reset(struct lnc_softc *sc); -static void lnc_free_mbufs(struct lnc_softc *sc); -static __inline int alloc_mbuf_cluster(struct lnc_softc *sc, - struct host_ring_entry *desc); -static __inline struct mbuf *chain_mbufs(struct lnc_softc *sc, - int start_of_packet, - int pkt_len); -static __inline struct mbuf *mbuf_packet(struct lnc_softc *sc, - int start_of_packet, - int pkt_len); -static void lnc_rint(struct lnc_softc *sc); -static void lnc_tint(struct lnc_softc *sc); - -static void lnc_init(void *); -static __inline int mbuf_to_buffer(struct mbuf *m, char *buffer); -static __inline struct mbuf *chain_to_cluster(struct mbuf *m); -static void lnc_start(struct ifnet *ifp); -static int lnc_ioctl(struct ifnet *ifp, u_long command, caddr_t data); -static void lnc_watchdog(struct ifnet *ifp); -#ifdef DEBUG -void lnc_dump_state(struct lnc_softc *sc); -void mbuf_dump_chain(struct mbuf *m); -#endif - -u_short -read_csr(struct lnc_softc *sc, u_short port) -{ - lnc_outw(sc->rap, port); - return (lnc_inw(sc->rdp)); -} - -void -write_csr(struct lnc_softc *sc, u_short port, u_short val) -{ - lnc_outw(sc->rap, port); - lnc_outw(sc->rdp, val); -} - -static __inline void -write_bcr(struct lnc_softc *sc, u_short port, u_short val) -{ - lnc_outw(sc->rap, port); - lnc_outw(sc->bdp, val); -} - -static __inline u_short -read_bcr(struct lnc_softc *sc, u_short port) -{ - lnc_outw(sc->rap, port); - return (lnc_inw(sc->bdp)); -} - -int -lance_probe(struct lnc_softc *sc) -{ - write_csr(sc, CSR0, STOP); - - if ((lnc_inw(sc->rdp) & STOP) && ! (read_csr(sc, CSR3))) { - /* - * Check to see if it's a C-LANCE. For the LANCE the INEA bit - * cannot be set while the STOP bit is. This restriction is - * removed for the C-LANCE. - */ - write_csr(sc, CSR0, INEA); - if (read_csr(sc, CSR0) & INEA) - return (C_LANCE); - else - return (LANCE); - } else - return (UNKNOWN); -} - -void -lnc_release_resources(device_t dev) -{ - lnc_softc_t *sc = device_get_softc(dev); - - if (sc->irqres) { - bus_teardown_intr(dev, sc->irqres, sc->intrhand); - bus_release_resource(dev, SYS_RES_IRQ, sc->irqrid, sc->irqres); - } - - if (sc->portres) - bus_release_resource(dev, SYS_RES_IOPORT, - sc->portrid, sc->portres); - if (sc->drqres) - bus_release_resource(dev, SYS_RES_DRQ, sc->drqrid, sc->drqres); - - if (sc->dmat) { - if (sc->dmamap) { - bus_dmamap_unload(sc->dmat, sc->dmamap); - bus_dmamem_free(sc->dmat, sc->recv_ring, sc->dmamap); - } - bus_dma_tag_destroy(sc->dmat); - } - - if (sc->ifp) - if_free(sc->ifp); -} - -/* - * Set up the logical address filter for multicast packets - */ -static __inline void -lnc_setladrf(struct lnc_softc *sc) -{ - struct ifnet *ifp = sc->ifp; - struct ifmultiaddr *ifma; - u_long index; - int i; - - if (sc->flags & IFF_ALLMULTI) { - for (i=0; i < MULTICAST_FILTER_LEN; i++) - sc->init_block->ladrf[i] = 0xFF; - return; - } - - /* - * For each multicast address, calculate a crc for that address and - * then use the high order 6 bits of the crc as a hash code where - * bits 3-5 select the byte of the address filter and bits 0-2 select - * the bit within that byte. - */ - - bzero(sc->init_block->ladrf, MULTICAST_FILTER_LEN); - IF_ADDR_LOCK(ifp); - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - - index = ether_crc32_le(LLADDR((struct sockaddr_dl *) - ifma->ifma_addr), ETHER_ADDR_LEN) >> 26; - sc->init_block->ladrf[index >> 3] |= 1 << (index & 7); - } - IF_ADDR_UNLOCK(ifp); -} - -void -lnc_stop(struct lnc_softc *sc) -{ - write_csr(sc, CSR0, STOP); -} - -static void -lnc_reset(struct lnc_softc *sc) -{ - lnc_init(sc); -} - -static void -lnc_free_mbufs(struct lnc_softc *sc) -{ - int i; - - /* - * We rely on other routines to keep the buff.mbuf field valid. If - * it's not NULL then we assume it points to an allocated mbuf. - */ - - for (i = 0; i < NDESC(sc->nrdre); i++) - if ((sc->recv_ring + i)->buff.mbuf) - m_free((sc->recv_ring + i)->buff.mbuf); - - for (i = 0; i < NDESC(sc->ntdre); i++) - if ((sc->trans_ring + i)->buff.mbuf) - m_free((sc->trans_ring + i)->buff.mbuf); - - if (sc->mbuf_count) - m_freem(sc->mbufs); -} - -static __inline int -alloc_mbuf_cluster(struct lnc_softc *sc, struct host_ring_entry *desc) -{ - register struct mds *md = desc->md; - struct mbuf *m=0; - int addr; - - /* Try and get cluster off local cache */ - if (sc->mbuf_count) { - sc->mbuf_count--; - m = sc->mbufs; - sc->mbufs = m->m_next; - /* XXX m->m_data = m->m_ext.ext_buf;*/ - } else { - MGET(m, M_DONTWAIT, MT_DATA); - if (!m) - return(1); - MCLGET(m, M_DONTWAIT); - if (!m->m_ext.ext_buf) { - m_free(m); - return(1); - } - } - - desc->buff.mbuf = m; - addr = kvtop(m->m_data); - md->md0 = addr; - md->md1= ((addr >> 16) & 0xff) | OWN; - md->md2 = -(short)(MCLBYTES - sizeof(struct pkthdr)); - md->md3 = 0; - return(0); -} - -static __inline struct mbuf * -chain_mbufs(struct lnc_softc *sc, int start_of_packet, int pkt_len) -{ - struct mbuf *head, *m; - struct host_ring_entry *desc; - - /* - * Turn head into a pkthdr mbuf -- - * assumes a pkthdr type mbuf was - * allocated to the descriptor - * originally. - */ - - desc = sc->recv_ring + start_of_packet; - - head = desc->buff.mbuf; - head->m_flags |= M_PKTHDR; - bzero(&head->m_pkthdr, sizeof(head->m_pkthdr)); - - m = head; - do { - m = desc->buff.mbuf; - m->m_len = min((MCLBYTES - sizeof(struct pkthdr)), pkt_len); - pkt_len -= m->m_len; - if (alloc_mbuf_cluster(sc, desc)) - return((struct mbuf *)NULL); - INC_MD_PTR(start_of_packet, sc->nrdre) - desc = sc->recv_ring + start_of_packet; - m->m_next = desc->buff.mbuf; - } while (start_of_packet != sc->recv_next); - - m->m_next = 0; - return(head); -} - -static __inline struct mbuf * -mbuf_packet(struct lnc_softc *sc, int start_of_packet, int pkt_len) -{ - - struct host_ring_entry *start; - struct mbuf *head,*m,*m_prev; - char *data,*mbuf_data; - short blen; - int amount; - - /* Get a pkthdr mbuf for the start of packet */ - MGETHDR(head, M_DONTWAIT, MT_DATA); - if (!head) { - LNCSTATS(drop_packet) - return(0); - } - - m = head; - m->m_len = 0; - start = sc->recv_ring + start_of_packet; - /*blen = -(start->md->md2);*/ - blen = RECVBUFSIZE; /* XXX More PCnet-32 crap */ - data = start->buff.data; - mbuf_data = m->m_data; - - while (start_of_packet != sc->recv_next) { - /* - * If the data left fits in a single buffer then set - * blen to the size of the data left. - */ - if (pkt_len < blen) - blen = pkt_len; - - /* - * amount is least of data in current ring buffer and - * amount of space left in current mbuf. - */ - amount = min(blen, M_TRAILINGSPACE(m)); - if (amount == 0) { - /* mbuf must be empty */ - m_prev = m; - MGET(m, M_DONTWAIT, MT_DATA); - if (!m) { - m_freem(head); - return(0); - } - if (pkt_len >= MINCLSIZE) - MCLGET(m, M_DONTWAIT); - m->m_len = 0; - m_prev->m_next = m; - amount = min(blen, M_TRAILINGSPACE(m)); - mbuf_data = m->m_data; - } - bcopy(data, mbuf_data, amount); - blen -= amount; - pkt_len -= amount; - m->m_len += amount; - data += amount; - mbuf_data += amount; - - if (blen == 0) { - start->md->md1 &= HADR; - start->md->md1 |= OWN; - start->md->md2 = -RECVBUFSIZE; /* XXX - shouldn't be necessary */ - INC_MD_PTR(start_of_packet, sc->nrdre) - start = sc->recv_ring + start_of_packet; - data = start->buff.data; - /*blen = -(start->md->md2);*/ - blen = RECVBUFSIZE; /* XXX More PCnet-32 crap */ - } - } - return(head); -} - - -static void -lnc_rint(struct lnc_softc *sc) -{ - struct ifnet *ifp = sc->ifp; - struct host_ring_entry *next, *start; - int start_of_packet; - struct mbuf *head; - struct ether_header *eh; - int lookahead; - int flags; - int pkt_len; - - /* - * The LANCE will issue a RINT interrupt when the ownership of the - * last buffer of a receive packet has been relinquished by the LANCE. - * Therefore, it can be assumed that a complete packet can be found - * before hitting buffers that are still owned by the LANCE, if not - * then there is a bug in the driver that is causing the descriptors - * to get out of sync. - */ - -#ifdef DIAGNOSTIC - if ((sc->recv_ring + sc->recv_next)->md->md1 & OWN) { - log(LOG_ERR, "%s: Receive interrupt with buffer still owned by controller -- Resetting\n", ifp->if_xname); - lnc_reset(sc); - return; - } - if (!((sc->recv_ring + sc->recv_next)->md->md1 & STP)) { - log(LOG_ERR, "%s: Receive interrupt but not start of packet -- Resetting\n", ifp->if_xname); - lnc_reset(sc); - return; - } -#endif - - lookahead = 0; - next = sc->recv_ring + sc->recv_next; - while ((flags = next->md->md1) & STP) { - - /* Make a note of the start of the packet */ - start_of_packet = sc->recv_next; - - /* - * Find the end of the packet. Even if not data chaining, - * jabber packets can overrun into a second descriptor. - * If there is no error, then the ENP flag is set in the last - * descriptor of the packet. If there is an error then the ERR - * flag will be set in the descriptor where the error occured. - * Therefore, to find the last buffer of a packet we search for - * either ERR or ENP. - */ - - if (!(flags & (ENP | MDERR))) { - do { - INC_MD_PTR(sc->recv_next, sc->nrdre) - next = sc->recv_ring + sc->recv_next; - flags = next->md->md1; - } while (!(flags & (STP | OWN | ENP | MDERR))); - - if (flags & STP) { - log(LOG_ERR, "%s: Start of packet found before end of previous in receive ring -- Resetting\n", ifp->if_xname); - lnc_reset(sc); - return; - } - if (flags & OWN) { - if (lookahead) { - /* - * Looked ahead into a packet still - * being received - */ - sc->recv_next = start_of_packet; - break; - } else { - log(LOG_ERR, "%s: End of received packet not found-- Resetting\n", ifp->if_xname); - lnc_reset(sc); - return; - } - } - } - - pkt_len = (next->md->md3 & MCNT) - FCS_LEN; - - /* Move pointer onto start of next packet */ - INC_MD_PTR(sc->recv_next, sc->nrdre) - next = sc->recv_ring + sc->recv_next; - - if (flags & MDERR) { - const char *if_xname = ifp->if_xname; - if (flags & RBUFF) { - LNCSTATS(rbuff) - log(LOG_ERR, "%s: Receive buffer error\n", if_xname); - } - if (flags & OFLO) { - /* OFLO only valid if ENP is not set */ - if (!(flags & ENP)) { - LNCSTATS(oflo) - log(LOG_ERR, "%s: Receive overflow error \n", if_xname); - } - } else if (flags & ENP) { - if ((ifp->if_flags & IFF_PROMISC)==0) { - /* - * FRAM and CRC are valid only if ENP - * is set and OFLO is not. - */ - if (flags & FRAM) { - LNCSTATS(fram) - log(LOG_ERR, "%s: Framing error\n", if_xname); - /* - * FRAM is only set if there's a CRC - * error so avoid multiple messages - */ - } else if (flags & CRC) { - LNCSTATS(crc) - log(LOG_ERR, "%s: Receive CRC error\n", if_xname); - } - } - } - - /* Drop packet */ - LNCSTATS(rerr) - ifp->if_ierrors++; - while (start_of_packet != sc->recv_next) { - start = sc->recv_ring + start_of_packet; - start->md->md2 = -RECVBUFSIZE; /* XXX - shouldn't be necessary */ - start->md->md1 &= HADR; - start->md->md1 |= OWN; - INC_MD_PTR(start_of_packet, sc->nrdre) - } - } else { /* Valid packet */ - - ifp->if_ipackets++; - - - if (sc->nic.mem_mode == DMA_MBUF) - head = chain_mbufs(sc, start_of_packet, pkt_len); - else - head = mbuf_packet(sc, start_of_packet, pkt_len); - - if (head) { - /* - * First mbuf in packet holds the - * ethernet and packet headers - */ - head->m_pkthdr.rcvif = ifp; - head->m_pkthdr.len = pkt_len ; - eh = (struct ether_header *) head->m_data; - - /* - * vmware ethernet hardware emulation loops - * packets back to itself, violates IFF_SIMPLEX. - * drop it if it is from myself. - */ - if (bcmp(eh->ether_shost, - IF_LLADDR(sc->ifp), ETHER_ADDR_LEN) == 0) { - m_freem(head); - } else { - (*ifp->if_input)(ifp, head); - } - } else { - log(LOG_ERR,"%s: Packet dropped, no mbufs\n",ifp->if_xname); - LNCSTATS(drop_packet) - } - } - - lookahead++; - } - - /* - * At this point all completely received packets have been processed - * so clear RINT since any packets that have arrived while we were in - * here have been dealt with. - */ - - lnc_outw(sc->rdp, RINT | INEA); -} - -static void -lnc_tint(struct lnc_softc *sc) -{ - struct host_ring_entry *next, *start; - int start_of_packet; - int lookahead; - - /* - * If the driver is reset in this routine then we return immediately to - * the interrupt driver routine. Any interrupts that have occured - * since the reset will be dealt with there. sc->trans_next - * should point to the start of the first packet that was awaiting - * transmission after the last transmit interrupt was dealt with. The - * LANCE should have relinquished ownership of that descriptor before - * the interrupt. Therefore, sc->trans_next should point to a - * descriptor with STP set and OWN cleared. If not then the driver's - * pointers are out of sync with the LANCE, which signifies a bug in - * the driver. Therefore, the following two checks are really - * diagnostic, since if the driver is working correctly they should - * never happen. - */ - -#ifdef DIAGNOSTIC - if ((sc->trans_ring + sc->trans_next)->md->md1 & OWN) { - log(LOG_ERR, "%s: Transmit interrupt with buffer still owned by controller -- Resetting\n", sc->ifp->if_xname); - lnc_reset(sc); - return; - } -#endif - - - /* - * The LANCE will write the status information for the packet it just - * tried to transmit in one of two places. If the packet was - * transmitted successfully then the status will be written into the - * last descriptor of the packet. If the transmit failed then the - * status will be written into the descriptor that was being accessed - * when the error occured and all subsequent descriptors in that - * packet will have been relinquished by the LANCE. - * - * At this point we know that sc->trans_next points to the start - * of a packet that the LANCE has just finished trying to transmit. - * We now search for a buffer with either ENP or ERR set. - */ - - lookahead = 0; - - do { - start_of_packet = sc->trans_next; - next = sc->trans_ring + sc->trans_next; - -#ifdef DIAGNOSTIC - if (!(next->md->md1 & STP)) { - log(LOG_ERR, "%s: Transmit interrupt but not start of packet -- Resetting\n", sc->ifp->if_xname); - lnc_reset(sc); - return; - } -#endif - - /* - * Find end of packet. - */ - - if (!(next->md->md1 & (ENP | MDERR))) { - do { - INC_MD_PTR(sc->trans_next, sc->ntdre) - next = sc->trans_ring + sc->trans_next; - } while (!(next->md->md1 & (STP | OWN | ENP | MDERR))); - - if (next->md->md1 & STP) { - log(LOG_ERR, "%s: Start of packet found before end of previous in transmit ring -- Resetting\n", sc->ifp->if_xname); - lnc_reset(sc); - return; - } - if (next->md->md1 & OWN) { - if (lookahead) { - /* - * Looked ahead into a packet still - * being transmitted - */ - sc->trans_next = start_of_packet; - break; - } else { - log(LOG_ERR, "%s: End of transmitted packet not found -- Resetting\n", sc->ifp->if_xname); - lnc_reset(sc); - return; - } - } - } - /* - * Check for ERR first since other flags are irrelevant if an - * error occurred. - */ - if (next->md->md1 & MDERR) { - - LNCSTATS(terr) - sc->ifp->if_oerrors++; - - if (next->md->md3 & LCOL) { - LNCSTATS(lcol) - log(LOG_ERR, "%s: Transmit late collision -- Net error?\n", sc->ifp->if_xname); - sc->ifp->if_collisions++; - /* - * Clear TBUFF since it's not valid when LCOL - * set - */ - next->md->md3 &= ~TBUFF; - } - if (next->md->md3 & LCAR) { - LNCSTATS(lcar) - log(LOG_ERR, "%s: Loss of carrier during transmit -- Net error?\n", sc->ifp->if_xname); - } - if (next->md->md3 & RTRY) { - LNCSTATS(rtry) - log(LOG_ERR, "%s: Transmit of packet failed after 16 attempts -- TDR = %d\n", sc->ifp->if_xname, ((sc->trans_ring + sc->trans_next)->md->md3 & TDR)); - sc->ifp->if_collisions += 16; - /* - * Clear TBUFF since it's not valid when RTRY - * set - */ - next->md->md3 &= ~TBUFF; - } - /* - * TBUFF is only valid if neither LCOL nor RTRY are set. - * We need to check UFLO after LCOL and RTRY so that we - * know whether or not TBUFF is valid. If either are - * set then TBUFF will have been cleared above. A - * UFLO error will turn off the transmitter so we - * have to reset. - * - */ - - if (next->md->md3 & UFLO) { - LNCSTATS(uflo) - /* - * If an UFLO has occured it's possibly due - * to a TBUFF error - */ - if (next->md->md3 & TBUFF) { - LNCSTATS(tbuff) - log(LOG_ERR, "%s: Transmit buffer error -- Resetting\n", sc->ifp->if_xname); - } else - log(LOG_ERR, "%s: Transmit underflow error -- Resetting\n", sc->ifp->if_xname); - lnc_reset(sc); - return; - } - do { - INC_MD_PTR(sc->trans_next, sc->ntdre) - next = sc->trans_ring + sc->trans_next; - } while (!(next->md->md1 & STP) && (sc->trans_next != sc->next_to_send)); - - } else { - /* - * Since we check for ERR first then if we get here - * the packet was transmitted correctly. There may - * still have been non-fatal errors though. - * Don't bother checking for DEF, waste of time. - */ - - sc->ifp->if_opackets++; - - if (next->md->md1 & MORE) { - LNCSTATS(more) - sc->ifp->if_collisions += 2; - } - - /* - * ONE is invalid if LCOL is set. If LCOL was set then - * ERR would have also been set and we would have - * returned from lnc_tint above. Therefore we can - * assume if we arrive here that ONE is valid. - * - */ - - if (next->md->md1 & ONE) { - LNCSTATS(one) - sc->ifp->if_collisions++; - } - INC_MD_PTR(sc->trans_next, sc->ntdre) - next = sc->trans_ring + sc->trans_next; - } - - /* - * Clear descriptors and free any mbufs. - */ - - do { - start = sc->trans_ring + start_of_packet; - start->md->md1 &= HADR; - if (sc->nic.mem_mode == DMA_MBUF) { - /* Cache clusters on a local queue */ - if ((start->buff.mbuf->m_flags & M_EXT) && (sc->mbuf_count < MBUF_CACHE_LIMIT)) { - if (sc->mbuf_count) { - start->buff.mbuf->m_next = sc->mbufs; - sc->mbufs = start->buff.mbuf; - } else - sc->mbufs = start->buff.mbuf; - sc->mbuf_count++; - start->buff.mbuf = 0; - } else { - /* - * XXX should this be m_freem()? - */ - m_free(start->buff.mbuf); - start->buff.mbuf = NULL; - } - } - sc->pending_transmits--; - INC_MD_PTR(start_of_packet, sc->ntdre) - }while (start_of_packet != sc->trans_next); - - /* - * There's now at least one free descriptor - * in the ring so indicate that we can accept - * more packets again. - */ - - sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - lookahead++; - - } while (sc->pending_transmits && !(next->md->md1 & OWN)); - - /* - * Clear TINT since we've dealt with all - * the completed transmissions. - */ - - lnc_outw(sc->rdp, TINT | INEA); -} - -int -lnc_attach_common(device_t dev) -{ - lnc_softc_t *sc = device_get_softc(dev); - int i; - int skip; - u_char eaddr[6]; - - switch (sc->nic.ident) { - case BICC: - case CNET98S: - skip = 2; - break; - default: - skip = 1; - break; - } - - /* Set default mode */ - sc->nic.mode = NORMAL; - - /* Fill in arpcom structure entries */ - - sc->ifp = if_alloc(IFT_ETHER); - if (sc->ifp == NULL) { - device_printf(dev, "can not if_alloc()\n"); - return (0); - } - sc->ifp->if_softc = sc; - if_initname(sc->ifp, device_get_name(dev), - device_get_unit(dev)); - sc->ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | - IFF_MULTICAST | IFF_NEEDSGIANT; - sc->ifp->if_timer = 0; - sc->ifp->if_start = lnc_start; - sc->ifp->if_ioctl = lnc_ioctl; - sc->ifp->if_watchdog = lnc_watchdog; - sc->ifp->if_init = lnc_init; - IFQ_SET_MAXLEN(&sc->ifp->if_snd, IFQ_MAXLEN); - sc->ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; - IFQ_SET_READY(&sc->ifp->if_snd); - - /* Extract MAC address from PROM */ - for (i = 0; i < ETHER_ADDR_LEN; i++) - eaddr[i] = lnc_inb(i * skip); - - ether_ifattach(sc->ifp, eaddr); - - if (sc->nic.ic == LANCE || sc->nic.ic == C_LANCE) - if_printf(sc->ifp, "%s (%s)\n", - nic_ident[sc->nic.ident], ic_ident[sc->nic.ic]); - else - if_printf(sc->ifp, "%s\n", ic_ident[sc->nic.ic]); - - return (1); -} - -int -lnc_detach_common(device_t dev) { - lnc_softc_t *sc = device_get_softc(dev); - int s = splimp(); - - ether_ifdetach(sc->ifp); - lnc_stop(sc); - lnc_release_resources(dev); - - splx(s); - return (0); -} - -static void -lnc_init(xsc) - void *xsc; -{ - struct lnc_softc *sc = xsc; - int s, i; - char *lnc_mem; - - /* Shut down interface */ - - s = splimp(); - lnc_stop(sc); - sc->ifp->if_flags |= IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; /* XXX??? */ - - /* - * This sets up the memory area for the controller. Memory is set up for - * the initialisation block (12 words of contiguous memory starting - * on a word boundary),the transmit and receive ring structures (each - * entry is 4 words long and must start on a quadword boundary) and - * the data buffers. - * - * The alignment tests are particularly paranoid. - */ - - sc->recv_next = 0; - sc->trans_ring = sc->recv_ring + NDESC(sc->nrdre); - sc->trans_next = 0; - - if (sc->nic.mem_mode == SHMEM) - lnc_mem = (char *)(uintptr_t)sc->nic.iobase; - else - lnc_mem = (char *) (sc->trans_ring + NDESC(sc->ntdre)); - - lnc_mem = (char *)(((long)lnc_mem + 1) & ~1); - sc->init_block = (struct init_block *) ((long) lnc_mem & ~1); - lnc_mem = (char *) (sc->init_block + 1); - lnc_mem = (char *)(((long)lnc_mem + 7) & ~7); - - /* Initialise pointers to descriptor entries */ - for (i = 0; i < NDESC(sc->nrdre); i++) { - (sc->recv_ring + i)->md = (struct mds *) lnc_mem; - lnc_mem += sizeof(struct mds); - } - for (i = 0; i < NDESC(sc->ntdre); i++) { - (sc->trans_ring + i)->md = (struct mds *) lnc_mem; - lnc_mem += sizeof(struct mds); - } - - /* Initialise the remaining ring entries */ - - if (sc->nic.mem_mode == DMA_MBUF) { - - sc->mbufs = 0; - sc->mbuf_count = 0; - - /* Free previously allocated mbufs */ - if (sc->flags & LNC_INITIALISED) - lnc_free_mbufs(sc); - - - for (i = 0; i < NDESC(sc->nrdre); i++) { - if (alloc_mbuf_cluster(sc, sc->recv_ring+i)) { - log(LOG_ERR, "Initialisation failed -- no mbufs\n"); - splx(s); - return; - } - } - - for (i = 0; i < NDESC(sc->ntdre); i++) { - (sc->trans_ring + i)->buff.mbuf = 0; - (sc->trans_ring + i)->md->md0 = 0; - (sc->trans_ring + i)->md->md1 = 0; - (sc->trans_ring + i)->md->md2 = 0; - (sc->trans_ring + i)->md->md3 = 0; - } - } else { - for (i = 0; i < NDESC(sc->nrdre); i++) { - (sc->recv_ring + i)->md->md0 = kvtop(lnc_mem); - (sc->recv_ring + i)->md->md1 = ((kvtop(lnc_mem) >> 16) & 0xff) | OWN; - (sc->recv_ring + i)->md->md2 = -RECVBUFSIZE; - (sc->recv_ring + i)->md->md3 = 0; - (sc->recv_ring + i)->buff.data = lnc_mem; - lnc_mem += RECVBUFSIZE; - } - for (i = 0; i < NDESC(sc->ntdre); i++) { - (sc->trans_ring + i)->md->md0 = kvtop(lnc_mem); - (sc->trans_ring + i)->md->md1 = ((kvtop(lnc_mem) >> 16) & 0xff); - (sc->trans_ring + i)->md->md2 = 0; - (sc->trans_ring + i)->md->md3 = 0; - (sc->trans_ring + i)->buff.data = lnc_mem; - lnc_mem += TRANSBUFSIZE; - } - } - - sc->next_to_send = 0; - - /* Set up initialisation block */ - - sc->init_block->mode = sc->nic.mode; - - for (i = 0; i < ETHER_ADDR_LEN; i++) - sc->init_block->padr[i] = IF_LLADDR(sc->ifp)[i]; - - lnc_setladrf(sc); - - sc->init_block->rdra = kvtop(sc->recv_ring->md); - sc->init_block->rlen = ((kvtop(sc->recv_ring->md) >> 16) & 0xff) | (sc->nrdre << 13); - sc->init_block->tdra = kvtop(sc->trans_ring->md); - sc->init_block->tlen = ((kvtop(sc->trans_ring->md) >> 16) & 0xff) | (sc->ntdre << 13); - - - /* Set flags to show that the memory area is valid */ - sc->flags |= LNC_INITIALISED; - - sc->pending_transmits = 0; - - /* Give the LANCE the physical address of the initialisation block */ - - if (sc->nic.ic == PCnet_Home) { - u_short media; - /* Set PHY_SEL to HomeRun */ - media = read_bcr(sc, BCR49); - media &= ~3; - media |= 1; - write_bcr(sc, BCR49, media); - } - - write_csr(sc, CSR1, kvtop(sc->init_block)); - write_csr(sc, CSR2, (kvtop(sc->init_block) >> 16) & 0xff); - - /* - * Depending on which controller this is, CSR3 has different meanings. - * For the Am7990 it controls DMA operations, for the Am79C960 it - * controls interrupt masks and transmitter algorithms. In either - * case, none of the flags are set. - * - */ - - write_csr(sc, CSR3, 0); - - /* Let's see if it starts */ -/* -printf("Enabling lnc interrupts\n"); - sc->ifp->if_timer = 10; - write_csr(sc, CSR0, INIT|INEA); -*/ - - /* - * Now that the initialisation is complete there's no reason to - * access anything except CSR0, so we leave RAP pointing there - * so we can just access RDP from now on, saving an outw each - * time. - */ - - write_csr(sc, CSR0, INIT); - for(i=0; i < 1000; i++) - if (read_csr(sc, CSR0) & IDON) - break; - - if (read_csr(sc, CSR0) & IDON) { - /* - * Enable interrupts, start the LANCE, mark the interface as - * running and transmit any pending packets. - */ - write_csr(sc, CSR0, STRT | INEA); - sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; - sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - lnc_start(sc->ifp); - } else - log(LOG_ERR, "%s: Initialisation failed\n", - sc->ifp->if_xname); - - splx(s); -} - -/* - * The interrupt flag (INTR) will be set and provided that the interrupt enable - * flag (INEA) is also set, the interrupt pin will be driven low when any of - * the following occur: - * - * 1) Completion of the initialisation routine (IDON). 2) The reception of a - * packet (RINT). 3) The transmission of a packet (TINT). 4) A transmitter - * timeout error (BABL). 5) A missed packet (MISS). 6) A memory error (MERR). - * - * The interrupt flag is cleared when all of the above conditions are cleared. - * - * If the driver is reset from this routine then it first checks to see if any - * interrupts have ocurred since the reset and handles them before returning. - * This is because the NIC may signify a pending interrupt in CSR0 using the - * INTR flag even if a hardware interrupt is currently inhibited (at least I - * think it does from reading the data sheets). We may as well deal with - * these pending interrupts now rather than get the overhead of another - * hardware interrupt immediately upon returning from the interrupt handler. - * - */ - -void -lncintr(void *arg) -{ - lnc_softc_t *sc = arg; - u_short csr0; - - /* - * INEA is the only bit that can be cleared by writing a 0 to it so - * we have to include it in any writes that clear other flags. - */ - - while ((csr0 = lnc_inw(sc->rdp)) & INTR) { - - /* - * Clear interrupt flags early to avoid race conditions. The - * controller can still set these flags even while we're in - * this interrupt routine. If the flag is still set from the - * event that caused this interrupt any new events will - * be missed. - */ - - lnc_outw(sc->rdp, csr0); - /*lnc_outw(sc->rdp, IDON | CERR | BABL | MISS | MERR | RINT | TINT | INEA);*/ - -#ifdef notyet - if (csr0 & IDON) { -printf("IDON\n"); - sc->ifp->if_timer = 0; - write_csr(sc, CSR0, STRT | INEA); - sc->ifp->if_drv_flags |= IFF_DRV_RUNNING; - sc->ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - lnc_start(sc->ifp); - continue; - } -#endif - - if (csr0 & ERR) { - if (csr0 & CERR) { - log(LOG_ERR, "%s: Heartbeat error -- SQE test failed\n", sc->ifp->if_xname); - LNCSTATS(cerr) - } - if (csr0 & BABL) { - log(LOG_ERR, "%s: Babble error - more than 1519 bytes transmitted\n", sc->ifp->if_xname); - LNCSTATS(babl) - sc->ifp->if_oerrors++; - } - if (csr0 & MISS) { - log(LOG_ERR, "%s: Missed packet -- no receive buffer\n", sc->ifp->if_xname); - LNCSTATS(miss) - sc->ifp->if_ierrors++; - } - if (csr0 & MERR) { - log(LOG_ERR, "%s: Memory error -- Resetting\n", sc->ifp->if_xname); - LNCSTATS(merr) - lnc_reset(sc); - continue; - } - } - if (csr0 & RINT) { - LNCSTATS(rint) - lnc_rint(sc); - } - if (csr0 & TINT) { - LNCSTATS(tint) - sc->ifp->if_timer = 0; - lnc_tint(sc); - } - - /* - * If there's room in the transmit descriptor ring then queue - * some more transmit packets. - */ - - if (!(sc->ifp->if_drv_flags & IFF_DRV_OACTIVE)) - lnc_start(sc->ifp); - } -} - -static __inline int -mbuf_to_buffer(struct mbuf *m, char *buffer) -{ - - int len=0; - - for( ; m; m = m->m_next) { - bcopy(mtod(m, caddr_t), buffer, m->m_len); - buffer += m->m_len; - len += m->m_len; - } - - return(len); -} - -static __inline struct mbuf * -chain_to_cluster(struct mbuf *m) -{ - struct mbuf *new; - - MGET(new, M_DONTWAIT, MT_DATA); - if (new) { - MCLGET(new, M_DONTWAIT); - if (new->m_ext.ext_buf) { - new->m_len = mbuf_to_buffer(m, new->m_data); - m_freem(m); - return(new); - } else - m_free(new); - } - return(0); -} - -/* - * IFF_DRV_OACTIVE and IFF_DRV_RUNNING are checked in ether_output so it's - * redundant to check them again since we wouldn't have got here if they were - * not appropriately set. This is also called from lnc_init and lncintr but the - * flags should be ok at those points too. - */ - -static void -lnc_start(struct ifnet *ifp) -{ - - struct lnc_softc *sc = ifp->if_softc; - struct host_ring_entry *desc; - int tmp; - int end_of_packet; - struct mbuf *head, *m; - int len, chunk; - int addr; - int no_entries_needed; - - do { - - IFQ_DRV_DEQUEUE(&sc->ifp->if_snd, head); - if (!head) - return; - - if (sc->nic.mem_mode == DMA_MBUF) { - - no_entries_needed = 0; - for (m=head; m; m = m->m_next) - no_entries_needed++; - - /* - * We try and avoid bcopy as much as possible - * but there are two cases when we use it. - * - * 1) If there are not enough free entries in the ring - * to hold each mbuf in the chain then compact the - * chain into a single cluster. - * - * 2) The Am7990 and Am79C90 must not have less than - * 100 bytes in the first descriptor of a chained - * packet so it's necessary to shuffle the mbuf - * contents to ensure this. - */ - - - if (no_entries_needed > (NDESC(sc->ntdre) - sc->pending_transmits)) { - if (!(head = chain_to_cluster(head))) { - log(LOG_ERR, "%s: Couldn't get mbuf for transmit packet -- Resetting \n ",ifp->if_xname); - lnc_reset(sc); - return; - } - } else if ((sc->nic.ic == LANCE) || (sc->nic.ic == C_LANCE)) { - if ((head->m_len < 100) && (head->m_next)) { - len = 100 - head->m_len; - if (M_TRAILINGSPACE(head) < len) { - /* - * Move data to start of data - * area. We assume the first - * mbuf has a packet header - * and is not a cluster. - */ - bcopy((caddr_t)head->m_data, (caddr_t)head->m_pktdat, head->m_len); - head->m_data = head->m_pktdat; - } - m = head->m_next; - while (m && (len > 0)) { - chunk = min(len, m->m_len); - bcopy(mtod(m, caddr_t), mtod(head, caddr_t) + head->m_len, chunk); - len -= chunk; - head->m_len += chunk; - m->m_len -= chunk; - m->m_data += chunk; - if (m->m_len <= 0) { - m = m_free(m); - head->m_next = m; - } - } - } - } - - tmp = sc->next_to_send; - - /* - * On entering this loop we know that tmp points to a - * descriptor with a clear OWN bit. - */ - - desc = sc->trans_ring + tmp; - len = ETHER_MIN_LEN; - for (m = head; m; m = m->m_next) { - desc->buff.mbuf = m; - addr = kvtop(m->m_data); - desc->md->md0 = addr; - desc->md->md1 = ((addr >> 16) & 0xff); - desc->md->md3 = 0; - desc->md->md2 = -m->m_len; - sc->pending_transmits++; - len -= m->m_len; - - INC_MD_PTR(tmp, sc->ntdre) - desc = sc->trans_ring + tmp; - } - - end_of_packet = tmp; - DEC_MD_PTR(tmp, sc->ntdre) - desc = sc->trans_ring + tmp; - desc->md->md1 |= ENP; - - if (len > 0) - desc->md->md2 -= len; - - /* - * Set OWN bits in reverse order, otherwise the Lance - * could start sending the packet before all the - * buffers have been relinquished by the host. - */ - - while (tmp != sc->next_to_send) { - desc->md->md1 |= OWN; - DEC_MD_PTR(tmp, sc->ntdre) - desc = sc->trans_ring + tmp; - } - sc->next_to_send = end_of_packet; - desc->md->md1 |= STP | OWN; - } else { - sc->pending_transmits++; - desc = sc->trans_ring + sc->next_to_send; - len = mbuf_to_buffer(head, desc->buff.data); - desc->md->md3 = 0; - desc->md->md2 = -max(len, ETHER_MIN_LEN - ETHER_CRC_LEN); - desc->md->md1 |= OWN | STP | ENP; - INC_MD_PTR(sc->next_to_send, sc->ntdre) - } - - /* Force an immediate poll of the transmit ring */ - lnc_outw(sc->rdp, TDMD | INEA); - - /* - * Set a timer so if the buggy Am7990.h shuts - * down we can wake it up. - */ - - ifp->if_timer = 2; - - BPF_MTAP(sc->ifp, head); - - if (sc->nic.mem_mode != DMA_MBUF) - m_freem(head); - - } while (sc->pending_transmits < NDESC(sc->ntdre)); - - /* - * Transmit ring is full so set IFF_DRV_OACTIVE - * since we can't buffer any more packets. - */ - - sc->ifp->if_drv_flags |= IFF_DRV_OACTIVE; - LNCSTATS(trans_ring_full) -} - -static int -lnc_ioctl(struct ifnet * ifp, u_long command, caddr_t data) -{ - - struct lnc_softc *sc = ifp->if_softc; - int s, error = 0; - - s = splimp(); - - switch (command) { - case SIOCSIFFLAGS: -#ifdef DEBUG - if (ifp->if_flags & IFF_DEBUG) - sc->lnc_debug = 1; - else - sc->lnc_debug = 0; -#endif - if (ifp->if_flags & IFF_PROMISC) { - if (!(sc->nic.mode & PROM)) { - sc->nic.mode |= PROM; - lnc_init(sc); - } - } else if (sc->nic.mode & PROM) { - sc->nic.mode &= ~PROM; - lnc_init(sc); - } - - if ((ifp->if_flags & IFF_ALLMULTI) && - !(sc->flags & LNC_ALLMULTI)) { - sc->flags |= LNC_ALLMULTI; - lnc_init(sc); - } else if (!(ifp->if_flags & IFF_ALLMULTI) && - (sc->flags & LNC_ALLMULTI)) { - sc->flags &= ~LNC_ALLMULTI; - lnc_init(sc); - } - - if ((ifp->if_flags & IFF_UP) == 0 && - (ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { - /* - * If interface is marked down and it is running, - * then stop it. - */ - lnc_stop(sc); - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; - } else if ((ifp->if_flags & IFF_UP) != 0 && - (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - /* - * If interface is marked up and it is stopped, then - * start it. - */ - lnc_init(sc); - } - break; - case SIOCADDMULTI: - case SIOCDELMULTI: - lnc_init(sc); - error = 0; - break; - default: - error = ether_ioctl(ifp, command, data); - break; - } - (void) splx(s); - return error; -} - -static void -lnc_watchdog(struct ifnet *ifp) -{ - log(LOG_ERR, "%s: Device timeout -- Resetting\n", ifp->if_xname); - ifp->if_oerrors++; - lnc_reset(ifp->if_softc); -} - -#ifdef DEBUG -void -lnc_dump_state(struct lnc_softc *sc) -{ - int i; - - printf("\nDriver/NIC [%s] state dump\n", sc->ifp->if_xname); - printf("Memory access mode: %b\n", sc->nic.mem_mode, MEM_MODES); - printf("Host memory\n"); - printf("-----------\n"); - - printf("Receive ring: base = %p, next = %p\n", - (void *)sc->recv_ring, (void *)(sc->recv_ring + sc->recv_next)); - for (i = 0; i < NDESC(sc->nrdre); i++) - printf("\t%d:%p md = %p buff = %p\n", - i, (void *)(sc->recv_ring + i), - (void *)(sc->recv_ring + i)->md, - (void *)(sc->recv_ring + i)->buff.data); - - printf("Transmit ring: base = %p, next = %p\n", - (void *)sc->trans_ring, (void *)(sc->trans_ring + sc->trans_next)); - for (i = 0; i < NDESC(sc->ntdre); i++) - printf("\t%d:%p md = %p buff = %p\n", - i, (void *)(sc->trans_ring + i), - (void *)(sc->trans_ring + i)->md, - (void *)(sc->trans_ring + i)->buff.data); - printf("Lance memory (may be on host(DMA) or card(SHMEM))\n"); - printf("Init block = %p\n", (void *)sc->init_block); - printf("\tmode = %b rlen:rdra = %x:%x tlen:tdra = %x:%x\n", - sc->init_block->mode, INIT_MODE, sc->init_block->rlen, - sc->init_block->rdra, sc->init_block->tlen, sc->init_block->tdra); - printf("Receive descriptor ring\n"); - for (i = 0; i < NDESC(sc->nrdre); i++) - printf("\t%d buffer = 0x%x%x, BCNT = %d,\tMCNT = %u,\tflags = %b\n", - i, ((sc->recv_ring + i)->md->md1 & HADR), - (sc->recv_ring + i)->md->md0, - -(short) (sc->recv_ring + i)->md->md2, - (sc->recv_ring + i)->md->md3, - (((sc->recv_ring + i)->md->md1 & ~HADR) >> 8), RECV_MD1); - printf("Transmit descriptor ring\n"); - for (i = 0; i < NDESC(sc->ntdre); i++) - printf("\t%d buffer = 0x%x%x, BCNT = %d,\tflags = %b %b\n", - i, ((sc->trans_ring + i)->md->md1 & HADR), - (sc->trans_ring + i)->md->md0, - -(short) (sc->trans_ring + i)->md->md2, - ((sc->trans_ring + i)->md->md1 >> 8), TRANS_MD1, - ((sc->trans_ring + i)->md->md3 >> 10), TRANS_MD3); - printf("\nnext_to_send = %x\n", sc->next_to_send); - printf("\n CSR0 = %b CSR1 = %x CSR2 = %x CSR3 = %x\n\n", - read_csr(sc, CSR0), CSR0_FLAGS, read_csr(sc, CSR1), - read_csr(sc, CSR2), read_csr(sc, CSR3)); - - /* Set RAP back to CSR0 */ - lnc_outw(sc->rap, CSR0); -} - -void -mbuf_dump_chain(struct mbuf * m) -{ - -#define MBUF_FLAGS \ - "\20\1M_EXT\2M_PKTHDR\3M_EOR\4UNKNOWN\5M_BCAST\6M_MCAST" - - if (!m) - log(LOG_DEBUG, "m == NULL\n"); - do { - log(LOG_DEBUG, "m = %p\n", (void *)m); - log(LOG_DEBUG, "m_hdr.mh_next = %p\n", - (void *)m->m_hdr.mh_next); - log(LOG_DEBUG, "m_hdr.mh_nextpkt = %p\n", - (void *)m->m_hdr.mh_nextpkt); - log(LOG_DEBUG, "m_hdr.mh_len = %d\n", m->m_hdr.mh_len); - log(LOG_DEBUG, "m_hdr.mh_data = %p\n", - (void *)m->m_hdr.mh_data); - log(LOG_DEBUG, "m_hdr.mh_type = %d\n", m->m_hdr.mh_type); - log(LOG_DEBUG, "m_hdr.mh_flags = %b\n", m->m_hdr.mh_flags, - MBUF_FLAGS); - if (!(m->m_hdr.mh_flags & (M_PKTHDR | M_EXT))) - log(LOG_DEBUG, "M_dat.M_databuf = %p\n", - (void *)m->M_dat.M_databuf); - else { - if (m->m_hdr.mh_flags & M_PKTHDR) { - log(LOG_DEBUG, "M_dat.MH.MH_pkthdr.len = %d\n", - m->M_dat.MH.MH_pkthdr.len); - log(LOG_DEBUG, - "M_dat.MH.MH_pkthdr.rcvif = %p\n", - (void *)m->M_dat.MH.MH_pkthdr.rcvif); - if (!(m->m_hdr.mh_flags & M_EXT)) - log(LOG_DEBUG, - "M_dat.MH.MH_dat.MH_databuf = %p\n", - (void *)m->M_dat.MH.MH_dat.MH_databuf); - } - if (m->m_hdr.mh_flags & M_EXT) { - log(LOG_DEBUG, - "M_dat.MH.MH_dat.MH_ext.ext_buff %p\n", - (void *)m->M_dat.MH.MH_dat.MH_ext.ext_buf); - log(LOG_DEBUG, - "M_dat.MH.MH_dat.MH_ext.ext_free %p\n", - (void *)m->M_dat.MH.MH_dat.MH_ext.ext_free); - log(LOG_DEBUG, - "M_dat.MH.MH_dat.MH_ext.ext_size %d\n", - m->M_dat.MH.MH_dat.MH_ext.ext_size); - } - } - } while ((m = m->m_next) != NULL); -} -#endif diff --git a/sys/dev/lnc/if_lnc_cbus.c b/sys/dev/lnc/if_lnc_cbus.c deleted file mode 100644 index 0657f40..0000000 --- a/sys/dev/lnc/if_lnc_cbus.c +++ /dev/null @@ -1,307 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * PC-98 port by Chiharu Shibata & FreeBSD(98) porting team. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/module.h> -#include <sys/malloc.h> -#include <sys/socket.h> - -#include <machine/clock.h> /* DELAY() */ -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_dl.h> - -#include <isa/isavar.h> - -#include <dev/lnc/if_lncvar.h> -#include <dev/lnc/if_lncreg.h> - -static struct isa_pnp_id lnc_pnp_ids[] = { - {0, NULL} -}; - -static bus_addr_t lnc_ioaddr_cnet98s[CNET98S_IOSIZE] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, - 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, -}; - -static int -lnc_legacy_probe(device_t dev) -{ - struct lnc_softc *sc = device_get_softc(dev); - u_int16_t tmp; - - sc->portrid = 0; - sc->portres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &sc->portrid, - lnc_ioaddr_cnet98s, CNET98S_IOSIZE, - RF_ACTIVE); - - if (! sc->portres) { - device_printf(dev, "Failed to allocate I/O ports\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - isa_load_resourcev(sc->portres, lnc_ioaddr_cnet98s, CNET98S_IOSIZE); - - sc->lnc_btag = rman_get_bustag(sc->portres); - sc->lnc_bhandle = rman_get_bushandle(sc->portres); - - /* Reset */ - tmp = lnc_inw(CNET98S_RESET); - lnc_outw(CNET98S_RESET, tmp); - DELAY(500); - - sc->rap = CNET98S_RAP; - sc->rdp = CNET98S_RDP; - sc->nic.mem_mode = DMA_FIXED; - - if ((sc->nic.ic = lance_probe(sc))) { - sc->nic.ident = CNET98S; - device_set_desc(dev, "C-NET(98)S"); - lnc_release_resources(dev); - return (0); - } else { - lnc_release_resources(dev); - return (ENXIO); - } -} - -static int -lnc_isa_probe(device_t dev) -{ - int pnp; - - pnp = ISA_PNP_PROBE(device_get_parent(dev), dev, lnc_pnp_ids); - if (pnp == ENOENT) { - /* It's not a PNP card, see if we support it by probing it */ - return (lnc_legacy_probe(dev)); - } else if (pnp == ENXIO) { - return (ENXIO); - } else { - /* Found PNP card we support */ - return (0); - } -} - -static void -lnc_alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error) -{ - /* Do nothing */ - return; -} - -static int -lnc_isa_attach(device_t dev) -{ - lnc_softc_t *sc = device_get_softc(dev); - int err = 0; - bus_size_t lnc_mem_size; - - device_printf(dev, "Attaching %s\n", device_get_desc(dev)); - - sc->portrid = 0; - sc->portres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &sc->portrid, - lnc_ioaddr_cnet98s, CNET98S_IOSIZE, - RF_ACTIVE); - - if (! sc->portres) { - device_printf(dev, "Failed to allocate I/O ports\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - isa_load_resourcev(sc->portres, lnc_ioaddr_cnet98s, CNET98S_IOSIZE); - - sc->lnc_btag = rman_get_bustag(sc->portres); - sc->lnc_bhandle = rman_get_bushandle(sc->portres); - - sc->drqrid = 0; - sc->drqres = NULL; - - if (isa_get_irq(dev) == -1) - bus_set_resource(dev, SYS_RES_IRQ, 0, 6, 1); - - sc->irqrid = 0; - sc->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqrid, - RF_ACTIVE); - - if (! sc->irqres) { - device_printf(dev, "Failed to allocate irq\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - err = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, lncintr, - sc, &sc->intrhand); - - if (err) { - device_printf(dev, "Failed to setup irq handler\n"); - lnc_release_resources(dev); - return (err); - } - - /* XXX temp setting for nic */ - sc->nic.mem_mode = DMA_FIXED; - sc->nrdre = NRDRE; - sc->ntdre = NTDRE; - - if (sc->nic.ident == CNET98S) { - sc->rap = CNET98S_RAP; - sc->rdp = CNET98S_RDP; - } else if (sc->nic.ident == NE2100) { - sc->rap = PCNET_RAP; - sc->rdp = PCNET_RDP; - sc->bdp = PCNET_BDP; - } else { - sc->rap = BICC_RAP; - sc->rdp = BICC_RDP; - } - - /* Create a DMA tag describing the ring memory we need */ - - lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) * - sizeof(struct host_ring_entry)); - - lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) + - (NDESC(sc->ntdre) * TRANSBUFSIZE); - - err = bus_dma_tag_create(NULL, /* parent */ - 4, /* alignement */ - 0, /* boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - lnc_mem_size, /* segsize */ - 1, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - busdma_lock_mutex, /* lockfunc */ - &Giant, /* lockarg */ - &sc->dmat); - - if (err) { - device_printf(dev, "Can't create DMA tag\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - err = bus_dmamem_alloc(sc->dmat, (void **)&sc->recv_ring, - BUS_DMA_NOWAIT, &sc->dmamap); - - if (err) { - device_printf(dev, "Couldn't allocate memory\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - err = bus_dmamap_load(sc->dmat, sc->dmamap, sc->recv_ring, lnc_mem_size, - lnc_alloc_callback, sc->recv_ring, BUS_DMA_NOWAIT); - - if (err) { - device_printf(dev, "Couldn't load DMA map\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - /* Call generic attach code */ - if (! lnc_attach_common(dev)) { - device_printf(dev, "Generic attach code failed\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - /* - * ISA Configuration - * - * XXX - Following parameters are Contec C-NET(98)S only. - * So, check the Ethernet address here. - * - * Contec uses 00 80 4c ?? ?? ?? - */ - if (IF_LLADDR(sc->ifp)[0] == (char)0x00 && - IF_LLADDR(sc->ifp)[1] == (char)0x80 && - IF_LLADDR(sc->ifp)[2] == (char)0x4c) { - lnc_outw(sc->rap, MSRDA); - lnc_outw(CNET98S_IDP, 0x0006); - lnc_outw(sc->rap, MSWRA); - lnc_outw(CNET98S_IDP, 0x0006); -#ifdef DIAGNOSTIC - lnc_outw(sc->rap, MC); - printf("ISACSR2 = %x\n", lnc_inw(CNET98S_IDP)); -#endif - lnc_outw(sc->rap, LED1); - lnc_outw(CNET98S_IDP, LED_PSE | LED_XMTE); - lnc_outw(sc->rap, LED2); - lnc_outw(CNET98S_IDP, LED_PSE | LED_RCVE); - lnc_outw(sc->rap, LED3); - lnc_outw(CNET98S_IDP, LED_PSE | LED_COLE); - } - - return (0); -} - -static device_method_t lnc_isa_methods[] = { -/* DEVMETHOD(device_identify, lnc_isa_identify), */ - DEVMETHOD(device_probe, lnc_isa_probe), - DEVMETHOD(device_attach, lnc_isa_attach), - DEVMETHOD(device_detach, lnc_detach_common), -#ifdef notyet - DEVMETHOD(device_suspend, lnc_isa_suspend), - DEVMETHOD(device_resume, lnc_isa_resume), - DEVMETHOD(device_shutdown, lnc_isa_shutdown), -#endif - { 0, 0 } -}; - -static driver_t lnc_isa_driver = { - "lnc", - lnc_isa_methods, - sizeof(struct lnc_softc), -}; - -DRIVER_MODULE(lnc, isa, lnc_isa_driver, lnc_devclass, 0, 0); -MODULE_DEPEND(lnc, isa, 1, 1, 1); -MODULE_DEPEND(lnc, ether, 1, 1, 1); diff --git a/sys/dev/lnc/if_lnc_isa.c b/sys/dev/lnc/if_lnc_isa.c deleted file mode 100644 index ac0cf97..0000000 --- a/sys/dev/lnc/if_lnc_isa.c +++ /dev/null @@ -1,278 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/kernel.h> -#include <sys/malloc.h> -#include <sys/module.h> -#include <sys/socket.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> - -#include <isa/isavar.h> - -#include <dev/lnc/if_lncvar.h> -#include <dev/lnc/if_lncreg.h> - -static struct isa_pnp_id lnc_pnp_ids[] = { - {0, NULL} -}; - -static int -lnc_legacy_probe(device_t dev) -{ - struct lnc_softc *sc = device_get_softc(dev); - - sc->portrid = 0; - sc->portres = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->portrid, - RF_ACTIVE); - - if (! sc->portres) { - device_printf(dev, "Failed to allocate I/O ports\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - sc->lnc_btag = rman_get_bustag(sc->portres); - sc->lnc_bhandle = rman_get_bushandle(sc->portres); - - /* - * There isn't any way to determine if a NIC is a BICC. Basically, if - * the lance probe succeeds using the i/o addresses of the BICC then - * we assume it's a BICC. - * - */ - sc->rap = BICC_RAP; - sc->rdp = BICC_RDP; - sc->nic.mem_mode = DMA_FIXED; - /* XXX Should set BICC_IOSIZE et al somewhere to alloc - resources correctly */ - - if ((sc->nic.ic = lance_probe(sc))) { - device_set_desc(dev, "BICC Isolan"); - sc->nic.ident = BICC; - lnc_release_resources(dev); - return (0); - } else { - /* It's not a BICC so try the standard NE2100 ports */ - sc->rap = PCNET_RAP; - sc->rdp = PCNET_RDP; - if ((sc->nic.ic = lance_probe(sc))) { - sc->nic.ident = NE2100; - device_set_desc(dev, "NE2100"); - lnc_release_resources(dev); - return (0); - } else { - lnc_release_resources(dev); - return (ENXIO); - } - } -} - -static int -lnc_isa_probe(device_t dev) -{ - int pnp; - - pnp = ISA_PNP_PROBE(device_get_parent(dev), dev, lnc_pnp_ids); - if (pnp == ENOENT) { - /* It's not a PNP card, see if we support it by probing it */ - return (lnc_legacy_probe(dev)); - } else if (pnp == ENXIO) { - return (ENXIO); - } else { - /* Found PNP card we support */ - return (0); - } -} - -static void -lnc_alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error) -{ - /* Do nothing */ - return; -} - -static int -lnc_isa_attach(device_t dev) -{ - lnc_softc_t *sc = device_get_softc(dev); - int err = 0; - bus_size_t lnc_mem_size; - - device_printf(dev, "Attaching %s\n", device_get_desc(dev)); - - sc->portrid = 0; - sc->portres = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->portrid, - RF_ACTIVE); - - if (! sc->portres) { - device_printf(dev, "Failed to allocate I/O ports\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - sc->drqrid = 0; - sc->drqres = bus_alloc_resource_any(dev, SYS_RES_DRQ, &sc->drqrid, - RF_ACTIVE); - - if (! sc->drqres) { - device_printf(dev, "Failed to allocate DMA channel\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - if (isa_get_irq(dev) == -1) - bus_set_resource(dev, SYS_RES_IRQ, 0, 10, 1); - - sc->irqrid = 0; - sc->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqrid, - RF_ACTIVE); - - if (! sc->irqres) { - device_printf(dev, "Failed to allocate irq\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - err = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, lncintr, - sc, &sc->intrhand); - - if (err) { - device_printf(dev, "Failed to setup irq handler\n"); - lnc_release_resources(dev); - return (err); - } - - /* XXX temp setting for nic */ - sc->nic.mem_mode = DMA_FIXED; - sc->nrdre = NRDRE; - sc->ntdre = NTDRE; - - if (sc->nic.ident == NE2100) { - sc->rap = PCNET_RAP; - sc->rdp = PCNET_RDP; - sc->bdp = PCNET_BDP; - } else { - sc->rap = BICC_RAP; - sc->rdp = BICC_RDP; - } - - /* Create a DMA tag describing the ring memory we need */ - - lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) * - sizeof(struct host_ring_entry)); - - lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) + - (NDESC(sc->ntdre) * TRANSBUFSIZE); - - err = bus_dma_tag_create(NULL, /* parent */ - 4, /* alignement */ - 0, /* boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - lnc_mem_size, /* segsize */ - 1, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - busdma_lock_mutex, /* lockfunc */ - &Giant, /* lockarg */ - &sc->dmat); - - if (err) { - device_printf(dev, "Can't create DMA tag\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - err = bus_dmamem_alloc(sc->dmat, (void **)&sc->recv_ring, - BUS_DMA_NOWAIT, &sc->dmamap); - - if (err) { - device_printf(dev, "Couldn't allocate memory\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - err = bus_dmamap_load(sc->dmat, sc->dmamap, sc->recv_ring, lnc_mem_size, - lnc_alloc_callback, sc->recv_ring, BUS_DMA_NOWAIT); - - if (err) { - device_printf(dev, "Couldn't load DMA map\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - isa_dmacascade(rman_get_start(sc->drqres)); - - /* Call generic attach code */ - if (! lnc_attach_common(dev)) { - device_printf(dev, "Generic attach code failed\n"); - lnc_release_resources(dev); - return (ENXIO); - } - return (0); -} - -static device_method_t lnc_isa_methods[] = { -/* DEVMETHOD(device_identify, lnc_isa_identify), */ - DEVMETHOD(device_probe, lnc_isa_probe), - DEVMETHOD(device_attach, lnc_isa_attach), - DEVMETHOD(device_detach, lnc_detach_common), -#ifdef notyet - DEVMETHOD(device_suspend, lnc_isa_suspend), - DEVMETHOD(device_resume, lnc_isa_resume), - DEVMETHOD(device_shutdown, lnc_isa_shutdown), -#endif - { 0, 0 } -}; - -static driver_t lnc_isa_driver = { - "lnc", - lnc_isa_methods, - sizeof(struct lnc_softc), -}; - -DRIVER_MODULE(lnc, isa, lnc_isa_driver, lnc_devclass, 0, 0); -MODULE_DEPEND(lnc, isa, 1, 1, 1); -MODULE_DEPEND(lnc, ether, 1, 1, 1); diff --git a/sys/dev/lnc/if_lnc_pci.c b/sys/dev/lnc/if_lnc_pci.c deleted file mode 100644 index f221d28..0000000 --- a/sys/dev/lnc/if_lnc_pci.c +++ /dev/null @@ -1,213 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/socket.h> -#include <sys/malloc.h> -#include <sys/kernel.h> -#include <sys/module.h> - -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/bus.h> -#include <sys/rman.h> - -#include <net/ethernet.h> -#include <net/if.h> -#include <net/if_arp.h> - -#include <dev/pci/pcireg.h> -#include <dev/pci/pcivar.h> - -#include <dev/lnc/if_lncreg.h> -#include <dev/lnc/if_lncvar.h> - -#define AMD_VENDOR_ID 0x1022 -#define PCI_DEVICE_ID_PCNet_PCI 0x2000 -#define PCI_DEVICE_ID_PCHome_PCI 0x2001 - -static int -lnc_pci_probe(device_t dev) -{ - if (pci_get_vendor(dev) != AMD_VENDOR_ID) - return (ENXIO); - - switch(pci_get_device(dev)) { - case PCI_DEVICE_ID_PCNet_PCI: - device_set_desc(dev, "PCNet/PCI Ethernet adapter"); - return(BUS_PROBE_DEFAULT); - break; - case PCI_DEVICE_ID_PCHome_PCI: - device_set_desc(dev, "PCHome/PCI Ethernet adapter"); - return(BUS_PROBE_DEFAULT); - break; - default: - return (ENXIO); - break; - } - return (ENXIO); -} - -static void -lnc_alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error) -{ - /* Do nothing */ - return; -} - -static int -lnc_pci_attach(device_t dev) -{ - lnc_softc_t *sc = device_get_softc(dev); - unsigned command; - int err = 0; - bus_size_t lnc_mem_size; - - device_printf(dev, "Attaching %s\n", device_get_desc(dev)); - - command = pci_read_config(dev, PCIR_COMMAND, 4); - command |= PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN; - pci_write_config(dev, PCIR_COMMAND, command, 4); - - sc->portrid = PCIR_BAR(0); - sc->portres = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->portrid, - RF_ACTIVE); - - if (! sc->portres) { - device_printf(dev, "Cannot allocate I/O ports\n"); - lnc_release_resources(dev); - return (ENXIO); - } - - sc->irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irqrid, - RF_ACTIVE|RF_SHAREABLE); - - if (! sc->irqres) { - device_printf(dev, "Cannot allocate irq\n"); - lnc_release_resources(dev); - return (ENXIO); - } - err = bus_setup_intr(dev, sc->irqres, INTR_TYPE_NET, lncintr, - sc, &sc->intrhand); - if (err) { - device_printf(dev, "Cannot setup irq handler\n"); - lnc_release_resources(dev); - return (ENXIO); - } - sc->lnc_btag = rman_get_bustag(sc->portres); - sc->lnc_bhandle = rman_get_bushandle(sc->portres); - - /* XXX temp setting for nic */ - sc->nic.ic = PCnet_PCI; - sc->nic.ident = NE2100; - sc->nic.mem_mode = DMA_FIXED; - sc->nrdre = NRDRE; - sc->ntdre = NTDRE; - sc->rap = PCNET_RAP; - sc->rdp = PCNET_RDP; - sc->bdp = PCNET_BDP; - - /* Create a DMA tag describing the ring memory we need */ - - lnc_mem_size = ((NDESC(sc->nrdre) + NDESC(sc->ntdre)) * - sizeof(struct host_ring_entry)); - - lnc_mem_size += sizeof(struct init_block) + (sizeof(struct mds) * - (NDESC(sc->nrdre) + NDESC(sc->ntdre))) + MEM_SLEW; - - lnc_mem_size += (NDESC(sc->nrdre) * RECVBUFSIZE) + - (NDESC(sc->ntdre) * TRANSBUFSIZE); - - err = bus_dma_tag_create(NULL, /* parent */ - 1, /* alignement */ - 0, /* boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - lnc_mem_size, /* segsize */ - 1, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - busdma_lock_mutex, /* lockfunc */ - &Giant, /* lockarg */ - &sc->dmat); - - if (err) { - device_printf(dev, "Can't create DMA tag\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - err = bus_dmamem_alloc(sc->dmat, (void **)&sc->recv_ring, - BUS_DMA_NOWAIT, &sc->dmamap); - - if (err) { - device_printf(dev, "Couldn't allocate memory\n"); - lnc_release_resources(dev); - return (ENOMEM); - } - - bus_dmamap_load(sc->dmat, sc->dmamap, sc->recv_ring, lnc_mem_size, - lnc_alloc_callback, sc->recv_ring, BUS_DMA_NOWAIT); - - /* Call generic attach code */ - if (! lnc_attach_common(dev)) { - device_printf(dev, "Generic attach code failed\n"); - lnc_release_resources(dev); - return (ENXIO); - } - return (0); -} - -static device_method_t lnc_pci_methods[] = { - DEVMETHOD(device_probe, lnc_pci_probe), - DEVMETHOD(device_attach, lnc_pci_attach), - DEVMETHOD(device_detach, lnc_detach_common), -#ifdef notyet - DEVMETHOD(device_suspend, lnc_pci_suspend), - DEVMETHOD(device_resume, lnc_pci_resume), - DEVMETHOD(device_shutdown, lnc_pci_shutdown), -#endif - { 0, 0 } -}; - -static driver_t lnc_pci_driver = { - "lnc", - lnc_pci_methods, - sizeof(struct lnc_softc), -}; - -DRIVER_MODULE(lnc, pci, lnc_pci_driver, lnc_devclass, 0, 0); -MODULE_DEPEND(lnc, pci, 1, 1, 1); -MODULE_DEPEND(lnc, ether, 1, 1, 1); diff --git a/sys/dev/lnc/if_lncreg.h b/sys/dev/lnc/if_lncreg.h deleted file mode 100644 index 86e1d8b..0000000 --- a/sys/dev/lnc/if_lncreg.h +++ /dev/null @@ -1,209 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * Am7990, Local Area Network Controller for Ethernet (LANCE) - * - * The LANCE has four Control and Status Registers(CSRs) which are accessed - * through two bus addressable ports, the address port (RAP) and the data - * port (RDP). - * - */ - -#define CSR0 0 -#define CSR1 1 -#define CSR2 2 -#define CSR3 3 -#define CSR88 88 -#define CSR89 89 - -#define BCR49 49 -#define BCR32 32 -#define BCR33 33 -#define BCR34 34 - - -/* Control and Status Register Masks */ - -/* CSR0 */ - -#define ERR 0x8000 -#define BABL 0x4000 -#define CERR 0x2000 -#define MISS 0x1000 -#define MERR 0x0800 -#define RINT 0x0400 -#define TINT 0x0200 -#define IDON 0x0100 -#define INTR 0x0080 -#define INEA 0x0040 -#define RXON 0x0020 -#define TXON 0x0010 -#define TDMD 0x0008 -#define STOP 0x0004 -#define STRT 0x0002 -#define INIT 0x0001 - -/* - * CSR3 - * - * Bits 3-15 are reserved. - * - */ - -#define BSWP 0x0004 -#define ACON 0x0002 -#define BCON 0x0001 - -/* ISA Bus Configuration Registers */ -#define MSRDA 0x0000 /* ISACSR0: Master Mode Read Activity */ -#define MSWRA 0x0001 /* ISACSR1: Master Mode Write Activity */ -#define MC 0x0002 /* ISACSR2: Miscellaneous Configuration */ - -#define LED1 0x0005 /* ISACSR5: LED1 Status */ -#define LED2 0x0006 /* ISACSR6: LED2 Status */ -#define LED3 0x0007 /* ISACSR7: LED3 Status */ - -#define LED_PSE 0x0080 /* Pulse Stretcher */ -#define LED_XMTE 0x0010 /* Transmit Status */ -#define LED_RVPOLE 0x0008 /* Receive Polarity */ -#define LED_RCVE 0x0004 /* Receive Status */ -#define LED_JABE 0x0002 /* Jabber */ -#define LED_COLE 0x0001 /* Collision */ - -/* Initialisation block */ - -struct init_block { - u_short mode; /* Mode register */ - u_char padr[6]; /* Ethernet address */ - u_char ladrf[8]; /* Logical address filter (multicast) */ - u_short rdra; /* Low order pointer to receive ring */ - u_short rlen; /* High order pointer and no. rings */ - u_short tdra; /* Low order pointer to transmit ring */ - u_short tlen; /* High order pointer and no rings */ -}; - -/* Initialisation Block Mode Register Masks */ - -#define PROM 0x8000 /* Promiscuous Mode */ -#define DRCVBC 0x4000 /* Disable Receive Broadcast */ -#define DRCVPA 0x2000 /* Disable Receive Physical Address */ -#define DLNKTST 0x1000 /* Disable Link Status */ -#define DAPC 0x0800 /* Disable Automatic Polarity Correction */ -#define MENDECL 0x0400 /* MENDEC Loopback Mode */ -#define LRT 0x0200 /* Low Receive Threshold (T-MAU mode only) */ -#define TSEL 0x0200 /* Transmit Mode Select (AUI mode only) */ -#define PORTSEL 0x0180 /* Port Select bits */ -#define INTL 0x0040 /* Internal Loopback */ -#define DRTY 0x0020 /* Disable Retry */ -#define FCOLL 0x0010 /* Force Collision */ -#define DXMTFCS 0x0008 /* Disable transmit CRC (FCS) */ -#define LOOP 0x0004 /* Loopback Enabl */ -#define DTX 0x0002 /* Disable the transmitter */ -#define DRX 0x0001 /* Disable the receiver */ - -/* - * Message Descriptor Structure - * - * Each transmit or receive descriptor ring entry (RDRE's and TDRE's) - * is composed of 4, 16-bit, message descriptors. They contain the following - * information. - * - * 1. The address of the actual message data buffer in user (host) memory. - * 2. The length of that message buffer. - * 3. The status information for that particular buffer. The eight most - * significant bits of md1 are collectively termed the STATUS of the - * descriptor. - * - * Descriptor md0 contains LADR 0-15, the low order 16 bits of the 24-bit - * address of the actual data buffer. Bits 0-7 of descriptor md1 contain - * HADR, the high order 8-bits of the 24-bit data buffer address. Bits 8-15 - * of md1 contain the status flags of the buffer. Descriptor md2 contains the - * buffer byte count in bits 0-11 as a two's complement number and must have - * 1's written to bits 12-15. For the receive entry md3 has the Message Byte - * Count in bits 0-11, this is the length of the received message and is valid - * only when ERR is cleared and ENP is set. For the transmit entry it contains - * more status information. - * - */ - -struct mds { - u_short md0; - u_short md1; - short md2; - u_short md3; -}; - -/* Receive STATUS flags for md1 */ - -#define OWN 0x8000 /* Owner bit, 0=host, 1=Lance */ -#define MDERR 0x4000 /* Error */ -#define FRAM 0x2000 /* Framing error error */ -#define OFLO 0x1000 /* Silo overflow */ -#define CRC 0x0800 /* CRC error */ -#define RBUFF 0x0400 /* Buffer error */ -#define STP 0x0200 /* Start of packet */ -#define ENP 0x0100 /* End of packet */ -#define HADR 0x00FF /* High order address bits */ - -/* Receive STATUS flags for md2 */ - -#define BCNT 0x0FFF /* Size of data buffer as 2's comp. no. */ - -/* Receive STATUS flags for md3 */ - -#define MCNT 0x0FFF /* Total size of data for received packet */ - -/* Transmit STATUS flags for md1 */ - -#define ADD_FCS 0x2000 /* Controls generation of FCS */ -#define MORE 0x1000 /* Indicates more than one retry was needed */ -#define ONE 0x0800 /* Exactly one retry was needed */ -#define DEF 0x0400 /* Packet transmit deferred -- channel busy */ - -/* - * Transmit status flags for md2 - * - * Same as for receive descriptor. - * - * BCNT 0x0FFF Size of data buffer as 2's complement number. - * - */ - -/* Transmit status flags for md3 */ - -#define TBUFF 0x8000 /* Buffer error */ -#define UFLO 0x4000 /* Silo underflow */ -#define LCOL 0x1000 /* Late collision */ -#define LCAR 0x0800 /* Loss of carrier */ -#define RTRY 0x0400 /* Tried 16 times */ -#define TDR 0x03FF /* Time domain reflectometry */ diff --git a/sys/dev/lnc/if_lncvar.h b/sys/dev/lnc/if_lncvar.h deleted file mode 100644 index a34d83e..0000000 --- a/sys/dev/lnc/if_lncvar.h +++ /dev/null @@ -1,266 +0,0 @@ -/*- - * Copyright (c) 1994-1998 - * Paul Richards. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Paul Richards. - * 4. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * Initialize multicast address hashing registers to accept - * all multicasts (only used when in promiscuous mode) - */ -#define MULTI_INIT_ADDR 0xff - -#define NORMAL 0 - -#define NRDRE 3 -#define NTDRE 3 -#define RECVBUFSIZE 1518 /* Packet size rounded to dword boundary */ -#define TRANSBUFSIZE 1518 -#define MBUF_CACHE_LIMIT 0 - -#define MEM_SLEW 8 - -/* LNC Flags */ -#define LNC_INITIALISED 1 -#define LNC_ALLMULTI 2 - -/* BICC port addresses */ -#define BICC_IOSIZE 16 -#define BICC_RDP 0x0c /* Register Data Port */ -#define BICC_RAP 0x0e /* Register Address Port */ - -/* NE2100 port addresses */ -#define NE2100_IOSIZE 24 -#define PCNET_RDP 0x10 /* Register Data Port */ -#define PCNET_RAP 0x12 /* Register Address Port */ -#define PCNET_RESET 0x14 -#define PCNET_BDP 0x16 -#define PCNET_VSW 0x18 - -/* DEPCA port addresses */ -#define DEPCA_IOSIZE 16 -#define DEPCA_CTRL 0x00 /* NIC Control and status register */ -#define DEPCA_RDP 0x04 /* Register Data Port */ -#define DEPCA_RAP 0x06 /* Register Address Port */ -#define DEPCA_ADP 0x0c - -/* DEPCA specific defines */ -#define DEPCA_ADDR_ROM_SIZE 32 - -/* C-NET(98)S port addresses */ -/* Notice, we can ignore fragmantation by using isa_alloc_resourcev(). */ -#define CNET98S_IOSIZE 32 -#define CNET98S_RDP 0x10 /* Register Data Port */ -#define CNET98S_RAP 0x12 /* Register Address Port */ -#define CNET98S_RESET 0x14 -#define CNET98S_IDP 0x16 -#define CNET98S_EEPROM 0x1e - -/* Chip types */ -#define LANCE 1 /* Am7990 */ -#define C_LANCE 2 /* Am79C90 */ -#define PCnet_ISA 3 /* Am79C960 */ -#define PCnet_ISAplus 4 /* Am79C961 */ -#define PCnet_ISA_II 5 /* Am79C961A */ -#define PCnet_32 6 /* Am79C965 */ -#define PCnet_PCI 7 /* Am79C970 */ -#define PCnet_PCI_II 8 /* Am79C970A */ -#define PCnet_FAST 9 /* Am79C971 */ -#define PCnet_FASTplus 10 /* Am79C972 */ -#define PCnet_Home 11 /* Am79C978 */ - - -/* CSR88-89: Chip ID masks */ -#define AMD_MASK 0x003 -#define PART_MASK 0xffff -#define Am79C960 0x0003 -#define Am79C961 0x2260 -#define Am79C961A 0x2261 -#define Am79C965 0x2430 -#define Am79C970 0x0242 -#define Am79C970A 0x2621 -#define Am79C971 0x2623 -#define Am79C972 0x2624 -#define Am79C973 0x2625 -#define Am79C978 0x2626 - -/* Board types */ -#define UNKNOWN 0 -#define BICC 1 -#define NE2100 2 -#define DEPCA 3 -#define CNET98S 4 /* PC-98 */ - -/* mem_mode values */ -#define DMA_FIXED 1 -#define DMA_MBUF 2 -#define SHMEM 4 - -#define MEM_MODES \ - "\20\3SHMEM\2DMA_MBUF\1DMA_FIXED" - -#define CSR0_FLAGS \ - "\20\20ERR\17BABL\16CERR\15MISS\14MERR\13RINT\12TINT\11IDON\ - \10INTR\07INEA\06RXON\05TXON\04TDMD\03STOP\02STRT\01INIT" - -#define INIT_MODE \ - "\20\20PROM\07INTL\06DRTY\05COLL\04DTCR\03LOOP\02DTX\01DRX" - -#define RECV_MD1 \ - "\20\10OWN\7ERR\6FRAM\5OFLO\4CRC\3BUFF\2STP\1ENP" - -#define TRANS_MD1 \ - "\20\10OWN\7ERR\6RES\5MORE\4ONE\3DEF\2STP\1ENP" - -#define TRANS_MD3 \ - "\20\6BUFF\5UFLO\4RES\3LCOL\2LCAR\1RTRY" - -#ifdef LNC_KEEP_STATS -#define LNCSTATS_STRUCT \ - struct lnc_stats { \ - int idon; \ - int rint; \ - int tint; \ - int cerr; \ - int babl; \ - int miss; \ - int merr; \ - int rxoff; \ - int txoff; \ - int terr; \ - int lcol; \ - int lcar; \ - int tbuff; \ - int def; \ - int more; \ - int one; \ - int uflo; \ - int rtry; \ - int rerr; \ - int fram; \ - int oflo; \ - int crc; \ - int rbuff; \ - int drop_packet; \ - int trans_ring_full; \ - } lnc_stats; -#define LNCSTATS(X) ++(sc->lnc_stats.X); -#else -#define LNCSTATS_STRUCT -#define LNCSTATS(X) -#endif - -struct nic_info { - int ident; /* Type of card */ - int ic; /* Type of ic, Am7990, Am79C960 etc. */ - int mem_mode; - int iobase; - int mode; /* Mode setting at initialization */ -}; - -typedef struct lnc_softc { - struct resource *irqres; - int irqrid; - struct resource *drqres; - int drqrid; - struct resource *portres; - int portrid; - bus_space_tag_t lnc_btag; - bus_space_handle_t lnc_bhandle; - void *intrhand; - bus_dma_tag_t dmat; - bus_dmamap_t dmamap; - struct ifnet *ifp; - struct nic_info nic; /* NIC specific info */ - int nrdre; - struct host_ring_entry *recv_ring; /* start of alloc'd mem */ - int recv_next; - int ntdre; - struct host_ring_entry *trans_ring; - int trans_next; - struct init_block *init_block; /* Initialisation block */ - int pending_transmits; /* No. of transmit descriptors in - use */ - int next_to_send; - struct mbuf *mbufs; - int mbuf_count; - int flags; - int rap; - int rdp; - int bdp; - #ifdef DEBUG - int lnc_debug; - #endif - LNCSTATS_STRUCT -} lnc_softc_t; - -struct host_ring_entry { - struct mds *md; - union { - struct mbuf *mbuf; - char *data; - }buff; -}; - -#define NDESC(len2) (1 << len2) - -#define INC_MD_PTR(ptr, no_entries) \ - if (++ptr >= NDESC(no_entries)) \ - ptr = 0; - -#define DEC_MD_PTR(ptr, no_entries) \ - if (--ptr < 0) \ - ptr = NDESC(no_entries) - 1; - -#define RECV_NEXT (sc->recv_ring->base + sc->recv_next) -#define TRANS_NEXT (sc->trans_ring->base + sc->trans_next) - -#define lnc_inb(port) \ - bus_space_read_1(sc->lnc_btag, sc->lnc_bhandle, (port)) -#define lnc_inw(port) \ - bus_space_read_2(sc->lnc_btag, sc->lnc_bhandle, (port)) -#define lnc_outw(port, val) \ - bus_space_write_2(sc->lnc_btag, sc->lnc_bhandle, (port), (val)) - -/* Functional declarations */ -extern int lance_probe(struct lnc_softc *); -extern void lnc_release_resources(device_t); -extern int lnc_attach_common(device_t); -extern int lnc_detach_common(device_t); -extern void lnc_stop(struct lnc_softc *); - -extern void write_csr(struct lnc_softc *, u_short, u_short); -extern u_short read_csr(struct lnc_softc *, u_short); - -/* Variable declarations */ -extern driver_intr_t lncintr; -extern devclass_t lnc_devclass; |