diff options
-rw-r--r-- | sys/dev/lmc/if_lmc.c | 2503 | ||||
-rw-r--r-- | sys/dev/lmc/if_lmc.h | 288 |
2 files changed, 21 insertions, 2770 deletions
diff --git a/sys/dev/lmc/if_lmc.c b/sys/dev/lmc/if_lmc.c index f7cdac5..ac255fe 100644 --- a/sys/dev/lmc/if_lmc.c +++ b/sys/dev/lmc/if_lmc.c @@ -71,7 +71,6 @@ * * Send bug reports and improvements to <boggs@boggs.palo-alto.ca.us>. */ -#ifdef __FreeBSD__ # include <sys/param.h> /* OS version */ # define IFNET 1 # include "opt_inet.h" /* INET */ @@ -90,15 +89,9 @@ # define NETGRAPH 0 # endif # define P2P 0 /* not in FreeBSD */ -# if (__FreeBSD_version >= 500000) -# define NSPPP 1 /* No count devices in FreeBSD 5 */ -# include "opt_bpf.h" /* DEV_BPF */ -# define NBPFILTER DEV_BPF -# else /* FreeBSD-4 */ -# include "sppp.h" /* NSPPP */ -# include "bpf.h" /* NBPF */ -# define NBPFILTER NBPF -# endif +# define NSPPP 1 /* No count devices in FreeBSD 5 */ +# include "opt_bpf.h" /* DEV_BPF */ +# define NBPFILTER DEV_BPF # define GEN_HDLC 0 /* not in FreeBSD */ # # include <sys/systm.h> @@ -121,16 +114,9 @@ # include <sys/rman.h> # include <vm/vm.h> # include <vm/pmap.h> -# if (__FreeBSD_version >= 700000) -# include <sys/priv.h> -# endif -# if (__FreeBSD_version >= 500000) +# include <sys/priv.h> # include <sys/mutex.h> # include <dev/pci/pcivar.h> -# else /* FreeBSD-4 */ -# include <sys/proc.h> -# include <pci/pcivar.h> -# endif # if NETGRAPH # include <netgraph/ng_message.h> # include <netgraph/netgraph.h> @@ -147,180 +133,10 @@ # endif /* and finally... */ # include <dev/lmc/if_lmc.h> -#endif /*__FreeBSD__*/ -#ifdef __NetBSD__ -# include <sys/param.h> /* OS version */ -# define IFNET 1 -# include "opt_inet.h" /* INET6, INET */ -# define NETGRAPH 0 /* not in NetBSD */ -# include "sppp.h" /* NSPPP */ -# define P2P 0 /* not in NetBSD */ -# include "opt_altq_enabled.h" /* ALTQ */ -# include "bpfilter.h" /* NBPFILTER */ -# define GEN_HDLC 0 /* not in NetBSD */ -# -# include <sys/systm.h> -# include <sys/kernel.h> -# include <sys/lkm.h> -# include <sys/mbuf.h> -# include <sys/socket.h> -# include <sys/sockio.h> -# include <sys/device.h> -# include <sys/lock.h> -# include <net/if.h> -# include <net/if_var.h> -# include <net/if_types.h> -# include <net/if_media.h> -# include <net/netisr.h> -# include <machine/bus.h> -# include <machine/intr.h> -# include <dev/pci/pcivar.h> -# if (__NetBSD_Version__ >= 106000000) -# include <uvm/uvm_extern.h> -# else -# include <vm/vm.h> -# endif -# if (INET || INET6) -# include <netinet/in.h> -# include <netinet/in_var.h> -# endif -# if NSPPP -# if (__NetBSD_Version__ >= 106000000) -# include <net/if_spppvar.h> -# else -# include <net/if_sppp.h> -# endif -# endif -# if NBPFILTER -# include <net/bpf.h> -# endif -/* and finally... */ -# include "if_lmc.h" -#endif /*__NetBSD__*/ -#ifdef __OpenBSD__ -# include <sys/param.h> /* OS version */ -# define IFNET 1 -/* -DINET is passed on the compiler command line */ -/* -DINET6 is passed on the compiler command line */ -# define NETGRAPH 0 /* not in OpenBSD */ -# include "sppp.h" /* NSPPP */ -# define P2P 0 /* not in OpenBSD */ -/* -DALTQ is passed on the compiler command line */ -# include "bpfilter.h" /* NBPFILTER */ -# define GEN_HDLC 0 /* not in OpenBSD */ -# -# include <sys/systm.h> -# include <sys/kernel.h> -# include <sys/conf.h> -# include <sys/exec.h> -# include <sys/lkm.h> -# include <sys/mbuf.h> -# include <sys/socket.h> -# include <sys/sockio.h> -# include <sys/device.h> -# include <sys/lock.h> -# include <net/if.h> -# include <net/if_types.h> -# include <net/if_media.h> -# include <net/netisr.h> -# include <machine/bus.h> -# include <machine/intr.h> -# include <dev/pci/pcivar.h> -# if (OpenBSD >= 200206) -# include <uvm/uvm_extern.h> -# else -# include <vm/vm.h> -# endif -# if (INET || INET6) -# include <netinet/in.h> -# include <netinet/in_var.h> -# endif -# if NSPPP -# include <net/if_sppp.h> -# endif -# if NBPFILTER -# include <net/bpf.h> -# endif -/* and finally... */ -# include "if_lmc.h" -#endif /*__OpenBSD__*/ -#ifdef __bsdi__ -# include <sys/param.h> /* OS version */ -# define IFNET 1 -/* -DINET is passed on the compiler command line */ -/* -DINET6 is passed on the compiler command line */ -# define NETGRAPH 0 /* not in BSD/OS */ -# define NSPPP 0 /* not in BSD/OS */ -/* -DPPP is passed on the compiler command line */ -/* -DCISCO_HDLC is passed on the compiler command line */ -/* -DFR is passed on the compiler command line */ -# if (PPP || CISCO_HDLC || FR) -# define P2P 1 -# else -# define P2P 0 -# endif -# define ALTQ 0 /* not in BSD/OS */ -# include "bpfilter.h" /* NBPFILTER */ -# define GEN_HDLC 0 /* not in BSD/OS */ -# -# include <sys/kernel.h> -# include <sys/malloc.h> -# include <sys/mbuf.h> -# include <sys/socket.h> -# include <sys/sockio.h> -# include <sys/device.h> -# include <sys/lock.h> -# include <net/if.h> -# include <net/if_types.h> -# include <net/if_media.h> -# include <net/netisr.h> -# include <vm/vm.h> -# include <i386/isa/dma.h> -# include <i386/isa/isavar.h> -# include <i386/include/cpu.h> -# include <i386/pci/pci.h> -# if (INET || INET6) -# include <netinet/in.h> -# include <netinet/in_var.h> -# endif -# if P2P -# include <net/if_p2p.h> -# include <sys/ttycom.h> -# endif -# if NBPFILTER -# include <net/bpf.h> -# endif -/* and finally... */ -# include "if_lmc.h" -#endif /*__bsdi__*/ -#ifdef __linux__ -# include <linux/config.h> -# if (CONFIG_HDLC || CONFIG_HDLC_MODULE) -# define GEN_HDLC 1 -# else -# define GEN_HDLC 0 -# endif -# define IFNET 0 /* different in Linux */ -# define NETGRAPH 0 /* not in Linux */ -# define NSPPP 0 /* different in Linux */ -# define P2P 0 /* not in Linux */ -# define ALTQ 0 /* different in Linux */ -# define NBPFILTER 0 /* different in Linux */ -# -# include <linux/pci.h> -# include <linux/delay.h> -# include <linux/netdevice.h> -# include <linux/if_arp.h> -# if GEN_HDLC -# include <linux/hdlc.h> -# endif -/* and finally... */ -# include "if_lmc.h" -#endif /* __linux__ */ /* The SROM is a generic 93C46 serial EEPROM (64 words by 16 bits). */ /* Data is set up before the RISING edge of CLK; CLK is parked low. */ @@ -2484,44 +2300,6 @@ struct card t1_card = /* RAWIP is raw IP packets (v4 or v6) in HDLC frames with NO HEADERS. */ /* No HDLC Address/Control fields! No line control protocol at all! */ -/* This code is BSD/ifnet-specific; Linux and Netgraph also do RAWIP. */ - -#if IFNET - -# if ((defined(__FreeBSD__) && (__FreeBSD_version < 500000)) ||\ - defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__)) -static void -netisr_dispatch(int isr, struct mbuf *mbuf) - { - struct ifqueue *intrq = NULL; - int qfull = 0; - -#if INET - if (isr == NETISR_IP) intrq = &ipintrq; -#endif -#if INET6 - if (isr == NETISR_IPV6) intrq = &ip6intrq; -#endif - - if ((intrq != NULL) && ((qfull = IF_QFULL(intrq)) == 0)) - { - /* rxintr_cleanup() ENQUEUES in a hard interrupt. */ - /* networking code DEQUEUES in a soft interrupt. */ - /* Some BSD QUEUE routines are not interrupt-safe. */ - DISABLE_INTR; /* noop in FreeBSD */ - IF_ENQUEUE(intrq, mbuf); - ENABLE_INTR; - schednetisr(isr); /* schedule a soft interrupt */ - } - else - { - m_freem(mbuf); - if ((intrq != NULL) && (qfull != 0)) - IF_DROP(intrq); - } - } -# endif /* ((__FreeBSD__ && (__FreeBSD_version < 500000)) || */ - /* __NetBSD__ || __OpenBSD__ || __bsdi__) */ /* rxintr_cleanup calls this to give a newly arrived pkt to higher levels. */ static void @@ -2549,20 +2327,12 @@ lmc_raw_input(struct ifnet *ifp, struct mbuf *mbuf) } } -#endif /* IFNET */ - -/* There are TWO VERSIONS of interrupt/DMA code: Linux & BSD. - * Handling Linux and the BSDs with CPP directives would - * make the code unreadable, so there are two versions. - * Conceptually, the two versions do the same thing and - * core_interrupt() doesn't know they are different. - * +/* * We are "standing on the head of a pin" in these routines. * Tulip CSRs can be accessed, but nothing else is interrupt-safe! * Do NOT access: MII, GPIO, SROM, BIOSROM, XILINX, SYNTH, or DAC. */ -#if BSD /* BSD version of interrupt/DMA code */ /* Singly-linked tail-queues hold mbufs with active DMA. * For RX, single mbuf clusters; for TX, mbuf chains are queued. @@ -2593,7 +2363,6 @@ mbuf_dequeue(struct desc_ring *ring) return m; } -# ifdef __FreeBSD__ static void /* *** FreeBSD ONLY *** Callout from bus_dmamap_load() */ fbsd_dmamap_load(void *arg, bus_dma_segment_t *segs, int nsegs, int error) { @@ -2602,7 +2371,6 @@ fbsd_dmamap_load(void *arg, bus_dma_segment_t *segs, int nsegs, int error) ring->segs[0] = segs[0]; ring->segs[1] = segs[1]; } -# endif /* Initialize a DMA descriptor ring. */ static int /* BSD version */ @@ -2620,15 +2388,12 @@ create_ring(softc_t *sc, struct desc_ring *ring, int num_descs) return EINVAL; } -#ifdef __FreeBSD__ /* Create a DMA tag for descriptors and buffers. */ if ((error = bus_dma_tag_create(bus_get_dma_tag(sc->dev), 4, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, PAGE_SIZE, 2, PAGE_SIZE, BUS_DMA_ALLOCNOW, -# if (__FreeBSD_version >= 502000) NULL, NULL, -# endif &ring->tag))) { printf("%s: bus_dma_tag_create() failed: error %d\n", NAME_UNIT, error); @@ -2662,70 +2427,6 @@ create_ring(softc_t *sc, struct desc_ring *ring, int num_descs) return error; } -#elif (defined(__NetBSD__) || defined(__OpenBSD__)) - - /* Use the DMA tag passed to attach() for descriptors and buffers. */ - ring->tag = sc->pa_dmat; - - /* Allocate wired physical memory for DMA descriptor array. */ - if ((error = bus_dmamem_alloc(ring->tag, size_descs, PAGE_SIZE, 0, - ring->segs, 1, &ring->nsegs, BUS_DMA_NOWAIT))) - { - printf("%s: bus_dmamem_alloc() failed; error %d\n", NAME_UNIT, error); - return error; - } - - /* Map physical address to kernel virtual address. */ - if ((error = bus_dmamem_map(ring->tag, ring->segs, ring->nsegs, - size_descs, (caddr_t *)&ring->first, BUS_DMA_NOWAIT | BUS_DMA_COHERENT))) - { - printf("%s: bus_dmamem_map() failed; error %d\n", NAME_UNIT, error); - return error; - } - descs = ring->first; /* suppress compiler warning about aliasing */ - memset(descs, 0, size_descs); - - /* Allocate dmamap for PCI access to DMA descriptor array. */ - if ((error = bus_dmamap_create(ring->tag, size_descs, 1, - size_descs, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ring->map))) - { - printf("%s: bus_dmamap_create() failed; error %d\n", NAME_UNIT, error); - return error; - } - - /* Map kernel virtual address to PCI address for DMA descriptor array. */ - if ((error = bus_dmamap_load(ring->tag, ring->map, descs, size_descs, - 0, BUS_DMA_NOWAIT))) - { - printf("%s: bus_dmamap_load() failed; error %d\n", NAME_UNIT, error); - return error; - } - ring->dma_addr = ring->map->dm_segs[0].ds_addr; - - /* Allocate dmamaps for each DMA descriptor. */ - for (i=0; i<num_descs; i++) - if ((error = bus_dmamap_create(ring->tag, MAX_DESC_LEN, 2, - MAX_CHUNK_LEN, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &descs[i].map))) - { - printf("%s: bus_dmamap_create() failed; error %d\n", NAME_UNIT, error); - return error; - } - -#elif defined(__bsdi__) - - /* Allocate wired physical memory for DMA descriptor array. */ - if ((ring->first = malloc(size_descs, M_DEVBUF, M_NOWAIT)) == NULL) - { - printf("%s: malloc() failed for DMA descriptor array\n", NAME_UNIT); - return ENOMEM; - } - descs = ring->first; - memset(descs, 0, size_descs); - - /* Map kernel virtual address to PCI address for DMA descriptor array. */ - ring->dma_addr = vtophys(descs); /* Relax! BSD/OS only. */ - -#endif ring->read = descs; ring->write = descs; @@ -2765,7 +2466,6 @@ destroy_ring(softc_t *sc, struct desc_ring *ring) if (ring->read++ == ring->last) ring->read = ring->first; } -#ifdef __FreeBSD__ /* Free the dmamaps of all DMA descriptors. */ for (desc=ring->first; desc!=ring->last+1; desc++) @@ -2782,33 +2482,6 @@ destroy_ring(softc_t *sc, struct desc_ring *ring) if (ring->tag != NULL) bus_dma_tag_destroy(ring->tag); -#elif (defined(__NetBSD__) || defined(__OpenBSD__)) - - /* Free the dmamaps of all DMA descriptors. */ - for (desc=ring->first; desc!=ring->last+1; desc++) - if (desc->map != NULL) - bus_dmamap_destroy(ring->tag, desc->map); - - /* Unmap PCI address for DMA descriptor array. */ - if (ring->dma_addr != 0) - bus_dmamap_unload(ring->tag, ring->map); - /* Free dmamap for DMA descriptor array. */ - if (ring->map != NULL) - bus_dmamap_destroy(ring->tag, ring->map); - /* Unmap kernel address for DMA descriptor array. */ - if (ring->first != NULL) - bus_dmamem_unmap(ring->tag, (caddr_t)ring->first, ring->size_descs); - /* Free kernel memory for DMA descriptor array. */ - if (ring->segs[0].ds_addr != 0) - bus_dmamem_free(ring->tag, ring->segs, ring->nsegs); - -#elif defined(__bsdi__) - - /* Free kernel memory for DMA descriptor array. */ - if (ring->first != NULL) - free(ring->first, M_DEVBUF); - -#endif } /* Clean up after a packet has been received. */ @@ -2821,7 +2494,7 @@ rxintr_cleanup(softc_t *sc) struct mbuf *new_mbuf; int pkt_len, desc_len; -#if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +#if defined(DEVICE_POLLING) /* Input packet flow control (livelock prevention): */ /* Give pkts to higher levels only if quota is > 0. */ if (sc->quota <= 0) return 0; @@ -2890,11 +2563,7 @@ rxintr_cleanup(softc_t *sc) { first_mbuf = new_mbuf; first_mbuf->m_pkthdr.len = pkt_len; /* total pkt length */ -#if IFNET first_mbuf->m_pkthdr.rcvif = sc->ifp; /* how it got here */ -#else - first_mbuf->m_pkthdr.rcvif = NULL; -#endif } else /* 2) link mbufs. */ { @@ -2933,11 +2602,9 @@ rxintr_cleanup(softc_t *sc) /* Include CRC and one flag byte in input byte count. */ sc->status.cntrs.ibytes += first_mbuf->m_pkthdr.len + sc->config.crc_len +1; sc->status.cntrs.ipackets++; -#if IFNET sc->ifp->if_ipackets++; LMC_BPF_MTAP(first_mbuf); -#endif -#if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +#if defined(DEVICE_POLLING) sc->quota--; #endif @@ -2945,12 +2612,8 @@ rxintr_cleanup(softc_t *sc) #if NETGRAPH if (sc->ng_hook != NULL) /* is hook connected? */ { -# if (__FreeBSD_version >= 500000) int error; /* ignore error */ NG_SEND_DATA_ONLY(error, sc->ng_hook, first_mbuf); -# else /* FreeBSD-4 */ - ng_queue_data(sc->ng_hook, first_mbuf, NULL); -# endif return 1; /* did something */ } #endif /* NETGRAPH */ @@ -3053,13 +2716,7 @@ rxintr_setup(softc_t *sc) DMA_SYNC(desc->map, desc_len, BUS_DMASYNC_PREREAD); /* Set up the DMA descriptor. */ -#ifdef __FreeBSD__ desc->address1 = ring->segs[0].ds_addr; -#elif (defined(__NetBSD__) || defined(__OpenBSD__)) - desc->address1 = desc->map->dm_segs[0].ds_addr; -#elif defined(__bsdi__) - desc->address1 = vtophys(m->m_data); /* Relax! BSD/OS only. */ -#endif desc->length1 = desc_len>>1; desc->address2 = desc->address1 + desc->length1; desc->length2 = desc_len>>1; @@ -3108,10 +2765,8 @@ txintr_cleanup(softc_t *sc) /* Include CRC and one flag byte in output byte count. */ sc->status.cntrs.obytes += m->m_pkthdr.len + sc->config.crc_len +1; sc->status.cntrs.opackets++; -#if IFNET sc->ifp->if_opackets++; LMC_BPF_MTAP(m); -#endif /* The only bad TX status is fifo underrun. */ if ((desc->status & TLP_DSTS_TX_UNDERRUN) != 0) sc->status.cntrs.fifo_under++; @@ -3181,15 +2836,9 @@ txintr_setup_mbuf(softc_t *sc, struct mbuf *m) /* Prevent wild fetches if mapping fails (nsegs==0). */ desc->length1 = desc->length2 = 0; desc->address1 = desc->address2 = 0; -#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) { -# ifdef __FreeBSD__ bus_dma_segment_t *segs = ring->segs; int nsegs = ring->nsegs; -# elif (defined(__NetBSD__) || defined(__OpenBSD__)) - bus_dma_segment_t *segs = desc->map->dm_segs; - int nsegs = desc->map->dm_nsegs; -# endif if (nsegs >= 1) { desc->address1 = segs[0].ds_addr; @@ -3201,10 +2850,6 @@ txintr_setup_mbuf(softc_t *sc, struct mbuf *m) desc->length2 = segs[1].ds_len; } } -#elif defined(__bsdi__) - desc->address1 = vtophys(data); /* Relax! BSD/OS only. */ - desc->length1 = desc_len; -#endif data += desc_len; length -= desc_len; @@ -3296,523 +2941,7 @@ txintr_setup(softc_t *sc) return 1; /* did something */ } -#endif /* BSD */ - -#ifdef __linux__ -/* NOTE: this is the LINUX version of the interrupt/DMA code, */ - -/* Singly-linked tail-queues hold sk_buffs with active DMA. - * skbuffs are linked through their sk_buff.next field. - * Callers must hold sc->bottom_lock; not otherwise locked. - */ - -/* Put an skbuff on the tail of the descriptor ring queue. */ -static void /* Linux version */ -skbuff_enqueue(struct desc_ring *ring, struct sk_buff *skb) - { - skb->next = NULL; - if (ring->tail == NULL) - ring->head = skb; - else - ring->tail->next = skb; - ring->tail = skb; - } - -/* Get an skbuff from the head of the descriptor ring queue. */ -static struct sk_buff* /* Linux version */ -skbuff_dequeue(struct desc_ring *ring) - { - struct sk_buff *skb = ring->head; - if (skb != NULL) - if ((ring->head = skb->next) == NULL) - ring->tail = NULL; - return skb; - } - -/* Initialize a DMA descriptor ring. */ -static int /* Linux version */ -create_ring(softc_t *sc, struct desc_ring *ring, int num_descs) - { - struct dma_desc *descs; - int size_descs = sizeof(struct dma_desc)*num_descs; - - /* Allocate and map memory for DMA descriptor array. */ - if ((descs = pci_alloc_consistent(sc->pci_dev, size_descs, - &ring->dma_addr)) == NULL) - { - printk("%s: pci_alloc_consistent() failed\n", NAME_UNIT); - return ENOMEM; - } - memset(descs, 0, size_descs); - - ring->read = descs; - ring->write = descs; - ring->first = descs; - ring->last = descs + num_descs -1; - ring->last->control = TLP_DCTL_END_RING; - ring->num_descs = num_descs; - ring->size_descs = size_descs; - ring->head = NULL; - ring->tail = NULL; - - return 0; - } - -/* Destroy a DMA descriptor ring */ -static void /* Linux version */ -destroy_ring(softc_t *sc, struct desc_ring *ring) - { - struct sk_buff *skb; - - /* Free queued skbuffs. */ - while ((skb = skbuff_dequeue(ring)) != NULL) - dev_kfree_skb(skb); - - /* TX may have one pkt that is not on any queue. */ - if (sc->tx_skb != NULL) - { - dev_kfree_skb(sc->tx_skb); - sc->tx_skb = NULL; - } - - if (ring->first != NULL) - { - /* Unmap active DMA descriptors. */ - while (ring->read != ring->write) - { - pci_unmap_single(sc->pci_dev, ring->read->address1, - ring->read->length1 + ring->read->length2, PCI_DMA_BIDIRECTIONAL); - if (ring->read++ == ring->last) ring->read = ring->first; - } - /* Unmap and free memory for DMA descriptor array. */ - pci_free_consistent(sc->pci_dev, ring->size_descs, ring->first, - ring->dma_addr); - } - } - -static int /* Linux version */ -rxintr_cleanup(softc_t *sc) - { - struct desc_ring *ring = &sc->rxring; - struct dma_desc *first_desc, *last_desc; - struct sk_buff *first_skb=NULL, *last_skb=NULL; - struct sk_buff *new_skb; - int pkt_len, desc_len; - - /* Input packet flow control (livelock prevention): */ - /* Give pkts to higher levels only if quota is > 0. */ - if (sc->quota <= 0) return 0; - - /* This looks complicated, but remember: packets up to 4032 */ - /* bytes long fit in one skbuff and use one DMA descriptor. */ - - first_desc = last_desc = ring->read; - - /* ASSERTION: If there is a descriptor in the ring and the hardware has */ - /* finished with it, then that descriptor will have RX_FIRST_DESC set. */ - if ((ring->read != ring->write) && /* descriptor ring not empty */ - ((ring->read->status & TLP_DSTS_OWNER) == 0) && /* hardware done */ - ((ring->read->status & TLP_DSTS_RX_FIRST_DESC) == 0)) /* should be set */ - panic("%s: rxintr_cleanup: rx-first-descriptor not set.\n", NAME_UNIT); - - /* First decide if a complete packet has arrived. */ - /* Run down DMA descriptors looking for one marked "last". */ - /* Bail out if an active descriptor is encountered. */ - /* Accumulate most significant bits of packet length. */ - pkt_len = 0; - for (;;) - { - if (last_desc == ring->write) return 0; /* no more descs */ - if (last_desc->status & TLP_DSTS_OWNER) return 0; /* still active */ - if (last_desc->status & TLP_DSTS_RX_LAST_DESC) break; /* end of packet */ - pkt_len += last_desc->length1 + last_desc->length2; /* entire desc filled */ - if (last_desc++->control & TLP_DCTL_END_RING) last_desc = ring->first; /* ring wrap */ - } - - /* A complete packet has arrived; how long is it? */ - /* H/w ref man shows RX pkt length as a 14-bit field. */ - /* An experiment found that only the 12 LSBs work. */ - if (((last_desc->status>>16)&0xFFF) == 0) pkt_len += 4096; /* carry-bit */ - pkt_len = (pkt_len & 0xF000) + ((last_desc->status>>16) & 0x0FFF); - /* Subtract the CRC length unless doing so would underflow. */ - if (pkt_len >= sc->config.crc_len) pkt_len -= sc->config.crc_len; - - /* Run down DMA descriptors again doing the following: - * 1) put pkt info in hdr of first skbuff. - * 2) put additional skbuffs on frag_list. - * 3) set skbuff lengths. - */ - first_desc = ring->read; - do - { - /* Read a DMA descriptor from the ring. */ - last_desc = ring->read; - /* Advance the ring read pointer. */ - if (ring->read++ == ring->last) ring->read = ring->first; - - /* Dequeue the corresponding skbuff. */ - new_skb = skbuff_dequeue(ring); - if (new_skb == NULL) - panic("%s: rxintr_cleanup: expected an skbuff\n", NAME_UNIT); - - desc_len = last_desc->length1 + last_desc->length2; - /* Unmap kernel virtual addresss to PCI address. */ - pci_unmap_single(sc->pci_dev, last_desc->address1, - desc_len, PCI_DMA_FROMDEVICE); - - /* Set skbuff length. */ - skb_put(new_skb, (pkt_len >= desc_len) ? desc_len : pkt_len); - pkt_len -= new_skb->len; - - /* 1) Put pkt info in hdr of first skbuff. */ - if (last_desc == first_desc) - { - first_skb = new_skb; - if (sc->config.line_pkg == PKG_RAWIP) - { - if (first_skb->data[0]>>4 == 4) - first_skb->protocol = htons(ETH_P_IP); - else if (first_skb->data[0]>>4 == 6) - first_skb->protocol = htons(ETH_P_IPV6); - } - else -#if GEN_HDLC - first_skb->protocol = hdlc_type_trans(first_skb, sc->net_dev); -#else - first_skb->protocol = htons(ETH_P_HDLC); -#endif - first_skb->mac.raw = first_skb->data; - first_skb->dev = sc->net_dev; - do_gettimeofday(&first_skb->stamp); - sc->net_dev->last_rx = jiffies; - } - else /* 2) link skbuffs. */ - { - /* Put this skbuff on the frag_list of the first skbuff. */ - new_skb->next = NULL; - if (skb_shinfo(first_skb)->frag_list == NULL) - skb_shinfo(first_skb)->frag_list = new_skb; - else - last_skb->next = new_skb; - /* 3) set skbuff lengths. */ - first_skb->len += new_skb->len; - first_skb->data_len += new_skb->len; - } - last_skb = new_skb; - } while ((last_desc->status & TLP_DSTS_RX_LAST_DESC) == 0); - - /* Decide whether to accept or to discard this packet. */ - /* RxHDLC sets MIIERR for bad CRC, abort and partial byte at pkt end. */ - if (((last_desc->status & TLP_DSTS_RX_BAD) == 0) && - (sc->status.oper_status == STATUS_UP) && - (first_skb->len > 0)) - { - /* Optimization: copy a small pkt into a small skbuff. */ - if (first_skb->len <= COPY_BREAK) - if ((new_skb = skb_copy(first_skb, GFP_ATOMIC)) != NULL) - { - dev_kfree_skb_any(first_skb); - first_skb = new_skb; - } - - /* Include CRC and one flag byte in input byte count. */ - sc->status.cntrs.ibytes += first_skb->len + sc->config.crc_len +1; - sc->status.cntrs.ipackets++; - - /* Give this good packet to the network stacks. */ - netif_receive_skb(first_skb); /* NAPI */ - sc->quota--; - } - else if (sc->status.oper_status != STATUS_UP) - { - /* If the link is down, this packet is probably noise. */ - sc->status.cntrs.idiscards++; - dev_kfree_skb_any(first_skb); - if (DRIVER_DEBUG) - printk("%s: rxintr_cleanup: rx pkt discarded: link down\n", NAME_UNIT); - } - else /* Log and discard this bad packet. */ - { - if (DRIVER_DEBUG) - printk("%s: RX bad pkt; len=%d %s%s%s%s\n", - NAME_UNIT, first_skb->len, - (last_desc->status & TLP_DSTS_RX_MII_ERR) ? " miierr" : "", - (last_desc->status & TLP_DSTS_RX_DRIBBLE) ? " dribble" : "", - (last_desc->status & TLP_DSTS_RX_DESC_ERR) ? " descerr" : "", - (last_desc->status & TLP_DSTS_RX_OVERRUN) ? " overrun" : ""); - if (last_desc->status & TLP_DSTS_RX_OVERRUN) - sc->status.cntrs.fifo_over++; - else - sc->status.cntrs.ierrors++; - dev_kfree_skb_any(first_skb); - } - - return 1; /* did something */ - } - -/* Setup (prepare) to receive a packet. */ -/* Try to keep the RX descriptor ring full of empty buffers. */ -static int /* Linux version */ -rxintr_setup(softc_t *sc) - { - struct desc_ring *ring = &sc->rxring; - struct dma_desc *desc; - struct sk_buff *skb; - u_int32_t dma_addr; - - /* Ring is full if (wrap(write+1)==read) */ - if (((ring->write == ring->last) ? ring->first : ring->write+1) == ring->read) - return 0; /* ring is full; nothing to do */ - - /* Allocate an skbuff. */ - if ((skb = dev_alloc_skb(MAX_DESC_LEN)) == NULL) - { - sc->status.cntrs.rxdma++; - if (DRIVER_DEBUG) - printk("%s: rxintr_setup: dev_alloc_skb() failed\n", NAME_UNIT); - return 0; - } - skb->dev = sc->net_dev; - - /* Queue the skbuff for later processing by rxintr_cleanup. */ - skbuff_enqueue(ring, skb); - - /* Write a DMA descriptor into the ring. */ - /* Hardware won't see it until the OWNER bit is set. */ - desc = ring->write; - /* Advance the ring write pointer. */ - if (ring->write++ == ring->last) ring->write = ring->first; - - /* Map kernel virtual addresses to PCI addresses. */ - dma_addr = pci_map_single(sc->pci_dev, skb->data, - MAX_DESC_LEN, PCI_DMA_FROMDEVICE); - /* Set up the DMA descriptor. */ - desc->address1 = dma_addr; - desc->length1 = MAX_CHUNK_LEN; - desc->address2 = desc->address1 + desc->length1; - desc->length2 = MAX_CHUNK_LEN; - - /* Before setting the OWNER bit, flush the cache (memory barrier). */ - wmb(); /* write memory barrier */ - - /* Commit the DMA descriptor to the hardware. */ - desc->status = TLP_DSTS_OWNER; - - /* Notify the receiver that there is another buffer available. */ - WRITE_CSR(TLP_RX_POLL, 1); - - return 1; /* did something */ - } - -/* Clean up after a packet has been transmitted. */ -/* Free the sk_buff and update the DMA descriptor ring. */ -static int /* Linux version */ -txintr_cleanup(softc_t *sc) - { - struct desc_ring *ring = &sc->txring; - struct dma_desc *desc; - - while ((ring->read != ring->write) && /* ring is not empty */ - ((ring->read->status & TLP_DSTS_OWNER) == 0)) - { - /* Read a DMA descriptor from the ring. */ - desc = ring->read; - /* Advance the ring read pointer. */ - if (ring->read++ == ring->last) ring->read = ring->first; - /* Unmap kernel virtual address to PCI address. */ - pci_unmap_single(sc->pci_dev, desc->address1, - desc->length1 + desc->length2, PCI_DMA_TODEVICE); - - /* If this descriptor is the last segment of a packet, */ - /* then dequeue and free the corresponding skbuff. */ - if ((desc->control & TLP_DCTL_TX_LAST_SEG) != 0) - { - struct sk_buff *skb; - if ((skb = skbuff_dequeue(ring)) == NULL) - panic("%s: txintr_cleanup: expected an sk_buff\n", NAME_UNIT); - - /* Include CRC and one flag byte in output byte count. */ - sc->status.cntrs.obytes += skb->len + sc->config.crc_len +1; - sc->status.cntrs.opackets++; - - /* The only bad TX status is fifo underrun. */ - if ((desc->status & TLP_DSTS_TX_UNDERRUN) != 0) - { - sc->status.cntrs.fifo_under++; /* also increment oerrors? */ - if (DRIVER_DEBUG) - printk("%s: txintr_cleanup: tx fifo underrun\n", NAME_UNIT); - } - - dev_kfree_skb_any(skb); - return 1; /* did something */ - } - } - - return 0; - } - -/* Build DMA descriptors for a tranmit packet fragment, */ -/* Assertion: fragment is contiguous in physical memory. */ -static int /* 0=success; 1=error */ /* linux version */ -txintr_setup_frag(softc_t *sc, char *data, int length) - { - struct desc_ring *ring = &sc->txring; - struct dma_desc *desc; - unsigned int desc_len; - u_int32_t dma_addr; - - while (length > 0) - { - /* Ring is full if (wrap(write+1)==read) */ - if (((ring->temp==ring->last) ? ring->first : ring->temp+1) == ring->read) - { /* Not enough DMA descriptors; try later. */ - for (; ring->temp!=ring->write; - ring->temp = (ring->temp==ring->first)? ring->last : ring->temp-1) - pci_unmap_single(sc->pci_dev, ring->temp->address1, - ring->temp->length1 + ring->temp->length2, PCI_DMA_FROMDEVICE); - sc->status.cntrs.txdma++; - return 1; - } - - /* Provisionally, write a DMA descriptor into the ring. */ - /* But don't change the REAL ring write pointer. */ - /* Hardware won't see it until the OWNER bit is set. */ - desc = ring->temp; - /* Advance the temporary ring write pointer. */ - if (ring->temp++ == ring->last) ring->temp = ring->first; - - /* Clear all control bits except the END_RING bit. */ - desc->control &= TLP_DCTL_END_RING; - /* Don't pad short packets up to 64 bytes */ - desc->control |= TLP_DCTL_TX_NO_PAD; - /* Use Tulip's CRC-32 generator, if appropriate. */ - if (sc->config.crc_len != CFG_CRC_32) - desc->control |= TLP_DCTL_TX_NO_CRC; - /* Set the OWNER bit, except in the first descriptor. */ - if (desc != ring->write) - desc->status = TLP_DSTS_OWNER; - - desc_len = (length >= MAX_DESC_LEN) ? MAX_DESC_LEN : length; - /* Map kernel virtual address to PCI address. */ - dma_addr = pci_map_single(sc->pci_dev, data, desc_len, PCI_DMA_TODEVICE); - /* If it will fit in one chunk, do so, otherwise split it. */ - if (desc_len <= MAX_CHUNK_LEN) - { - desc->address1 = dma_addr; - desc->length1 = desc_len; - desc->address2 = 0; - desc->length2 = 0; - } - else - { - desc->address1 = dma_addr; - desc->length1 = desc_len>>1; - desc->address2 = desc->address1 + desc->length1; - desc->length2 = desc_len>>1; - if (desc_len & 1) desc->length2++; - } - - data += desc_len; - length -= desc_len; - } /* while (length > 0) */ - - return 0; /* success */ - } - -/* NB: this procedure is recursive! */ -static int /* 0=success; 1=error */ -txintr_setup_skb(softc_t *sc, struct sk_buff *skb) - { - struct sk_buff *list; - int i; - - /* First, handle the data in the skbuff itself. */ - if (txintr_setup_frag(sc, skb->data, skb_headlen(skb))) - return 1; - - /* Next, handle the VM pages in the Scatter/Gather list. */ - if (skb_shinfo(skb)->nr_frags != 0) - for (i=0; i<skb_shinfo(skb)->nr_frags; i++) - { - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - if (txintr_setup_frag(sc, page_address(frag->page) + - frag->page_offset, frag->size)) - return 1; - } - - /* Finally, handle the skbuffs in the frag_list. */ - if ((list = skb_shinfo(skb)->frag_list) != NULL) - for (; list; list=list->next) - if (txintr_setup_skb(sc, list)) /* recursive! */ - return 1; - - return 0; - } - -/* Setup (prepare) to transmit a packet. */ -/* Select a packet, build DMA descriptors and give packet to hardware. */ -/* If DMA descriptors run out, abandon the attempt and return 0. */ -static int /* Linux version */ -txintr_setup(softc_t *sc) - { - struct desc_ring *ring = &sc->txring; - struct dma_desc *first_desc, *last_desc; - - /* Protect against half-up links: Don't transmit */ - /* if the receiver can't hear the far end. */ - if (sc->status.oper_status != STATUS_UP) return 0; - - /* Pick a packet to transmit. */ - /* linux_start() puts packets in sc->tx_skb. */ - if (sc->tx_skb == NULL) - { - if (netif_queue_stopped(sc->net_dev) != 0) - netif_wake_queue(sc->net_dev); - return 0; /* no pkt to transmit */ - } - - /* Build DMA descriptors for an outgoing skbuff. */ - ring->temp = ring->write; /* temporary ring write pointer */ - if (txintr_setup_skb(sc, sc->tx_skb) != 0) return 0; - - /* Enqueue the skbuff; txintr_cleanup will free it. */ - skbuff_enqueue(ring, sc->tx_skb); - - /* The transmitter has room for another packet. */ - sc->tx_skb = NULL; - - /* Set first & last segment bits. */ - /* last_desc is the desc BEFORE the one pointed to by ring->temp. */ - first_desc = ring->write; - first_desc->control |= TLP_DCTL_TX_FIRST_SEG; - last_desc = (ring->temp==ring->first)? ring->last : ring->temp-1; - last_desc->control |= TLP_DCTL_TX_LAST_SEG; - /* Interrupt at end-of-transmission? Why bother the poor computer! */ -/* last_desc->control |= TLP_DCTL_TX_INTERRUPT; */ - - /* Make sure the OWNER bit is not set in the next descriptor. */ - /* The OWNER bit may have been set if a previous call aborted. */ - ring->temp->status = 0; - - /* Commit the DMA descriptors to the software. */ - ring->write = ring->temp; - - /* Before setting the OWNER bit, flush the cache (memory barrier). */ - wmb(); /* write memory barrier */ - - /* Commit the DMA descriptors to the hardware. */ - first_desc->status = TLP_DSTS_OWNER; - - /* Notify the transmitter that there is another packet to send. */ - WRITE_CSR(TLP_TX_POLL, 1); - - sc->net_dev->trans_start = jiffies; - - return 1; /* did something */ - } - -#endif /* __linux__ */ static void check_intr_status(softc_t *sc) @@ -3914,7 +3043,6 @@ core_interrupt(void *arg, int check_status) /* In Linux, pci_alloc_consistent() means DMA descriptors */ /* don't need explicit syncing. */ -#if BSD { struct desc_ring *ring = &sc->txring; DMA_SYNC(sc->txring.map, sc->txring.size_descs, @@ -3923,7 +3051,6 @@ core_interrupt(void *arg, int check_status) DMA_SYNC(sc->rxring.map, sc->rxring.size_descs, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); } -#endif do /* This is the main loop for interrupt processing. */ { @@ -3933,7 +3060,6 @@ core_interrupt(void *arg, int check_status) activity += rxintr_setup(sc); } while (activity); -#if BSD { struct desc_ring *ring = &sc->txring; DMA_SYNC(sc->txring.map, sc->txring.size_descs, @@ -3942,7 +3068,6 @@ core_interrupt(void *arg, int check_status) DMA_SYNC(sc->rxring.map, sc->rxring.size_descs, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); } -#endif /* As the interrupt is dismissed, check for four unusual events. */ if (check_status) check_intr_status(sc); @@ -3959,9 +3084,8 @@ user_interrupt(softc_t *sc, int check_status) ENABLE_INTR; /* noop on FreeBSD-5 and Linux */ } -#if BSD -# if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +# if defined(DEVICE_POLLING) /* Service the card from the kernel idle loop without interrupts. */ static int @@ -3969,27 +3093,13 @@ fbsd_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) { softc_t *sc = IFP2SC(ifp); -#if (__FreeBSD_version < 700000) - if ((ifp->if_capenable & IFCAP_POLLING) == 0) - { - ether_poll_deregister(ifp); - cmd = POLL_DEREGISTER; - } - - if (cmd == POLL_DEREGISTER) - { - /* Last call -- reenable card interrupts. */ - WRITE_CSR(TLP_INT_ENBL, TLP_INT_TXRX); - return 0; - } -#endif sc->quota = count; core_interrupt(sc, (cmd==POLL_AND_CHECK_STATUS)); return 0; } -# endif /* (__FreeBSD__ && DEVICE_POLLING) */ +# endif /* DEVICE_POLLING */ /* BSD kernels call this procedure when an interrupt happens. */ static intr_return_t @@ -4001,7 +3111,7 @@ bsd_interrupt(void *arg) if ((READ_CSR(TLP_STATUS) & TLP_INT_TXRX) == 0) return IRQ_NONE; -# if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +# if defined(DEVICE_POLLING) if (sc->ifp->if_capenable & IFCAP_POLLING) return IRQ_NONE; @@ -4013,7 +3123,7 @@ bsd_interrupt(void *arg) } else sc->quota = sc->rxring.num_descs; /* input flow control */ -# endif /* (__FreeBSD__ && DEVICE_POLLING) */ +# endif /* DEVICE_POLLING */ /* Disable card interrupts. */ WRITE_CSR(TLP_INT_ENBL, TLP_INT_DISABLE); @@ -4026,7 +3136,6 @@ bsd_interrupt(void *arg) return IRQ_HANDLED; } -#endif /* BSD */ /* Administrative status of the driver (UP or DOWN) has changed. */ /* A card-specific action may be required: T1 and T3 cards: no-op. */ @@ -4081,12 +3190,8 @@ p2p_mdmctl(struct p2pcom *p2p, int flag) static void sppp_tls(struct sppp *sppp) { -# ifdef __FreeBSD__ if (!(sppp->pp_mode & IFF_LINK2) && !(sppp->pp_flags & PP_FR)) -# elif defined(__NetBSD__) || defined(__OpenBSD__) - if (!(sppp->pp_flags & PP_CISCO)) -# endif sppp->pp_up(sppp); } @@ -4094,12 +3199,8 @@ sppp_tls(struct sppp *sppp) static void sppp_tlf(struct sppp *sppp) { -# ifdef __FreeBSD__ if (!(sppp->pp_mode & IFF_LINK2) && !(sppp->pp_flags & PP_FR)) -# elif defined(__NetBSD__) || defined(__OpenBSD__) - if (!(sppp->pp_flags & PP_CISCO)) -# endif sppp->pp_down(sppp); } @@ -4193,12 +3294,8 @@ config_proto(softc_t *sc, struct config *config) (config->line_prot == PROT_PPP)) { LMC_BPF_DETACH; -# if (defined(__NetBSD__) || defined(__OpenBSD__)) - sc->sppp->pp_flags &= ~PP_CISCO; -# elif defined(__FreeBSD__) sc->ifp->if_flags &= ~IFF_LINK2; sc->sppp->pp_flags &= ~PP_FR; -# endif LMC_BPF_ATTACH(DLT_PPP, 4); sppp_ioctl(sc->ifp, SIOCSIFFLAGS, NULL); } @@ -4212,12 +3309,8 @@ config_proto(softc_t *sc, struct config *config) (config->line_prot == PROT_C_HDLC)) { LMC_BPF_DETACH; -# if (defined(__NetBSD__) || defined(__OpenBSD__)) - sc->sppp->pp_flags |= PP_CISCO; -# elif defined(__FreeBSD__) sc->ifp->if_flags |= IFF_LINK2; sc->sppp->pp_flags &= ~PP_FR; -# endif LMC_BPF_ATTACH(DLT_C_HDLC, 4); sppp_ioctl(sc->ifp, SIOCSIFFLAGS, NULL); } @@ -4227,12 +3320,8 @@ config_proto(softc_t *sc, struct config *config) (config->line_prot == PROT_FRM_RLY)) { LMC_BPF_DETACH; -# if (defined(__NetBSD__) || defined(__OpenBSD__)) - sc->sppp->pp_flags &= ~PP_CISCO; -# elif defined(__FreeBSD__) sc->ifp->if_flags &= ~IFF_LINK2; sc->sppp->pp_flags |= PP_FR; -# endif LMC_BPF_ATTACH(DLT_FRELAY, 4); sppp_ioctl(sc->ifp, SIOCSIFFLAGS, NULL); } @@ -4468,7 +3557,6 @@ core_watchdog(softc_t *sc) user_interrupt(sc, 1); } -#if IFNET /* Called from a syscall (user context; no spinlocks). */ static int @@ -4479,16 +3567,8 @@ lmc_raw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) switch (cmd) { -# if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) /* XXX necessary? */ - case SIOCSIFCAP: -# endif case SIOCAIFADDR: case SIOCSIFFLAGS: -#if 0 - case SIOCADDMULTI: - case SIOCDELMULTI: - break; -#endif case SIOCSIFADDR: ifp->if_flags |= IFF_UP; /* a Unix tradition */ break; @@ -4507,9 +3587,6 @@ static int lmc_ifnet_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { softc_t *sc = IFP2SC(ifp); -# ifdef __OpenBSD__ - struct ifreq *ifr = (struct ifreq *) data; -# endif int error = 0; switch (cmd) @@ -4523,34 +3600,6 @@ lmc_ifnet_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) case LMCIOCTL: error = core_ioctl(sc, cmd, data); break; -# ifdef __OpenBSD__ - /* Catch the IOCTLs used by ifconfig. */ - case SIOCSIFMEDIA: - if ((error = CHECK_CAP)) break; - case SIOCGIFMEDIA: - error = ifmedia_ioctl(ifp, ifr, &sc->ifm, cmd); - break; - case SIOCSIFTIMESLOT: - if ((error = CHECK_CAP)) break; - if (sc->status.card_type == TLP_CSID_T1E1) - { - struct config config = sc->config; - if ((error = copyin(ifr->ifr_data, &config.time_slots, - sizeof config.time_slots))) break; - config.iohdr.cookie = NGM_LMC_COOKIE; - error = core_ioctl(sc, LMCIOCSCFG, (caddr_t)&config); - } - else - error = EINVAL; - break; - case SIOCGIFTIMESLOT: - if (sc->status.card_type == TLP_CSID_T1E1) - error = copyout(&sc->config.time_slots, ifr->ifr_data, - sizeof sc->config.time_slots); - else - error = EINVAL; - break; -# endif /* Pass the rest to the line protocol. */ default: if (sc->config.line_pkg == PKG_RAWIP) @@ -4621,11 +3670,7 @@ lmc_raw_output(struct ifnet *ifp, struct mbuf *m, /* Some BSD QUEUE routines are not interrupt-safe. */ { DISABLE_INTR; -# if (__FreeBSD_version >= 503000) IFQ_ENQUEUE(&ifp->if_snd, m, error); -# else - IFQ_ENQUEUE(&ifp->if_snd, m, NULL, error); -# endif ENABLE_INTR; } @@ -4704,13 +3749,9 @@ lmc_watchdog(void *arg) /* Notice change in line protocol. */ sc->status.line_pkg = PKG_SPPP; -# ifdef __FreeBSD__ if (sc->sppp->pp_flags & PP_FR) sc->status.line_prot = PROT_FRM_RLY; else if (sc->ifp->if_flags & IFF_LINK2) -# elif (defined(__NetBSD__) || defined(__OpenBSD__)) - if (sc->sppp->pp_flags & PP_CISCO) -# endif sc->status.line_prot = PROT_C_HDLC; else sc->status.line_prot = PROT_PPP; @@ -4731,88 +3772,15 @@ lmc_watchdog(void *arg) ifp->if_oerrors = cntrs->oerrors; ifp->if_iqdrops = cntrs->idiscards; -# if ((__FreeBSD_version >= 500000) || defined(__OpenBSD__) || defined(__NetBSD__)) if (sc->status.oper_status == STATUS_UP) ifp->if_link_state = LINK_STATE_UP; else ifp->if_link_state = LINK_STATE_DOWN; -# endif /* Call this procedure again after one second. */ callout_reset(&sc->callout, hz, lmc_watchdog, ifp); } -# ifdef __OpenBSD__ - -/* Callback from ifmedia. */ -static int -ifmedia_change(struct ifnet *ifp) - { - softc_t *sc = IFP2SC(ifp); - struct config config = sc->config; - int media = sc->ifm.ifm_media; - int error; - - /* ifconfig lmc0 media t1 */ - if (sc->status.card_type == TLP_CSID_T3) - { - if ((media & IFM_TMASK) == IFM_TDM_T3) - config.format = CFG_FORMAT_T3CPAR; - else if ((media & IFM_TMASK) == IFM_TDM_T3_M13) - config.format = CFG_FORMAT_T3M13; - } - else if (sc->status.card_type == TLP_CSID_T1E1) - { - if ((media & IFM_TMASK) == IFM_TDM_T1) - config.format = CFG_FORMAT_T1ESF; - else if ((media & IFM_TMASK) == IFM_TDM_T1_AMI) - config.format = CFG_FORMAT_T1SF; - else if ((media & IFM_TMASK) == IFM_TDM_E1) - config.format = CFG_FORMAT_E1NONE; - else if ((media & IFM_TMASK) == IFM_TDM_E1_G704) - config.format = CFG_FORMAT_E1FASCRC; - } - - /* ifconfig lmc0 mediaopt loopback */ - if (media & IFM_LOOP) - config.loop_back = CFG_LOOP_TULIP; - else - config.loop_back = CFG_LOOP_NONE; - - /* ifconfig lmc0 mediaopt crc16 */ - if (media & IFM_TDM_HDLC_CRC16) - config.crc_len = CFG_CRC_16; - else - config.crc_len = CFG_CRC_32; - - /* Set ConFiGuration. */ - config.iohdr.cookie = NGM_LMC_COOKIE; - error = core_ioctl(sc, LMCIOCSCFG, (caddr_t)&config); - - return error; - } - -/* Callback from ifmedia. */ -static void -ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr) - { - softc_t *sc = IFP2SC(ifp); - - /* ifconfig wants to know if the hardware link is up. */ - ifmr->ifm_status = IFM_AVALID; - if (sc->status.oper_status == STATUS_UP) - ifmr->ifm_status |= IFM_ACTIVE; - - ifmr->ifm_active = sc->ifm.ifm_cur->ifm_media; - - if (sc->config.loop_back != CFG_LOOP_NONE) - ifmr->ifm_active |= IFM_LOOP; - - if (sc->config.crc_len == CFG_CRC_16) - ifmr->ifm_active |= IFM_TDM_HDLC_CRC16; - } - -# endif /* __OpenBSD__ */ static void setup_ifnet(struct ifnet *ifp) @@ -4820,7 +3788,6 @@ setup_ifnet(struct ifnet *ifp) softc_t *sc = ifp->if_softc; /* Initialize the generic network interface. */ - /* Note similarity to linux's setup_netdev(). */ ifp->if_flags = IFF_POINTOPOINT; ifp->if_flags |= IFF_RUNNING; ifp->if_ioctl = lmc_ifnet_ioctl; @@ -4830,49 +3797,24 @@ setup_ifnet(struct ifnet *ifp) ifp->if_mtu = MAX_DESC_LEN; /* sppp & p2p change this */ ifp->if_type = IFT_PTPSERIAL; /* p2p changes this */ -# if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +# if defined(DEVICE_POLLING) ifp->if_capabilities |= IFCAP_POLLING; ifp->if_capenable |= IFCAP_POLLING_NOCOUNT; -# if (__FreeBSD_version < 500000) - ifp->if_capenable |= IFCAP_POLLING; -# endif # endif - /* Every OS does it differently! */ -# if (defined(__FreeBSD__) && (__FreeBSD_version < 502000)) - (const char *)ifp->if_name = device_get_name(sc->dev); - ifp->if_unit = device_get_unit(sc->dev); -# elif (__FreeBSD_version >= 502000) if_initname(ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); -# elif defined(__NetBSD__) - strcpy(ifp->if_xname, sc->dev.dv_xname); -# elif defined(__OpenBSD__) - bcopy(sc->dev.dv_xname, ifp->if_xname, IFNAMSIZ); -# elif defined(__bsdi__) - ifp->if_name = sc->dev.dv_cfdata->cf_driver->cd_name; - ifp->if_unit = sc->dev.dv_unit; -# endif } static int lmc_ifnet_attach(softc_t *sc) { -# if (__FreeBSD_version >= 600000) sc->ifp = if_alloc(NSPPP ? IFT_PPP : IFT_OTHER); if (sc->ifp == NULL) return ENOMEM; -# endif # if NSPPP -# if (__FreeBSD_version >= 600000) sc->sppp = sc->ifp->if_l2com; -# else - sc->ifp = &sc->spppcom.pp_if; - sc->sppp = &sc->spppcom; -# endif # elif P2P sc->ifp = &sc->p2pcom.p2p_if; sc->p2p = &sc->p2pcom; -# elif (__FreeBSD_version < 600000) - sc->ifp = &sc->ifnet; # endif /* Initialize the network interface struct. */ @@ -4886,40 +3828,9 @@ lmc_ifnet_attach(softc_t *sc) /* Attach to the ifnet kernel interface. */ if_attach(sc->ifp); -# if ((defined(__NetBSD__) && __NetBSD_Version__ >= 106000000) || \ - (defined(__OpenBSD__) && OpenBSD >= 200211)) - if_alloc_sadl(sc->ifp); -# endif - /* Attach Berkeley Packet Filter. */ LMC_BPF_ATTACH(DLT_RAW, 0); -# ifdef __OpenBSD__ - /* Initialize ifmedia mechanism. */ - ifmedia_init(&sc->ifm, IFM_OMASK | IFM_GMASK | IFM_IMASK, - ifmedia_change, ifmedia_status); - if (sc->status.card_type == TLP_CSID_T3) - { - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_T3, 0, NULL); - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_T3_M13, 0, NULL); - ifmedia_set(&sc->ifm, IFM_TDM | IFM_TDM_T3); - } - else if (sc->status.card_type == TLP_CSID_T1E1) - { - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_T1, 0, NULL); - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_T1_AMI, 0, NULL); - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_E1, 0, NULL); - ifmedia_add(&sc->ifm, IFM_TDM | IFM_TDM_E1_G704, 0, NULL); - ifmedia_set(&sc->ifm, IFM_TDM | IFM_TDM_T1); - } - else if ((sc->status.card_type == TLP_CSID_HSSI) || - (sc->status.card_type == TLP_CSID_SSI)) - { - ifmedia_add(&sc->ifm, IFM_TDM | IFM_NONE, 0, NULL); - ifmedia_set(&sc->ifm, IFM_TDM | IFM_NONE); - } -# endif /* __OpenBSD__ */ - callout_reset(&sc->callout, hz, lmc_watchdog, sc); return 0; @@ -4928,11 +3839,8 @@ lmc_ifnet_attach(softc_t *sc) static void lmc_ifnet_detach(softc_t *sc) { -# ifdef __OpenBSD__ - ifmedia_delete_instance(&sc->ifm, IFM_INST_ANY); -# endif -# if (defined(__FreeBSD__) && defined(DEVICE_POLLING)) +# if defined(DEVICE_POLLING) if (sc->ifp->if_capenable & IFCAP_POLLING) ether_poll_deregister(sc->ifp); # endif @@ -4940,28 +3848,15 @@ lmc_ifnet_detach(softc_t *sc) /* Detach Berkeley Packet Filter. */ LMC_BPF_DETACH; -# if ((defined(__NetBSD__) && __NetBSD_Version__ >= 106000000) || \ - (defined(__OpenBSD__) && OpenBSD >= 200211)) - if_free_sadl(sc->ifp); -# endif - /* Detach from the ifnet kernel interface. */ if_detach(sc->ifp); -# if (defined(__FreeBSD__) && __FreeBSD_version >= 800082) if_free(sc->ifp); -# elif (defined(__FreeBSD__) && __FreeBSD_version >= 600000) - if_free_type(sc->ifp, NSPPP ? IFT_PPP : IFT_OTHER); -# endif } -#endif /* IFNET */ #if NETGRAPH -/* Netgraph changed significantly between FreeBSD-4 and -5. */ -/* These are backward compatibility hacks for FreeBSD-4. */ -# if (__FreeBSD_version >= 500000) /* These next two macros should be added to netgraph */ # define NG_TYPE_REF(type) atomic_add_int(&(type)->refs, 1) # define NG_TYPE_UNREF(type) \ @@ -4971,39 +3866,16 @@ do { \ else \ atomic_subtract_int(&(type)->refs, 1); \ } while (0) -# else /* FreeBSD-4 */ -# define NGI_GET_MSG(item, msg) /* nothing */ -# define NG_HOOK_FORCE_QUEUE(hook) /* nothing */ -# define NG_TYPE_REF(type) atomic_add_int(&(type)->refs, 1) -# define NG_TYPE_UNREF(type) \ -do { \ - if ((type)->refs == 1) \ - LIST_REMOVE(type, types); \ - else \ - atomic_subtract_int(&(type)->refs, 1); \ - } while (0) -# endif /* It is an error to construct new copies of this Netgraph node. */ /* All instances are constructed by ng_attach and are persistent. */ -# if (__FreeBSD_version >= 500000) static int ng_constructor(node_p node) { return EINVAL; } -# else /* FreeBSD-4 */ -static int ng_constructor(node_p *node) { return EINVAL; } -# endif /* Incoming Netgraph control message. */ -# if (__FreeBSD_version >= 500000) static int ng_rcvmsg(node_p node, item_p item, hook_p lasthook) { struct ng_mesg *msg; -# else /* FreeBSD-4 */ -static int -ng_rcvmsg(node_p node, struct ng_mesg *msg, - const char *retaddr, struct ng_mesg **rptr) - { -# endif struct ng_mesg *resp = NULL; softc_t *sc = NG_NODE_PRIVATE(node); int error = 0; @@ -5073,16 +3945,8 @@ ng_rcvmsg(node_p node, struct ng_mesg *msg, error = EINVAL; /* Handle synchronous response. */ -# if (__FreeBSD_version >= 500000) NG_RESPOND_MSG(error, node, item, resp); NG_FREE_MSG(msg); -# else /* FreeBSD-4 */ - if (rptr != NULL) - *rptr = resp; - else if (resp != NULL) - free(resp, M_NETGRAPH); - free(msg, M_NETGRAPH); -# endif return error; } @@ -5091,14 +3955,9 @@ ng_rcvmsg(node_p node, struct ng_mesg *msg, static int ng_shutdown(node_p node) { -# if (__FreeBSD_version >= 500000) /* unless told to really die, bounce back to life */ if ((node->nd_flags & NG_REALLY_DIE)==0) node->nd_flags &= ~NG_INVALID; /* bounce back to life */ -# else /* FreeBSD-4 */ - ng_cutlinks(node); - node->flags &= ~NG_INVALID; /* bounce back to life */ -# endif return 0; } @@ -5135,7 +3994,6 @@ ng_connect(hook_p hook) /* Transmit an mbuf-chain on the communication link. */ /* This procedure is very similar to lmc_raw_output(). */ /* Called from a syscall (user context; no spinlocks). */ -# if (__FreeBSD_version >= 500000) static int ng_rcvdata(hook_p hook, item_p item) { @@ -5147,13 +4005,6 @@ ng_rcvdata(hook_p hook, item_p item) NGI_GET_M(item, m); NGI_GET_META(item, meta); NG_FREE_ITEM(item); -# else /* FreeBSD-4 */ -static int -ng_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) - { - softc_t *sc = NG_NODE_PRIVATE(NG_HOOK_NODE(hook)); - int error = 0; -# endif /* This macro must not store into meta! */ NG_FREE_META(meta); @@ -5173,17 +4024,10 @@ ng_rcvdata(hook_p hook, struct mbuf *m, meta_p meta) /* Some BSD QUEUE routines are not interrupt-safe. */ { DISABLE_INTR; -# if (__FreeBSD_version >= 503000) if (meta==NULL) IFQ_ENQUEUE(&sc->ng_sndq, m, error); else IFQ_ENQUEUE(&sc->ng_fastq, m, error); -# else - if (meta==NULL) - IFQ_ENQUEUE(&sc->ng_sndq, m, NULL, error); - else - IFQ_ENQUEUE(&sc->ng_fastq, m, NULL, error); -# endif ENABLE_INTR; } @@ -5222,38 +4066,15 @@ struct ng_type ng_type = .mod_event = NULL, .constructor = ng_constructor, .rcvmsg = ng_rcvmsg, -# if (__FreeBSD_version >=503000) .close = NULL, -# endif .shutdown = ng_shutdown, .newhook = ng_newhook, .findhook = NULL, .connect = ng_connect, .rcvdata = ng_rcvdata, -# if (defined(__FreeBSD__) && (__FreeBSD_version < 500000)) - .rcvdataq = ng_rcvdata, -# endif .disconnect = ng_disconnect, }; -# if (IFNET == 0) -/* Called from a softirq once a second. */ -static void -ng_watchdog(void *arg) - { - softc_t *sc = arg; - - /* Call the core watchdog procedure. */ - core_watchdog(sc); - - /* Set line protocol and package status. */ - sc->status.line_pkg = PKG_NG; - sc->status.line_prot = 0; - - /* Call this procedure again after one second. */ - callout_reset(&sc->callout, hz, ng_watchdog, sc); - } -# endif /* Attach to the Netgraph kernel interface (/sys/netgraph). * It is called once for each physical card during device attach. @@ -5293,11 +4114,9 @@ ng_attach(softc_t *sc) return error; } -# if (__FreeBSD_version >= 500000) /* Initialize the send queue mutexes. */ mtx_init(&sc->ng_sndq.ifq_mtx, NAME_UNIT, "sndq", MTX_DEF); mtx_init(&sc->ng_fastq.ifq_mtx, NAME_UNIT, "fastq", MTX_DEF); -# endif /* Put a backpointer to the softc in the netgraph node. */ NG_NODE_SET_PRIVATE(sc->ng_node, sc); @@ -5308,10 +4127,6 @@ ng_attach(softc_t *sc) IFQ_SET_MAXLEN(&sc->ng_sndq, SNDQ_MAXLEN); IFQ_SET_READY(&sc->ng_sndq); -# if (IFNET == 0) - /* Arrange to call ng_watchdog() once a second. */ - callout_reset(&sc->callout, hz, ng_watchdog, sc); -# endif return 0; } @@ -5320,18 +4135,11 @@ static void ng_detach(softc_t *sc) { callout_drain(&sc->callout); -# if (__FreeBSD_version >= 500000) mtx_destroy(&sc->ng_sndq.ifq_mtx); mtx_destroy(&sc->ng_fastq.ifq_mtx); ng_rmnode_self(sc->ng_node); /* free hook */ NG_NODE_UNREF(sc->ng_node); /* free node */ NG_TYPE_UNREF(&ng_type); -# else /* FreeBSD-4 */ - ng_unname(sc->ng_node); /* free name */ - ng_cutlinks(sc->ng_node); /* free hook */ - NG_NODE_UNREF(sc->ng_node); /* free node */ - NG_TYPE_UNREF(&ng_type); -# endif } #endif /* NETGRAPH */ @@ -5491,21 +4299,15 @@ attach_card(softc_t *sc, const char *intrstr) /* Start the card. */ if ((error = startup_card(sc))) return error; -# if (__FreeBSD_version >= 500000) callout_init(&sc->callout, 0); -# else /* FreeBSD-4 */ - callout_init(&sc->callout); -# endif /* Attach a kernel interface. */ #if NETGRAPH if ((error = ng_attach(sc))) return error; sc->flags |= FLAG_NETGRAPH; #endif -#if IFNET if ((error = lmc_ifnet_attach(sc))) return error; sc->flags |= FLAG_IFNET; -#endif /* Attach a line protocol stack. */ sc->config.line_pkg = PKG_RAWIP; @@ -5572,14 +4374,12 @@ detach_card(softc_t *sc) sc->flags &= ~FLAG_NETGRAPH; } #endif -#if IFNET if (sc->flags & FLAG_IFNET) { IFQ_PURGE(&sc->ifp->if_snd); lmc_ifnet_detach(sc); sc->flags &= ~FLAG_IFNET; } -#endif /* Reset the Tulip chip; stops DMA and Interrupts. */ shutdown_card(sc); @@ -5587,7 +4387,6 @@ detach_card(softc_t *sc) /* This is the I/O configuration interface for FreeBSD */ -#ifdef __FreeBSD__ static int fbsd_probe(device_t dev) @@ -5643,10 +4442,8 @@ fbsd_detach(device_t dev) sc->csr_res = NULL; } -# if (__FreeBSD_version >= 500000) mtx_destroy(&sc->top_mtx); mtx_destroy(&sc->bottom_mtx); -# endif return 0; /* no error */ } @@ -5723,11 +4520,9 @@ fbsd_attach(device_t dev) return error; } -# if (__FreeBSD_version >= 500000) /* Initialize the top-half and bottom-half locks. */ mtx_init(&sc->top_mtx, NAME_UNIT, "top half lock", MTX_DEF); mtx_init(&sc->bottom_mtx, NAME_UNIT, "bottom half lock", MTX_DEF); -# endif /* Start the card and attach a kernel interface and line protocol. */ if ((error = attach_card(sc, ""))) detach_card(sc); @@ -5748,11 +4543,7 @@ static driver_t driver = { .name = DEVICE_NAME, .methods = methods, -# if (__FreeBSD_version >= 500000) .size = sizeof(softc_t), -# else /* FreeBSD-4 */ - .softc = sizeof(softc_t), -# endif }; static devclass_t devclass; @@ -5767,1281 +4558,13 @@ MODULE_DEPEND(lmc, netgraph, NG_ABI_VERSION, NG_ABI_VERSION, NG_ABI_VERSION); MODULE_DEPEND(lmc, sppp, 1, 1, 1); # endif -#endif /* __FreeBSD__ */ /* This is the I/O configuration interface for NetBSD. */ -#ifdef __NetBSD__ - -static int -nbsd_match(struct device *parent, struct cfdata *match, void *aux) - { - struct pci_attach_args *pa = aux; - u_int32_t cfid = pci_conf_read(pa->pa_pc, pa->pa_tag, TLP_CFID); - u_int32_t csid = pci_conf_read(pa->pa_pc, pa->pa_tag, TLP_CSID); - - /* Looking for a DEC 21140A chip on any Lan Media Corp card. */ - if (cfid != TLP_CFID_TULIP) return 0; - switch (csid) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - case TLP_CSID_T3: - case TLP_CSID_SSI: - case TLP_CSID_T1E1: - return 100; - default: - return 0; - } - } - -static int -nbsd_detach(struct device *self, int flags) - { - softc_t *sc = (softc_t *)self; /* device is first in softc */ - - /* Stop the card and detach from the kernel. */ - detach_card(sc); - - /* Release resources. */ - if (sc->sdh_cookie != NULL) - { - shutdownhook_disestablish(sc->sdh_cookie); - sc->sdh_cookie = NULL; - } - if (sc->irq_cookie != NULL) - { - pci_intr_disestablish(sc->pa_pc, sc->irq_cookie); - sc->irq_cookie = NULL; - } - if (sc->csr_handle) - { - bus_space_unmap(sc->csr_tag, sc->csr_handle, TLP_CSR_SIZE); - sc->csr_handle = 0; - } - - return 0; /* no error */ - } - -static void -nbsd_attach(struct device *parent, struct device *self, void *aux) - { - softc_t *sc = (softc_t *)self; /* device is first in softc */ - struct pci_attach_args *pa = aux; - const char *intrstr; - bus_addr_t csr_addr; - int error; - - /* READ/WRITE_PCI_CFG need these. */ - sc->pa_pc = pa->pa_pc; - sc->pa_tag = pa->pa_tag; - /* bus_dma needs this. */ - sc->pa_dmat = pa->pa_dmat; - - /* What kind of card are we driving? */ - switch (READ_PCI_CFG(sc, TLP_CSID)) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - sc->dev_desc = HSSI_DESC; - sc->card = &hssi_card; - break; - case TLP_CSID_T3: - sc->dev_desc = T3_DESC; - sc->card = &t3_card; - break; - case TLP_CSID_SSI: - sc->dev_desc = SSI_DESC; - sc->card = &ssi_card; - break; - case TLP_CSID_T1E1: - sc->dev_desc = T1E1_DESC; - sc->card = &t1_card; - break; - default: - return; - } - printf(": %s\n", sc->dev_desc); - - /* Allocate PCI resources to access the Tulip chip CSRs. */ -# if IOREF_CSR - csr_addr = (bus_addr_t)READ_PCI_CFG(sc, TLP_CBIO) & -2; - sc->csr_tag = pa->pa_iot; /* bus_space tag for IO refs */ -# else - csr_addr = (bus_addr_t)READ_PCI_CFG(sc, TLP_CBMA); - sc->csr_tag = pa->pa_memt; /* bus_space tag for MEM refs */ -# endif - if ((error = bus_space_map(sc->csr_tag, csr_addr, - TLP_CSR_SIZE, 0, &sc->csr_handle))) - { - printf("%s: bus_space_map() failed; error %d\n", NAME_UNIT, error); - return; - } - - /* Allocate PCI interrupt resources. */ - if ((error = pci_intr_map(pa, &sc->intr_handle))) - { - printf("%s: pci_intr_map() failed; error %d\n", NAME_UNIT, error); - nbsd_detach(self, 0); - return; - } - sc->irq_cookie = pci_intr_establish(pa->pa_pc, sc->intr_handle, - IPL_NET, bsd_interrupt, sc); - if (sc->irq_cookie == NULL) - { - printf("%s: pci_intr_establish() failed\n", NAME_UNIT); - nbsd_detach(self, 0); - return; - } - intrstr = pci_intr_string(pa->pa_pc, sc->intr_handle); - - /* Install a shutdown hook. */ - sc->sdh_cookie = shutdownhook_establish(shutdown_card, sc); - if (sc->sdh_cookie == NULL) - { - printf("%s: shutdown_hook_establish() failed\n", NAME_UNIT); - nbsd_detach(self, 0); - return; - } - - /* Initialize the top-half and bottom-half locks. */ - simple_lock_init(&sc->top_lock); - simple_lock_init(&sc->bottom_lock); - - /* Start the card and attach a kernel interface and line protocol. */ - if ((error = attach_card(sc, intrstr))) detach_card(sc); - } - -# if (__NetBSD_Version__ >= 106080000) /* 1.6H */ -CFATTACH_DECL(lmc, sizeof(softc_t), - nbsd_match, nbsd_attach, nbsd_detach, NULL); -# else -struct cfattach lmc_ca = - { -/*.ca_name = DEVICE_NAME, */ - .ca_devsize = sizeof(softc_t), - .ca_match = nbsd_match, - .ca_attach = nbsd_attach, - .ca_detach = nbsd_detach, - .ca_activate = NULL, - }; -# endif - -# if (__NetBSD_Version__ >= 106080000) -CFDRIVER_DECL(lmc, DV_IFNET, NULL); -# else -static struct cfdriver lmc_cd = - { - .cd_name = DEVICE_NAME, - .cd_class = DV_IFNET, - .cd_ndevs = 0, - .cd_devs = NULL, - }; -# endif - -/* cfdata is declared static, unseen outside this module. */ -/* It is used for LKM; config builds its own in ioconf.c. */ -static struct cfdata lmc_cf = - { -# if (__NetBSD_Version__ >= 106080000) - .cf_name = DEVICE_NAME, - .cf_atname = DEVICE_NAME, -# else - .cf_driver = &lmc_cd, - .cf_attach = &lmc_ca, -# endif - .cf_unit = 0, - .cf_fstate = FSTATE_STAR, - }; - -# if (__NetBSD_Version__ >= 106080000) -MOD_MISC(DEVICE_NAME) -# else -static struct lkm_misc _module = - { - .lkm_name = DEVICE_NAME, - .lkm_type = LM_MISC, - .lkm_offset = 0, - .lkm_ver = LKM_VERSION, - }; -# endif - -/* From /sys/dev/pci/pci.c (no public prototype). */ -int pciprint(void *, const char *); - -static int lkm_nbsd_match(struct pci_attach_args *pa) - { return nbsd_match(0, 0, pa); } - -/* LKM loader finds this by appending "_lkmentry" to filename "if_lmc". */ -int if_lmc_lkmentry(struct lkm_table *lkmtp, int cmd, int ver) - { - int i, error = 0; - - if (ver != LKM_VERSION) return EINVAL; - switch (cmd) - { - case LKM_E_LOAD: - { - struct cfdriver* pcicd; - - lkmtp->private.lkm_misc = &_module; - if ((pcicd = config_cfdriver_lookup("pci")) == NULL) - { - printf("%s: config_cfdriver_lookup(pci) failed; error %d\n", - lmc_cd.cd_name, error); - return error; - } -# if (__NetBSD_Version__ >= 106080000) - if ((error = config_cfdriver_attach(&lmc_cd))) - { - printf("%s: config_cfdriver_attach() failed; error %d\n", - lmc_cd.cd_name, error); - return error; - } - if ((error = config_cfattach_attach(lmc_cd.cd_name, &lmc_ca))) - { - printf("%s: config_cfattach_attach() failed; error %d\n", - lmc_cd.cd_name, error); - config_cfdriver_detach(&lmc_cd); - return error; - } -# endif - for (i=0; i<pcicd->cd_ndevs; i++) - { - int dev; - /* A pointer to a device is a pointer to its softc. */ - struct pci_softc *sc = pcicd->cd_devs[i]; - if (sc == NULL) continue; - for (dev=0; dev<sc->sc_maxndevs; dev++) - { - struct pci_attach_args pa; - pcitag_t tag = pci_make_tag(sc->sc_pc, sc->sc_bus, dev, 0); - if (pci_probe_device(sc, tag, lkm_nbsd_match, &pa) != 0) - config_attach(pcicd->cd_devs[i], &lmc_cf, &pa, pciprint); - /* config_attach doesn't return on failure; it calls panic. */ - } - } - break; - } - case LKM_E_UNLOAD: - { - for (i=lmc_cd.cd_ndevs-1; i>=0; i--) - { - struct device *dev = lmc_cd.cd_devs[i]; - if (dev == NULL) continue; - if ((error = config_detach(dev, 0))) - { - printf("%s: config_detach() failed; error %d\n", - dev->dv_xname, error); - return error; - } - } -# if (__NetBSD_Version__ >= 106080000) - if ((error = config_cfattach_detach(lmc_cd.cd_name, &lmc_ca))) - { - printf("%s: config_cfattach_detach() failed; error %d\n", - lmc_cd.cd_name, error); - return error; - } - if ((error = config_cfdriver_detach(&lmc_cd))) - { - printf("%s: config_cfdriver_detach() failed; error %d\n", - lmc_cd.cd_name, error); - return error; - } -# endif - break; - } - case LKM_E_STAT: - break; - } - - return error; - } - -#endif /* __NetBSD__ */ /* This is the I/O configuration interface for OpenBSD. */ -#ifdef __OpenBSD__ - -static int -obsd_match(struct device *parent, void *match, void *aux) - { - struct pci_attach_args *pa = aux; - u_int32_t cfid = pci_conf_read(pa->pa_pc, pa->pa_tag, TLP_CFID); - u_int32_t csid = pci_conf_read(pa->pa_pc, pa->pa_tag, TLP_CSID); - - /* Looking for a DEC 21140A chip on any Lan Media Corp card. */ - if (cfid != TLP_CFID_TULIP) return 0; - switch (csid) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - case TLP_CSID_T3: - case TLP_CSID_SSI: - case TLP_CSID_T1E1: - return 100; /* match better than other 21140 drivers */ - default: - return 0; - } - } - -static int -obsd_detach(struct device *self, int flags) - { - softc_t *sc = (softc_t *)self; /* device is first in softc */ - - /* Stop the card and detach from the kernel. */ - detach_card(sc); - - /* Release resources. */ - if (sc->sdh_cookie != NULL) - { - shutdownhook_disestablish(sc->sdh_cookie); - sc->sdh_cookie = NULL; - } - if (sc->irq_cookie != NULL) - { - pci_intr_disestablish(sc->pa_pc, sc->irq_cookie); - sc->irq_cookie = NULL; - } - if (sc->csr_handle) - { - bus_space_unmap(sc->csr_tag, sc->csr_handle, TLP_CSR_SIZE); - sc->csr_handle = 0; - } - - return 0; /* no error */ - } - -static void -obsd_attach(struct device *parent, struct device *self, void *aux) - { - softc_t *sc = (softc_t *)self; /* device is first in softc */ - struct pci_attach_args *pa = aux; - const char *intrstr; - bus_addr_t csr_addr; - int error; - - /* READ/WRITE_PCI_CFG need these. */ - sc->pa_pc = pa->pa_pc; - sc->pa_tag = pa->pa_tag; - /* bus_dma needs this. */ - sc->pa_dmat = pa->pa_dmat; - - /* What kind of card are we driving? */ - switch (READ_PCI_CFG(sc, TLP_CSID)) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - sc->dev_desc = HSSI_DESC; - sc->card = &hssi_card; - break; - case TLP_CSID_T3: - sc->dev_desc = T3_DESC; - sc->card = &t3_card; - break; - case TLP_CSID_SSI: - sc->dev_desc = SSI_DESC; - sc->card = &ssi_card; - break; - case TLP_CSID_T1E1: - sc->dev_desc = T1E1_DESC; - sc->card = &t1_card; - break; - default: - return; - } - printf(": %s\n", sc->dev_desc); - - /* Allocate PCI resources to access the Tulip chip CSRs. */ -# if IOREF_CSR - csr_addr = (bus_addr_t)READ_PCI_CFG(sc, TLP_CBIO) & -2; - sc->csr_tag = pa->pa_iot; /* bus_space tag for IO refs */ -# else - csr_addr = (bus_addr_t)READ_PCI_CFG(sc, TLP_CBMA); - sc->csr_tag = pa->pa_memt; /* bus_space tag for MEM refs */ -# endif - if ((error = bus_space_map(sc->csr_tag, csr_addr, - TLP_CSR_SIZE, 0, &sc->csr_handle))) - { - printf("%s: bus_space_map() failed; error %d\n", NAME_UNIT, error); - return; - } - - /* Allocate PCI interrupt resources. */ - if ((error = pci_intr_map(pa, &sc->intr_handle))) - { - printf("%s: pci_intr_map() failed; error %d\n", NAME_UNIT, error); - obsd_detach(self, 0); - return; - } - sc->irq_cookie = pci_intr_establish(pa->pa_pc, sc->intr_handle, - IPL_NET, bsd_interrupt, sc, self->dv_xname); - if (sc->irq_cookie == NULL) - { - printf("%s: pci_intr_establish() failed\n", NAME_UNIT); - obsd_detach(self, 0); - return; - } - intrstr = pci_intr_string(pa->pa_pc, sc->intr_handle); - - /* Install a shutdown hook. */ - sc->sdh_cookie = shutdownhook_establish(shutdown_card, sc); - if (sc->sdh_cookie == NULL) - { - printf("%s: shutdown_hook_establish() failed\n", NAME_UNIT); - obsd_detach(self, 0); - return; - } - - /* Initialize the top-half and bottom-half locks. */ - simple_lock_init(&sc->top_lock); - simple_lock_init(&sc->bottom_lock); - - /* Start the card and attach a kernel interface and line protocol. */ - if ((error = attach_card(sc, intrstr))) detach_card(sc); - } - -struct cfattach lmc_ca = - { - .ca_devsize = sizeof(softc_t), - .ca_match = obsd_match, - .ca_attach = obsd_attach, - .ca_detach = obsd_detach, - .ca_activate = NULL, - }; - -struct cfdriver lmc_cd = - { - .cd_name = DEVICE_NAME, - .cd_devs = NULL, - .cd_class = DV_IFNET, - .cd_indirect = 0, - .cd_ndevs = 0, - }; - -/* cfdata is declared static, unseen outside this module. */ -/* It is used for LKM; config builds its own in ioconf.c. */ -static struct cfdata lmc_cfdata = - { - .cf_attach = &lmc_ca, - .cf_driver = &lmc_cd, - .cf_unit = 0, - .cf_fstate = FSTATE_STAR, - }; - -static struct lkm_any _module = - { - .lkm_name = DEVICE_NAME, - .lkm_type = LM_MISC, - .lkm_offset = 0, - .lkm_ver = LKM_VERSION, - }; - -/* From /sys/dev/pci/pci.c (no public prototype). */ -int pciprint(void *, const char *); - -extern struct cfdriver pci_cd; - -/* LKM loader finds this by appending "_lkmentry" to filename "if_lmc". */ -int if_lmc_lkmentry(struct lkm_table *lkmtp, int cmd, int ver) - { - int i, error = 0; - - if (ver != LKM_VERSION) return EINVAL; - switch (cmd) - { - case LKM_E_LOAD: - { /* XXX This works for ONE card on pci0 of a i386 machine! XXX */ - lkmtp->private.lkm_any = &_module; - for (i=0; i<pci_cd.cd_ndevs; i++) - { - struct pci_attach_args pa; - struct device *parent = pci_cd.cd_devs[i]; - if (parent == NULL) continue; /* dead clone? */ - if ((parent->dv_unit)!=0) continue; /* only bus zero */ - /* XXX For machine independence, need: pcibus_attach_args. XXX */ - /* XXX See NetBSD's sys/dev/pci/pci.c/pci_probe_device. XXX */ - /* XXX Why isn't there an LKM network interface module? XXX */ - pa.pa_pc = NULL; /* XXX */ - pa.pa_bus = 0; /* XXX */ - pa.pa_iot = X86_BUS_SPACE_IO; /* XXX */ - pa.pa_memt = X86_BUS_SPACE_MEM; /* XXX */ - pa.pa_dmat = &pci_bus_dma_tag; /* XXX */ - for (pa.pa_device=0; pa.pa_device<32; pa.pa_device++) /* XXX */ - { - int intr; - pa.pa_function = 0; /* DEC-21140A has function 0 only XXX */ - pa.pa_tag = pci_make_tag(pa.pa_pc, pa.pa_bus, pa.pa_device, 0); - pa.pa_id = pci_conf_read(pa.pa_pc, pa.pa_tag, PCI_ID_REG); - if ((pa.pa_id & 0xFFFF) == 0xFFFF) continue; - if ((pa.pa_id & 0xFFFF) == 0) continue; - /* XXX this only works for pci0 -- no swizzelling XXX */ - pa.pa_intrswiz = 0; - pa.pa_intrtag = pa.pa_tag; - intr = pci_conf_read(pa.pa_pc, pa.pa_tag, PCI_INTERRUPT_REG); - pa.pa_intrline = PCI_INTERRUPT_LINE(intr); - pa.pa_intrpin = ((PCI_INTERRUPT_PIN(intr) -1) % 4) +1; - if (obsd_match(parent, &lmc_cfdata, &pa)) - config_attach(parent, &lmc_cfdata, &pa, pciprint); - /* config_attach doesn't return on failure; it calls panic. */ - } - } - break; - } - case LKM_E_UNLOAD: - { - for (i=lmc_cd.cd_ndevs-1; i>=0; i--) - { - struct device *dev = lmc_cd.cd_devs[i]; - if (dev == NULL) continue; - if ((error = config_detach(dev, 0))) - printf("%s: config_detach() failed; error %d\n", dev->dv_xname, error); - } - break; - } - case LKM_E_STAT: - break; - } - - return error; - } - -#endif /* __OpenBSD__ */ /* This is the I/O configuration interface for BSD/OS. */ -#ifdef __bsdi__ - -static int -bsdi_match(pci_devaddr_t *pa) - { - u_int32_t cfid = pci_inl(pa, TLP_CFID); - u_int32_t csid = pci_inl(pa, TLP_CSID); - - /* Looking for a DEC 21140A chip on any Lan Media Corp card. */ - if (cfid != TLP_CFID_TULIP) return 0; - switch (csid) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - case TLP_CSID_T3: - case TLP_CSID_SSI: - case TLP_CSID_T1E1: - return 1; - default: - return 0; - } - } - -static int -bsdi_probe(struct device *parent, struct cfdata *cf, void *aux) - { - struct isa_attach_args *ia = aux; - pci_devaddr_t *pa = NULL; - pci_devres_t res; - - /* This must be a PCI bus. */ - if (ia->ia_bustype != BUS_PCI) return 0; - - /* Scan PCI bus for our boards. */ - if ((pa = pci_scan(bsdi_match)) == 0) return 0; - - /* Scan config space for IO and MEM base registers and IRQ info. */ - pci_getres(pa, &res, 1, ia); - - /* Crucial: pass pci_devaddr to bsdi_attach in ia_aux. */ - ia->ia_aux = (void *)pa; - - return 1; - } - -static void -bsdi_attach(struct device *parent, struct device *self, void *aux) - { - softc_t *sc = (softc_t *)self; /* device is first in softc */ - struct isa_attach_args *ia = aux; - pci_devaddr_t *pa = ia->ia_aux; /* this is crucial! */ - int error; - - /* READ/WRITE_PCI_CFG need this. */ - sc->cfgbase = *pa; - - /* What kind of card are we driving? */ - switch (READ_PCI_CFG(sc, TLP_CSID)) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - sc->dev_desc = HSSI_DESC; - sc->card = &hssi_card; - break; - case TLP_CSID_T3: - sc->dev_desc = T3_DESC; - sc->card = &t3_card; - break; - case TLP_CSID_SSI: - sc->dev_desc = SSI_DESC; - sc->card = &ssi_card; - break; - case TLP_CSID_T1E1: - sc->dev_desc = T1E1_DESC; - sc->card = &t1_card; - break; - default: - return; - } - printf(": %s\n", sc->dev_desc); - - /* Allocate PCI memory or IO resources to access the Tulip chip CSRs. */ - sc->csr_iobase = ia->ia_iobase; - sc->csr_membase = (u_int32_t *)mapphys((vm_offset_t)ia->ia_maddr, TLP_CSR_SIZE); - - /* Attach to the PCI bus. */ - isa_establish(&sc->id, &sc->dev); - - /* Allocate PCI interrupt resources for the card. */ - sc->ih.ih_fun = bsd_interrupt; - sc->ih.ih_arg = sc; - intr_establish(ia->ia_irq, &sc->ih, DV_NET); - - /* Install a shutdown hook. */ - sc->ats.func = shutdown_card; - sc->ats.arg = sc; - atshutdown(&sc->ats, ATSH_ADD); - - /* Initialize the top-half and bottom-half locks. */ - simple_lock_init(&sc->top_lock); - simple_lock_init(&sc->bottom_lock); - - /* Start the card and attach a kernel interface and line protocol. */ - if ((error = attach_card(sc, ""))) detach_card(sc); - } - -struct cfdriver lmccd = - { - .cd_devs = NULL, - .cd_name = DEVICE_NAME, - .cd_match = bsdi_probe, - .cd_attach = bsdi_attach, - .cd_class = DV_IFNET, - .cd_devsize = sizeof(softc_t), - }; -#endif /* __bsdi__ */ - -#ifdef __linux__ - -/* The kernel calls this procedure when an interrupt happens. */ -static irqreturn_t -linux_interrupt(int irq, void *dev, struct pt_regs *regs) - { - struct net_device *net_dev = dev; - softc_t *sc = dev_to_hdlc(net_dev)->priv; - - /* Cut losses early if this is not our interrupt. */ - if ((READ_CSR(TLP_STATUS) & TLP_INT_TXRX) == 0) - return IRQ_NONE; - - /* Disable card interrupts. */ - WRITE_CSR(TLP_INT_ENBL, TLP_INT_DISABLE); - - /* Handle the card interrupt with the dev->poll method. */ - if (netif_rx_schedule_prep(net_dev)) - __netif_rx_schedule(net_dev); /* NAPI - add to poll list */ - else - printk("%s: interrupt while on poll list\n", NAME_UNIT); - - return IRQ_HANDLED; - } - -/* This net_device method services interrupts in a softirq. */ -/* With rxintr_cleanup(), it implements input flow control. */ -static int -linux_poll(struct net_device *net_dev, int *budget) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - int received; - - /* Yes, we do NAPI. */ - /* Allow processing up to net_dev->quota incoming packets. */ - /* This is the ONLY time core_interrupt() may process rx pkts. */ - /* Otherwise (sc->quota == 0) and rxintr_cleanup() is a NOOP. */ - sc->quota = net_dev->quota; - - /* Handle the card interrupt with kernel ints enabled. */ - /* Process rx pkts (and tx pkts, too). */ - /* Card interrupts are disabled. */ - core_interrupt(sc, 0); - - /* Report number of rx packets processed. */ - received = net_dev->quota - sc->quota; - net_dev->quota -= received; - *budget -= received; - - /* if quota prevented processing all rx pkts, leave rx ints disabled */ - if (sc->quota == 0) /* this is off by one...but harmless */ - { - WRITE_CSR(TLP_INT_ENBL, TLP_INT_TX); - return 1; /* more pkts to handle -- reschedule */ - } - - sc->quota = 0; /* disable rx pkt processing by rxintr_cleanup() */ - netif_rx_complete(net_dev); /* NAPI - remove from poll list */ - - /* Enable card interrupts. */ - WRITE_CSR(TLP_INT_ENBL, TLP_INT_TXRX); - return 0; - } - -/* These next routines are similar to BSD's ifnet kernel/driver interface. */ - -/* This net_device method hands outgoing packets to the transmitter. */ -/* With txintr_setup(), it implements output flow control. */ -/* Called from a syscall (user context; no spinlocks). */ -static int -linux_start(struct sk_buff *skb, struct net_device *net_dev) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - - if (sc->tx_skb == NULL) - { - /* Put this skb where the transmitter will see it. */ - sc->tx_skb = skb; - - /* Start the transmitter; incoming pkts are NOT processed. */ - user_interrupt(sc, 0); - - /* If the tx didn't take the skb then stop the queue. */ - /* This can happen if another CPU is in core_interrupt(). */ - if (sc->tx_skb != NULL) netif_stop_queue(net_dev); - - return 0; - } - - /* This shouldn't happen; skb is NOT consumed. */ - if (netif_queue_stopped(net_dev)) - printk("%s: dev->start() called with queue stopped\n", NAME_UNIT); - else - netif_stop_queue(net_dev); - - return 1; - } - -/* This net_device method restarts the transmitter if it hangs. */ -/* Called from a softirq. */ -static void -linux_timeout(struct net_device *net_dev) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - - /* Start the transmitter; incoming packets are NOT processed. */ - user_interrupt(sc, 1); - } - -/* This net_device method handles IOCTL syscalls. */ -/* Called from a syscall (user context; no spinlocks; can sleep). */ -static int -linux_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - int error = 0; - - if ((cmd >= SIOCDEVPRIVATE) && (cmd <= SIOCDEVPRIVATE+15)) - { - struct iohdr *iohdr = (struct iohdr *)ifr; - u_int16_t direction = iohdr->direction; - u_int16_t length = iohdr->length; - char *user_addr = (char *)iohdr->iohdr; - char *kern_addr; - - if (iohdr->cookie != NGM_LMC_COOKIE) return -EINVAL; - - /* Emulate a BSD-style IOCTL syscall. */ - kern_addr = kmalloc(length, GFP_KERNEL); - if (kern_addr == NULL) - error = -ENOMEM; - if ((error == 0) && ((direction & DIR_IOW) != 0)) - error = copy_from_user(kern_addr, user_addr, length); - if (error == 0) - error = -core_ioctl(sc, (unsigned long)cmd, kern_addr); - if ((error == 0) && ((direction & DIR_IOR) != 0)) - error = copy_to_user(user_addr, kern_addr, length); - kfree(kern_addr); - } -# if GEN_HDLC - else if (cmd == SIOCWANDEV) - { - const size_t size = sizeof(sync_serial_settings); - - switch (ifr->ifr_settings.type) - { - case IF_GET_IFACE: /* get interface config */ - { - ifr->ifr_settings.type = IF_IFACE_SYNC_SERIAL; - if (ifr->ifr_settings.size < size) - { - ifr->ifr_settings.size = size; - error = -ENOBUFS; - } - else - { - if (sc->config.tx_clk_src == CFG_CLKMUX_ST) - sc->hdlc_settings.clock_type = CLOCK_EXT; - if (sc->config.tx_clk_src == CFG_CLKMUX_INT) - sc->hdlc_settings.clock_type = CLOCK_TXINT; - if (sc->config.tx_clk_src == CFG_CLKMUX_RT) - sc->hdlc_settings.clock_type = CLOCK_TXFROMRX; - sc->hdlc_settings.loopback = (sc->config.loop_back != CFG_LOOP_NONE) ? 1:0; - sc->hdlc_settings.clock_rate = sc->status.tx_speed; - error = copy_to_user(ifr->ifr_settings.ifs_ifsu.sync, - &sc->hdlc_settings, size); - } - break; - } - case IF_IFACE_SYNC_SERIAL: /* set interface config */ - { - if (!capable(CAP_NET_ADMIN)) - error = -EPERM; - if (error == 0) - error = copy_from_user(&sc->hdlc_settings, - ifr->ifr_settings.ifs_ifsu.sync, size); - /* hdlc_settings are currently ignored. */ - break; - } - default: /* Pass the rest to the line protocol code. */ - { - error = hdlc_ioctl(net_dev, ifr, cmd); - break; - } - } - } -# endif /* GEN_HDLC */ - else /* unknown IOCTL command */ - error = -EINVAL; - - if (DRIVER_DEBUG) - printk("%s: linux_ioctl; cmd=0x%08x error=%d\n", - NAME_UNIT, cmd, error); - - return error; - } - -/* This net_device method returns a pointer to device statistics. */ -static struct net_device_stats * -linux_stats(struct net_device *net_dev) - { -# if GEN_HDLC - return &dev_to_hdlc(net_dev)->stats; -# else - softc_t *sc = net_dev->priv; - return &sc->net_stats; -# endif - } - -/* Called from a softirq once a second. */ -static void -linux_watchdog(unsigned long softc) - { - softc_t *sc = (softc_t *)softc; - u_int8_t old_oper_status = sc->status.oper_status; - struct event_cntrs *cntrs = &sc->status.cntrs; - struct net_device_stats *stats = linux_stats(sc->net_dev); - - core_watchdog(sc); /* updates oper_status */ - - /* Notice change in link status. */ - if ((old_oper_status != STATUS_UP) && - (sc->status.oper_status == STATUS_UP)) /* link came up */ - { - hdlc_set_carrier(1, sc->net_dev); - netif_wake_queue(sc->net_dev); - } - if ((old_oper_status == STATUS_UP) && - (sc->status.oper_status != STATUS_UP)) /* link went down */ - { - hdlc_set_carrier(0, sc->net_dev); - netif_stop_queue(sc->net_dev); - } - - /* Notice change in line protocol. */ - if (sc->config.line_pkg == PKG_RAWIP) - { - sc->status.line_pkg = PKG_RAWIP; - sc->status.line_prot = PROT_IP_HDLC; - } -# if GEN_HDLC - else - { - sc->status.line_pkg = PKG_GEN_HDLC; - switch (sc->hdlc_dev->proto.id) - { - case IF_PROTO_PPP: - sc->status.line_prot = PROT_PPP; - break; - case IF_PROTO_CISCO: - sc->status.line_prot = PROT_C_HDLC; - break; - case IF_PROTO_FR: - sc->status.line_prot = PROT_FRM_RLY; - break; - case IF_PROTO_HDLC: - sc->status.line_prot = PROT_IP_HDLC; - break; - case IF_PROTO_X25: - sc->status.line_prot = PROT_X25; - break; - case IF_PROTO_HDLC_ETH: - sc->status.line_prot = PROT_ETH_HDLC; - break; - default: - sc->status.line_prot = 0; - break; - } - } -# endif /* GEN_HDLC */ - - /* Copy statistics from sc to net_dev for get_stats(). */ - stats->rx_packets = cntrs->ipackets; - stats->tx_packets = cntrs->opackets; - stats->rx_bytes = cntrs->ibytes; - stats->tx_bytes = cntrs->obytes; - stats->rx_errors = cntrs->ierrors; - stats->tx_errors = cntrs->oerrors; - stats->rx_dropped = cntrs->idiscards; - stats->tx_dropped = cntrs->odiscards; - stats->rx_fifo_errors = cntrs->fifo_over; - stats->tx_fifo_errors = cntrs->fifo_under; - stats->rx_missed_errors = cntrs->missed; - stats->rx_over_errors = cntrs->overruns; - - /* Call this procedure again after one second. */ - sc->wd_timer.expires = jiffies + HZ; /* now plus one second */ - add_timer(&sc->wd_timer); - } - -/* This is the I/O configuration interface for Linux. */ - -/* This net_device method is called when IFF_UP goes false. */ -static int -linux_stop(struct net_device *net_dev) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - - /* Stop the card and detach from the kernel. */ - detach_card(sc); /* doesn't fail */ - - free_irq(net_dev->irq, net_dev); /* doesn't fail */ - - del_timer(&sc->wd_timer); /* return value ignored */ - - return 0; - } - -/* This net_device method is called when IFF_UP goes true. */ -static int -linux_open(struct net_device *net_dev) - { - softc_t *sc = dev_to_hdlc(net_dev)->priv; - int error; - - /* Allocate PCI interrupt resources for the card. */ - if ((error = request_irq(net_dev->irq, &linux_interrupt, SA_SHIRQ, - NAME_UNIT, net_dev))) - { - printk("%s: request_irq() failed; error %d\n", NAME_UNIT, error); - return error; - } - - /* Arrange to call linux_watchdog() once a second. */ - init_timer(&sc->wd_timer); - sc->wd_timer.expires = jiffies + HZ; /* now plus one second */ - sc->wd_timer.function = &linux_watchdog; - sc->wd_timer.data = (unsigned long) sc; - add_timer(&sc->wd_timer); - - /* Start the card and attach a kernel interface and line protocol. */ - if ((error = -attach_card(sc, ""))) - linux_stop(net_dev); - else - { - net_dev->weight = sc->rxring.num_descs; /* input flow control */ - netif_start_queue(net_dev); /* output flow control */ - } - - return error; - } - -# if GEN_HDLC -static int -hdlc_attach(struct net_device *net_dev, - unsigned short encoding, unsigned short parity) - { return 0; } -# endif - -/* This pci_driver method is called during shutdown or module-unload. */ -/* This is called from user context; can sleep; no spinlocks! */ -static void __exit -linux_remove(struct pci_dev *pci_dev) - { - struct net_device *net_dev = (struct net_device *)pci_get_drvdata(pci_dev); - softc_t *sc = dev_to_hdlc(net_dev)->priv; - - if (net_dev == NULL) return; - - /* Assume that linux_stop() has already been called. */ - if (sc->flags & FLAG_NETDEV) -# if GEN_HDLC - unregister_hdlc_device(net_dev); -# else - unregister_netdev(net_dev); -# endif - -# if (IOREF_CSR == 0) - if (sc->csr_membase != NULL) - iounmap(sc->csr_membase); -# endif - - pci_disable_device(pci_dev); - - if (sc->csr_iobase != 0) - pci_release_regions(pci_dev); - - pci_set_drvdata(pci_dev, NULL); - - kfree(sc); - free_netdev(net_dev); - } - -static void -setup_netdev(struct net_device *net_dev) - { - /* Initialize the generic network device. */ - /* Note similarity to BSD's lmc_ifnet_attach(). */ - net_dev->flags = IFF_POINTOPOINT; - net_dev->flags |= IFF_RUNNING; - net_dev->open = linux_open; - net_dev->stop = linux_stop; - net_dev->hard_start_xmit = linux_start; - net_dev->do_ioctl = linux_ioctl; - net_dev->get_stats = linux_stats; - net_dev->tx_timeout = linux_timeout; - net_dev->poll = linux_poll; - net_dev->watchdog_timeo = 1 * HZ; - net_dev->tx_queue_len = SNDQ_MAXLEN; - net_dev->mtu = MAX_DESC_LEN; - net_dev->type = ARPHRD_RAWHDLC; -/* The receiver generates frag-lists for packets >4032 bytes. */ -/* The transmitter accepts scatter/gather lists and frag-lists. */ -/* However Linux linearizes outgoing packets since our hardware */ -/* doesn't compute soft checksums. All that work for nothing! */ -/*net_dev->features |= NETIF_F_SG; */ -/*net_dev->features |= NETIF_F_FRAGLIST; */ - } - -/* This pci_driver method is called during boot or module-load. */ -/* This is called from user context; can sleep; no spinlocks! */ -static int __init -linux_probe(struct pci_dev *pci_dev, const struct pci_device_id *id) - { - u_int32_t cfid, csid; - struct net_device *net_dev; - softc_t *sc; - int error; - - /* Looking for a DEC 21140A chip on any Lan Media Corp card. */ - pci_read_config_dword(pci_dev, TLP_CFID, &cfid); - if (cfid != TLP_CFID_TULIP) return -ENXIO; - pci_read_config_dword(pci_dev, TLP_CSID, &csid); - switch (csid) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - case TLP_CSID_T3: - case TLP_CSID_SSI: - case TLP_CSID_T1E1: - break; - default: - return -ENXIO; - } - - /* Declare that these cards use 32-bit single-address PCI cycles. */ - if ((error = pci_set_dma_mask(pci_dev, DMA_32BIT_MASK))) - { - printk("%s: pci_set_dma_mask() failed; error %d\n", DEVICE_NAME, error); - return error; - } - pci_set_consistent_dma_mask(pci_dev, DMA_32BIT_MASK); /* can't fail */ - -# if GEN_HDLC /* generic-hdlc line protocols */ - - /* device driver instance data, aka Soft Context or sc */ - if ((sc = kmalloc(sizeof(softc_t), GFP_KERNEL)) == NULL) - { - printk("%s: kmalloc() failed\n", DEVICE_NAME); - return -ENOMEM; - } - memset(sc, 0, sizeof(softc_t)); - - /* Allocate space for the HDLC network device struct. */ - if ((net_dev = alloc_hdlcdev(sc)) == NULL) - { - printk("%s: alloc_hdlcdev() failed\n", DEVICE_NAME); - kfree(sc); - return -ENOMEM; - } - - /* Initialize the network device struct. */ - setup_netdev(net_dev); - - /* Initialize the HDLC extension to the network device. */ - sc->hdlc_dev = dev_to_hdlc(net_dev); - sc->hdlc_dev->attach = hdlc_attach; /* noop for this driver */ - sc->hdlc_dev->xmit = linux_start; /* the REAL hard_start_xmit() */ - -# else /* GEN_HDLC */ /* no line protocol. */ - - /* Allocate space for the bare network device struct. */ - net_dev = alloc_netdev(sizeof(softc_t), DEVICE_NAME"%d", setup_netdev); - if (net_dev == NULL) - { - printk("%s: alloc_netdev() failed\n", DEVICE_NAME); - return -ENOMEM; - } - /* device driver instance data, aka Soft Context or sc */ - sc = net_dev->priv; - -# endif /* GEN_HDLC */ - - sc->net_dev = net_dev; /* NAME_UNIT macro needs this */ - sc->pci_dev = pci_dev; /* READ/WRITE_PCI_CFG macros need this */ - - /* Cross-link pci_dev and net_dev. */ - pci_set_drvdata(pci_dev, net_dev); /* pci_dev->driver_data = net_dev */ - SET_NETDEV_DEV(net_dev, &pci_dev->dev); /* net_dev->class_dev.dev = &pci_dev->dev */ - SET_MODULE_OWNER(net_dev); /* ??? NOOP in linux-2.6.3. ??? */ - - /* Sets cfcs.io and cfcs.mem; sets pci_dev->irq based on cfit.int */ - if ((error = pci_enable_device(pci_dev))) - { - printk("%s: pci_enable_device() failed; error %d\n", DEVICE_NAME, error); - linux_remove(pci_dev); - return error; - } - net_dev->irq = pci_dev->irq; /* linux_open/stop need this */ - - /* Allocate PCI memory and IO resources to access the Tulip chip CSRs. */ - if ((error = pci_request_regions(pci_dev, DEVICE_NAME))) - { - printk("%s: pci_request_regions() failed; error %d\n", DEVICE_NAME, error); - linux_remove(pci_dev); - return error; - } - net_dev->base_addr = pci_resource_start(pci_dev, 0); - net_dev->mem_start = pci_resource_start(pci_dev, 1); - net_dev->mem_end = pci_resource_end(pci_dev, 1); - sc->csr_iobase = net_dev->base_addr; - -# if (IOREF_CSR == 0) - sc->csr_membase = ioremap_nocache(net_dev->mem_start, TLP_CSR_SIZE); - if (sc->csr_membase == NULL) - { - printk("%s: ioremap_nocache() failed\n", DEVICE_NAME); - linux_remove(pci_dev); - return -EFAULT; - } -# endif - - /* Sets cfcs.master, enabling PCI DMA; checks latency timer value. */ - pci_set_master(pci_dev); /* Later, attach_card() does this too. */ - - /* Initialize the top-half and bottom-half locks. */ - /* Top_lock must be initialized before net_dev is registered. */ - init_MUTEX(&sc->top_lock); - spin_lock_init(&sc->bottom_lock); - -# if GEN_HDLC - if ((error = register_hdlc_device(net_dev))) - { - printk("%s: register_hdlc_device() failed; error %d\n", DEVICE_NAME, error); - linux_remove(pci_dev); - return error; - } -# else - if ((error = register_netdev(net_dev))) - { - printk("%s: register_netdev() failed; error %d\n", DEVICE_NAME, error); - linux_remove(pci_dev); - return error; - } -# endif - /* The NAME_UNIT macro now works. Use DEVICE_NAME before this. */ - sc->flags |= FLAG_NETDEV; - - /* What kind of card are we driving? */ - switch (READ_PCI_CFG(sc, TLP_CSID)) - { - case TLP_CSID_HSSI: - case TLP_CSID_HSSIc: - sc->dev_desc = HSSI_DESC; - sc->card = &hssi_card; - break; - case TLP_CSID_T3: - sc->dev_desc = T3_DESC; - sc->card = &t3_card; - break; - case TLP_CSID_SSI: - sc->dev_desc = SSI_DESC; - sc->card = &ssi_card; - break; - case TLP_CSID_T1E1: - sc->dev_desc = T1E1_DESC; - sc->card = &t1_card; - break; - default: /* shouldn't happen! */ - linux_remove(pci_dev); - return -ENXIO; - } - - /* Announce the hardware on the console. */ - printk("%s: <%s> io 0x%04lx/9 mem 0x%08lx/25 rom 0x%08lx/14 irq %d pci %s\n", - NAME_UNIT, sc->dev_desc, pci_resource_start(pci_dev, 0), - pci_resource_start(pci_dev, 1), pci_resource_start(pci_dev, 6), - pci_dev->irq, pci_name(pci_dev)); - - return 0; - } - -/* This pci driver knows how to drive these devices: */ -static __initdata struct pci_device_id pci_device_id_tbl[] = - { - /* Looking for a DEC 21140A chip on any Lan Media Corp card. */ - { 0x1011, 0x0009, 0x1376, PCI_ANY_ID, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0 } - }; -MODULE_DEVICE_TABLE(pci, pci_device_id_tbl); - -static struct pci_driver pci_driver = - { - .name = DEVICE_NAME, - .id_table = pci_device_id_tbl, - .probe = linux_probe, - .remove = __devexit_p(linux_remove), - /* This driver does not suspend and resume. */ - }; - -/* This ultimately calls our pci_driver.probe() method. */ -static int __init linux_modload(void) - { return pci_module_init(&pci_driver); } -module_init(linux_modload); - -/* This ultimately calls our pci_driver.remove() method. */ -static void __exit linux_modunload(void) - { pci_unregister_driver(&pci_driver); } -module_exit(linux_modunload); - -MODULE_LICENSE("Dual BSD/GPL"); -MODULE_DESCRIPTION("Device driver for SBE/LMC Wide-Area Network cards"); -MODULE_AUTHOR("David Boggs <boggs@boggs.palo-alto.ca.us>"); -#endif /* __linux__ */ diff --git a/sys/dev/lmc/if_lmc.h b/sys/dev/lmc/if_lmc.h index e89c739..fe4e7d0 100644 --- a/sys/dev/lmc/if_lmc.h +++ b/sys/dev/lmc/if_lmc.h @@ -620,13 +620,6 @@ # define LMCIOCREAD _IOWR('i', 243, struct ioctl) # define LMCIOCWRITE _IOW('i', 244, struct ioctl) # define LMCIOCTL _IOWR('i', 245, struct ioctl) -#elif defined(__linux__) /* sigh */ -# define LMCIOCGSTAT SIOCDEVPRIVATE+0 -# define LMCIOCGCFG SIOCDEVPRIVATE+1 -# define LMCIOCSCFG SIOCDEVPRIVATE+2 -# define LMCIOCREAD SIOCDEVPRIVATE+3 -# define LMCIOCWRITE SIOCDEVPRIVATE+4 -# define LMCIOCTL SIOCDEVPRIVATE+5 #endif struct iohdr /* all LMCIOCs begin with this */ @@ -984,12 +977,8 @@ struct dma_desc #endif u_int32_t address1; /* buffer1 bus address */ u_int32_t address2; /* buffer2 bus address */ -#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) bus_dmamap_t map; /* bus dmamap for this descriptor */ # define TLP_BUS_DSL_VAL (sizeof(bus_dmamap_t) & TLP_BUS_DSL) -#else -# define TLP_BUS_DSL_VAL 0 -#endif } __attribute__ ((packed)); /* Tulip DMA descriptor status bits */ @@ -1029,18 +1018,13 @@ struct desc_ring u_int32_t dma_addr; /* bus address for desc array */ int size_descs; /* bus_dmamap_sync needs this */ int num_descs; /* used to set rx quota */ -#ifdef __linux__ - struct sk_buff *head; /* tail-queue of skbuffs */ - struct sk_buff *tail; -#elif BSD +#if BSD struct mbuf *head; /* tail-queue of mbufs */ struct mbuf *tail; -# if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) bus_dma_tag_t tag; /* bus_dma tag for desc array */ bus_dmamap_t map; /* bus_dma map for desc array */ bus_dma_segment_t segs[2]; /* bus_dmamap_load() or bus_dmamem_alloc() */ int nsegs; /* bus_dmamap_load() or bus_dmamem_alloc() */ -# endif #endif }; @@ -1085,33 +1069,7 @@ struct card /* FreeBSD wants struct ifnet first in the softc. */ struct softc { -#if (defined(__NetBSD__) || defined(__OpenBSD__)) - struct device dev; /* base device -- must be first in softc */ - pcitag_t pa_tag; /* pci_conf_read/write need this */ - pci_chipset_tag_t pa_pc; /* pci_conf_read/write need this */ - bus_dma_tag_t pa_dmat; /* bus_dma needs this */ - bus_space_tag_t csr_tag; /* bus_space needs this */ - bus_space_handle_t csr_handle;/* bus_space needs this */ - pci_intr_handle_t intr_handle;/* interrupt handle */ - void *irq_cookie; /* pci_intr_disestablish needs this */ - void *sdh_cookie; /* shutdownhook_disestablish needs this */ - struct simplelock top_lock; /* lock card->watchdog vs core_ioctl */ - struct simplelock bottom_lock;/* lock for buf queues & descriptor rings */ - struct mbuf *tx_mbuf; /* hang mbuf here while building dma descs */ -#endif /* __NetBSD__ || __OpenBSD__ */ - -#ifdef __bsdi__ - struct device dev; /* base device -- must be first in softc */ - struct isadev id; /* bus resource */ - struct intrhand ih; /* interrupt vectoring */ - struct atshutdown ats; /* shutdown hook */ - pci_devaddr_t cfgbase; /* base address of PCI config regs */ - u_int16_t csr_iobase; /* io base address of Tulip CSRs */ - u_int32_t *csr_membase; /* kv mem base address of Tulip CSRs */ - struct simplelock top_lock; /* lock card->watchdog vs core_ioctl */ - struct simplelock bottom_lock;/* lock for buf queues & descriptor rings */ - struct mbuf *tx_mbuf; /* hang mbuf here while building dma descs */ -#endif /* __bsdi__ */ + /* State for kernel-resident Line Protocols */ #if IFNET @@ -1130,14 +1088,6 @@ struct softc # endif #endif -#ifdef __linux__ -# if GEN_HDLC - hdlc_device *hdlc_dev; /* state for HDLC code */ - sync_serial_settings hdlc_settings; /* state set by sethdlc program */ -# else - struct net_device_stats net_stats; /* linux_stats storage */ -# endif -#endif #if NETGRAPH node_p ng_node; /* pointer to our node struct */ @@ -1151,7 +1101,6 @@ struct softc # endif #endif -#ifdef __FreeBSD__ struct callout callout; /* watchdog needs this */ struct device *dev; /* base device pointer */ bus_space_tag_t csr_tag; /* bus_space needs this */ @@ -1173,19 +1122,7 @@ struct softc int top_spl; /* lock card->watchdog vs core_ioctl */ int bottom_spl; /* lock for buf queues & descriptor rings */ # endif -#endif /* __FreeBSD__ */ - -#ifdef __linux__ - struct pci_dev *pci_dev; /* READ/WRITE_PCI_CFG macros need this */ - struct net_device *net_dev; /* NAME_UNIT macro needs this */ - struct timer_list wd_timer; /* timer calls watchdog() once a second */ - u_int32_t csr_iobase; /* io base address of Tulip CSRs */ - void *csr_membase; /* kv mem base address of Tulip CSRs */ - struct sk_buff *tx_skb; /* hang skb here while building dma descs */ - int quota; /* used for incoming packet flow control */ - struct semaphore top_lock; /* lock card->watchdog vs core_ioctl */ - spinlock_t bottom_lock; /* lock for buf queues & descriptor rings */ -#endif /* __linux__ */ + /* Top-half state used by all card types; lock with top_lock, */ const char *dev_desc; /* string describing type of board */ @@ -1210,7 +1147,6 @@ struct softc /* Hide the minor differences between OS versions */ -#ifdef __FreeBSD__ typedef void intr_return_t; # define READ_PCI_CFG(sc, addr) pci_read_config ((sc)->dev, addr, 4) # define WRITE_PCI_CFG(sc, addr, data) pci_write_config((sc)->dev, addr, data, 4) @@ -1264,162 +1200,10 @@ struct softc # if (__FreeBSD_version >= 600000) # define IFF_RUNNING IFF_DRV_RUNNING # endif -#endif /* __FreeBSD__ */ -#ifdef __NetBSD__ - typedef int intr_return_t; -# define READ_PCI_CFG(sc, addr) pci_conf_read ((sc)->pa_pc, (sc)->pa_tag, addr) -# define WRITE_PCI_CFG(sc, addr, data) pci_conf_write((sc)->pa_pc, (sc)->pa_tag, addr, data) -# define READ_CSR(csr) bus_space_read_4 (sc->csr_tag, sc->csr_handle, csr) -# define WRITE_CSR(csr, val) bus_space_write_4(sc->csr_tag, sc->csr_handle, csr, val) -# define NAME_UNIT sc->dev.dv_xname -# define DRIVER_DEBUG ((sc->config.debug) || (sc->ifp->if_flags & IFF_DEBUG)) -# define TOP_TRYLOCK simple_lock_try(&sc->top_lock) -# define TOP_UNLOCK simple_unlock (&sc->top_lock) -# define BOTTOM_TRYLOCK simple_lock_try(&sc->bottom_lock) -# define BOTTOM_UNLOCK simple_unlock (&sc->bottom_lock) -# define CHECK_CAP suser(curproc->p_ucred, &curproc->p_acflag) -# define DISABLE_INTR int spl = splnet() -# define ENABLE_INTR splx(spl) -# define IRQ_NONE 0 -# define IRQ_HANDLED 1 -# define IFP2SC(ifp) (ifp)->if_softc -# define COPY_BREAK MHLEN -# define SLEEP(usecs) tsleep(sc, PCATCH | PZERO, DEVICE_NAME, 1+(usecs/tick)) -# define DMA_SYNC(map, size, flags) bus_dmamap_sync(ring->tag, map, 0, size, flags) -# define DMA_LOAD(map, addr, size) bus_dmamap_load(ring->tag, map, addr, size, 0, BUS_DMA_NOWAIT) -# if (NBPFILTER != 0) -# define LMC_BPF_MTAP(mbuf) if (sc->ifp->if_bpf) bpf_mtap(sc->ifp->if_bpf, mbuf) -# define LMC_BPF_ATTACH(dlt, len) bpfattach(sc->ifp, dlt, len) -# define LMC_BPF_DETACH bpfdetach(sc->ifp) -# endif -#endif /* __NetBSD__ */ -#ifdef __OpenBSD__ - typedef int intr_return_t; -# define READ_PCI_CFG(sc, addr) pci_conf_read ((sc)->pa_pc, (sc)->pa_tag, addr) -# define WRITE_PCI_CFG(sc, addr, data) pci_conf_write((sc)->pa_pc, (sc)->pa_tag, addr, data) -# define READ_CSR(csr) bus_space_read_4 (sc->csr_tag, sc->csr_handle, csr) -# define WRITE_CSR(csr, val) bus_space_write_4(sc->csr_tag, sc->csr_handle, csr, val) -# define NAME_UNIT sc->dev.dv_xname -# define DRIVER_DEBUG ((sc->config.debug) || (sc->ifp->if_flags & IFF_DEBUG)) -# define TOP_TRYLOCK simple_lock_try(&sc->top_lock) -# define TOP_UNLOCK simple_unlock (&sc->top_lock) -# define BOTTOM_TRYLOCK simple_lock_try(&sc->bottom_lock) -# define BOTTOM_UNLOCK simple_unlock (&sc->bottom_lock) -# define CHECK_CAP suser(curproc, 0) -# define DISABLE_INTR int spl = splnet() -# define ENABLE_INTR splx(spl) -# define IRQ_NONE 0 -# define IRQ_HANDLED 1 -# define IFP2SC(ifp) (ifp)->if_softc -# define COPY_BREAK MHLEN -# define SLEEP(usecs) tsleep(sc, PCATCH | PZERO, DEVICE_NAME, 1+(usecs/tick)) -# define DMA_SYNC(map, size, flags) bus_dmamap_sync(ring->tag, map, 0, size, flags) -# define DMA_LOAD(map, addr, size) bus_dmamap_load(ring->tag, map, addr, size, 0, BUS_DMA_NOWAIT) -# if (NBPFILTER != 0) -# define LMC_BPF_MTAP(mbuf) if (sc->ifp->if_bpf) bpf_mtap(sc->ifp->if_bpf, mbuf) -# define LMC_BPF_ATTACH(dlt, len) bpfattach(&sc->ifp->if_bpf, sc->ifp, dlt, len) -# define LMC_BPF_DETACH bpfdetach(sc->ifp) -# endif -#endif /* __OpenBSD__ */ - -#ifdef __bsdi__ - typedef int intr_return_t; -# define READ_PCI_CFG(sc, addr) pci_inl(&(sc)->cfgbase, addr) -# define WRITE_PCI_CFG(sc, addr, data) pci_outl(&(sc)->cfgbase, addr, data) -# if IOREF_CSR -# define READ_CSR(csr) inl(sc->csr_iobase+(csr)) -# define WRITE_CSR(csr, val) outl(sc->csr_iobase+(csr), (val)) -# else -# error Memory refs to Tulip CSRs cause page faults in BSD/OS -# define READ_CSR(csr) (0 + *(sc->csr_membase+(csr))) -# define WRITE_CSR(csr, val) ((void)(*(sc->csr_membase+(csr)) = (val))) -# endif -# define NAME_UNIT sc->dev.dv_xname -# define DRIVER_DEBUG ((sc->config.debug) || (sc->ifp->if_flags & IFF_DEBUG)) -# define TOP_TRYLOCK simple_lock_try(&sc->top_lock) -# define TOP_UNLOCK simple_unlock (&sc->top_lock) -# define BOTTOM_TRYLOCK simple_lock_try(&sc->bottom_lock) -# define BOTTOM_UNLOCK simple_unlock (&sc->bottom_lock) -# define CHECK_CAP suser(PCPU(curproc)->p_ucred, &PCPU(curproc)->p_acflag) -# define DISABLE_INTR int spl = splimp() -# define ENABLE_INTR splx(spl) -# define IRQ_NONE 1 /* XXX 0 */ -# define IRQ_HANDLED 1 -# define IFP2SC(ifp) (ifp)->if_softc -# define COPY_BREAK MHLEN -# define SLEEP(usecs) tsleep(sc, PCATCH | PZERO, DEVICE_NAME, 1+(usecs/tick)) -# define DMA_SYNC(map, size, flags) /* nothing */ -# define DMA_LOAD(map, addr, size) 0 -# define bus_dmamap_unload(tag, map) /* nothing */ -# define bus_dmamap_destroy(tag, map) /* nothing */ -# if (NBPFILTER != 0) -# define LMC_BPF_MTAP(mbuf) if (sc->ifp->if_bpf) bpf_mtap(sc->ifp->if_bpf, mbuf) -# define LMC_BPF_ATTACH(dlt, len) bpfattach(&sc->ifp->if_bpf, sc->ifp, dlt, len) -# define LMC_BPF_DETACH /* bpfdetach(sc->ifp) */ -# endif -# define memcpy(dst, src, len) bcopy(src, dst, len) -# define if_detach(ifp) /* nothing */ - -/* BSD/OS-4.1 doesn't have a back pointer to softc in struct ifnet, */ -/* and it passes a unit number not a struct ifnet* to watchdog. */ -# if (_BSDI_VERSION <= 199910) - extern struct cfdriver lmccd; -# undef IFP2SC -# define UNIT2SC(unit) ((softc_t *)lmccd.cd_devs[unit]) -# define IFP2SC(ifp) (UNIT2SC((ifp)->if_unit)) -# endif -#endif /* __bsdi__ */ -#ifdef __linux__ -static u_int32_t /* inline? so rare it doesn't matter */ -READ_PCI_CFG(softc_t *sc, u_int32_t addr) - { - u_int32_t data; - pci_read_config_dword(sc->pci_dev, addr, &data); - return data; - } -# define WRITE_PCI_CFG(sc, addr, data) pci_write_config_dword(sc->pci_dev, addr, data) -# if IOREF_CSR -# define READ_CSR(csr) inl((sc->csr_iobase+(csr))) -# define WRITE_CSR(csr, val) outl((val),(sc->csr_iobase+(csr))) -# else -# define READ_CSR(csr) readl((sc->csr_membase+(csr))) -# define WRITE_CSR(csr, val) writel((val),(sc->csr_membase+(csr))) -# endif -# define NAME_UNIT sc->net_dev->name -# define DRIVER_DEBUG ((sc->config.debug) || (sc->net_dev->flags & IFF_DEBUG)) -# define TOP_TRYLOCK ((down_trylock(&sc->top_lock)==0) ? 1:0) -# define TOP_UNLOCK up(&sc->top_lock) -# define BOTTOM_TRYLOCK spin_trylock_bh(&sc->bottom_lock) -# define BOTTOM_UNLOCK spin_unlock_bh(&sc->bottom_lock) -# define CHECK_CAP capable(CAP_NET_ADMIN)? 0 : -EPERM -# define DISABLE_INTR /* nothing */ -# define ENABLE_INTR /* nothing */ -# define COPY_BREAK 200 -# define DELAY(usecs) udelay(usecs) -# define SLEEP(usecs) do { set_current_state(TASK_INTERRUPTIBLE);\ - schedule_timeout(1+(usecs*HZ)/1000000UL); } while (0) -# define printf printk -# define copyin(u, k, len) copy_from_user(k, u, len) -# define microtime(time) do_gettimeofday(time) -# define malloc(len, t, f) kmalloc(len, GFP_KERNEL) -# define free(addr, t) kfree(addr) -# define LITTLE_ENDIAN 4321 -# define BIG_ENDIAN 1234 -# if defined(__LITTLE_ENDIAN) -# define BYTE_ORDER LITTLE_ENDIAN -# elif defined(__BIG_ENDIAN) -# define BYTE_ORDER BIG_ENDIAN -# else -# error "asm/byteorder.h is wrong" -# endif -# if (GEN_HDLC == 0) -# define dev_to_hdlc(net_dev) net_dev -# define hdlc_set_carrier(val, net_dev) /* nothing */ -# endif -#endif /* __linux__ */ + #if (NBPFILTER == 0) # define LMC_BPF_MTAP(mbuf) /* nothing */ @@ -1541,9 +1325,7 @@ static void lmc_raw_input(struct ifnet *, struct mbuf *); #if BSD static void mbuf_enqueue(struct desc_ring *, struct mbuf *); static struct mbuf* mbuf_dequeue(struct desc_ring *); -# ifdef __FreeBSD__ static void fbsd_dmamap_load(void *, bus_dma_segment_t *, int, int); -# endif static int create_ring(softc_t *, struct desc_ring *, int); static void destroy_ring(softc_t *, struct desc_ring *); static int rxintr_cleanup(softc_t *); @@ -1553,18 +1335,6 @@ static int txintr_setup_mbuf(softc_t *, struct mbuf *); static int txintr_setup(softc_t *); #endif /* BSD */ -#ifdef __linux__ -static void skbuff_enqueue(struct desc_ring *, struct sk_buff *); -static struct sk_buff* skbuff_dequeue(struct desc_ring *); -static int create_ring(softc_t *, struct desc_ring *, int); -static void destroy_ring(softc_t *, struct desc_ring *); -static int rxintr_cleanup(softc_t *); -static int rxintr_setup(softc_t *); -static int txintr_cleanup(softc_t *sc); -static int txintr_setup_frag(softc_t *, char *, int); -static int txintr_setup_skb(softc_t *, struct sk_buff *); -static int txintr_setup(softc_t *); -#endif /* __linux__ */ static void check_intr_status(softc_t *); static void core_interrupt(void *, int); @@ -1596,10 +1366,6 @@ static int lmc_ifnet_ioctl(struct ifnet *, u_long, caddr_t); static void lmc_ifnet_start(struct ifnet *); static int lmc_raw_output(struct ifnet *, struct mbuf *, const struct sockaddr *, struct route *); -# ifdef __OpenBSD__ -static int ifmedia_change(struct ifnet *); -static void ifmedia_status(struct ifnet *, struct ifmediareq *); -# endif /* __OpenBSD__ */ static void setup_ifnet(struct ifnet *); static int lmc_ifnet_attach(softc_t *); static void lmc_ifnet_detach(softc_t *); @@ -1638,52 +1404,14 @@ static void shutdown_card(void *); static int attach_card(softc_t *, const char *); static void detach_card(softc_t *); -#ifdef __FreeBSD__ static int fbsd_probe(device_t); static int fbsd_detach(device_t); static int fbsd_shutdown(device_t); static int fbsd_attach(device_t); -#endif /* __FreeBSD__ */ - -#ifdef __NetBSD__ -static int nbsd_match(struct device *t, struct cfdata *, void *); -static int nbsd_detach(struct device *, int); -static void nbsd_attach(struct device *, struct device *, void *); -static int lkm_nbsd_match(struct pci_attach_args *); -int if_lmc_lkmentry(struct lkm_table *, int, int); -#endif /* __NetBSD__ */ - -#ifdef __OpenBSD__ -static int obsd_match(struct device *, void *, void *); -static int obsd_detach(struct device *, int); -static void obsd_attach(struct device *, struct device *, void *); -int if_lmc_lkmentry(struct lkm_table *, int, int); -#endif /* __OpenBSD__ */ - -#ifdef __bsdi__ -static int bsdi_match(pci_devaddr_t *); -static int bsdi_probe(struct device *, struct cfdata *, void *); -static void bsdi_attach(struct device *, struct device *, void *); -#endif /* __bsdi__ */ - -#ifdef __linux__ -static irqreturn_t linux_interrupt(int, void *, struct pt_regs *); -static int linux_poll(struct net_device *, int *); -static int linux_start(struct sk_buff *, struct net_device *); -static void linux_timeout(struct net_device *); -static int linux_ioctl(struct net_device *, struct ifreq *, int); -static struct net_device_stats * linux_stats(struct net_device *); -static void linux_watchdog(unsigned long); -static int linux_stop(struct net_device *); -static int linux_open(struct net_device *); -# if GEN_HDLC -static int hdlc_attach(struct net_device *, - unsigned short, unsigned short); -# endif -static void __exit linux_remove(struct pci_dev *); -static void setup_netdev(struct net_device *); -static int __init linux_probe(struct pci_dev *, const struct pci_device_id *); -#endif /* __linux__ */ + + + + #endif /* KERNEL */ |