summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorglebius <glebius@FreeBSD.org>2014-09-25 06:47:38 +0000
committerglebius <glebius@FreeBSD.org>2014-09-25 06:47:38 +0000
commit81975cac396888d5c7ad4b7387a895e0bf8e1be6 (patch)
treedf6e7f30f47ea2c2e7f1e56e163031f6d3a6b5bc
parent3b7f2883f6654ddc61c5ae45efe49c45202f22d0 (diff)
downloadFreeBSD-src-81975cac396888d5c7ad4b7387a895e0bf8e1be6.zip
FreeBSD-src-81975cac396888d5c7ad4b7387a895e0bf8e1be6.tar.gz
Run through unifdef(1) with slight hand-editing after. It is obvious,
that the driver is not going to be ever improved in terms of hardware support, it is going to be only maintained as our kernel APIs change. Carrying all the compatibility with ancient versions of NetBSD, OpenBSD, Linux and BSDI, as well as obsoleted FreeBSD versions has no reason.
-rw-r--r--sys/dev/lmc/if_lmc.c2503
-rw-r--r--sys/dev/lmc/if_lmc.h288
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 */
OpenPOWER on IntegriCloud