Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-1-4]: src/sys/dev/pci Pull up revisions 1.6-1.7 (via patch, reque...
details: https://anonhg.NetBSD.org/src/rev/fbafa798074d
branches: netbsd-1-4
changeset: 470537:fbafa798074d
user: he <he%NetBSD.org@localhost>
date: Sun Apr 30 13:07:07 2000 +0000
description:
Pull up revisions 1.6-1.7 (via patch, requested by bouyer):
Fix bug which could result in a panic. Add a shutdown hook to
stop the board to avoid memory corruption on reboot. Use bus_space
for TIGON 2 chips, so that they will work even if we can't map
the memory space linearly (e.g. on alpha).
diffstat:
sys/dev/pci/if_ti.c | 279 ++++++++++++++++-----------------------------------
1 files changed, 88 insertions(+), 191 deletions(-)
diffs (truncated from 526 to 300 lines):
diff -r 6ff935e64a75 -r fbafa798074d sys/dev/pci/if_ti.c
--- a/sys/dev/pci/if_ti.c Sun Apr 30 12:51:05 2000 +0000
+++ b/sys/dev/pci/if_ti.c Sun Apr 30 13:07:07 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ti.c,v 1.1.2.3 1999/10/06 13:29:34 he Exp $ */
+/* $NetBSD: if_ti.c,v 1.1.2.4 2000/04/30 13:07:07 he Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -81,9 +81,6 @@
*/
#include "bpfilter.h"
-#if 0
-#include "vlan.h"
-#endif
#include "opt_inet.h"
#include "opt_ns.h"
@@ -107,13 +104,6 @@
#include <net/bpf.h>
#endif
-#if 0
-#if NVLAN > 0
-#include <net/if_types.h>
-#include <net/if_vlan_var.h>
-#endif
-#endif
-
#ifdef INET
#include <netinet/in.h>
#include <netinet/if_inarp.h>
@@ -124,17 +114,7 @@
#include <netns/ns_if.h>
#endif
-#if 0
-#include <vm/vm.h> /* for vtophys */
-#include <vm/pmap.h> /* for vtophys */
-#include <machine/clock.h> /* for DELAY */
-#endif
#include <machine/bus.h>
-#if 0
-#include <machine/resource.h>
-#include <sys/bus.h>
-#include <sys/rman.h>
-#endif
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
@@ -166,11 +146,10 @@
{ 0, 0, NULL }
};
+static struct ti_type *ti_type_match __P((struct pci_attach_args *));
static int ti_probe __P((struct device *, struct cfdata *, void *));
static void ti_attach __P((struct device *, struct device *, void *));
-#if 0
-static int ti_detach __P((device_t));
-#endif
+static void ti_shutdown __P((void *));
static void ti_txeof __P((struct ti_softc *));
static void ti_rxeof __P((struct ti_softc *));
@@ -185,9 +164,6 @@
static void ti_init2 __P((struct ti_softc *));
static void ti_stop __P((struct ti_softc *));
static void ti_watchdog __P((struct ifnet *));
-#if 0
-static void ti_shutdown __P((device_t));
-#endif
static int ti_ifmedia_upd __P((struct ifnet *));
static void ti_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
@@ -210,9 +186,6 @@
static int ti_alloc_jumbo_mem __P((struct ti_softc *));
static void *ti_jalloc __P((struct ti_softc *));
static void ti_jfree __P((caddr_t, u_int, void *));
-#if 0
-static void ti_jref __P((caddr_t, u_int));
-#endif
static int ti_newbuf_std __P((struct ti_softc *, int, struct mbuf *, bus_dmamap_t));
static int ti_newbuf_mini __P((struct ti_softc *, int, struct mbuf *, bus_dmamap_t));
static int ti_newbuf_jumbo __P((struct ti_softc *, int, struct mbuf *));
@@ -387,11 +360,10 @@
caddr_t buf;
{
int segptr, segsize, cnt;
- caddr_t ti_winbase, ptr;
+ caddr_t ptr;
segptr = addr;
cnt = len;
- ti_winbase = (caddr_t)(sc->ti_vhandle + TI_WINDOW);
ptr = buf;
while(cnt) {
@@ -400,12 +372,14 @@
else
segsize = TI_WINLEN - (segptr % TI_WINLEN);
CSR_WRITE_4(sc, TI_WINBASE, (segptr & ~(TI_WINLEN - 1)));
- if (buf == NULL)
- bzero((char *)ti_winbase + (segptr &
- (TI_WINLEN - 1)), segsize);
- else {
- bcopy((char *)ptr, (char *)ti_winbase +
- (segptr & (TI_WINLEN - 1)), segsize);
+ if (buf == NULL) {
+ bus_space_set_region_4(sc->ti_btag, sc->ti_bhandle,
+ TI_WINDOW + (segptr & (TI_WINLEN - 1)), 0,
+ segsize / 4);
+ } else {
+ bus_space_write_region_4(sc->ti_btag, sc->ti_bhandle,
+ TI_WINDOW + (segptr & (TI_WINLEN - 1)),
+ (u_int32_t *)ptr, segsize / 4);
ptr += segsize;
}
segptr += segsize;
@@ -484,9 +458,6 @@
{
u_int32_t index;
- if (sc->ti_rdata->ti_cmd_ring == NULL)
- return;
-
index = sc->ti_cmd_saved_prodidx;
CSR_WRITE_4(sc, TI_GCR_CMDRING + (index * 4), *(u_int32_t *)(cmd));
TI_INC(index, TI_CMD_RING_CNT);
@@ -509,9 +480,6 @@
u_int32_t index;
register int i;
- if (sc->ti_rdata->ti_cmd_ring == NULL)
- return;
-
index = sc->ti_cmd_saved_prodidx;
CSR_WRITE_4(sc, TI_GCR_CMDRING + (index * 4), *(u_int32_t *)(cmd));
TI_INC(index, TI_CMD_RING_CNT);
@@ -711,47 +679,6 @@
return(sc->ti_cdata.ti_jslots[entry->slot].ti_buf);
}
-#if 0
-/*
- * Adjust usage count on a jumbo buffer. In general this doesn't
- * get used much because our jumbo buffers don't get passed around
- * too much, but it's implemented for correctness.
- */
-static void ti_jref(buf, size)
- caddr_t buf;
- u_int size;
-{
- struct ti_softc *sc;
- u_int64_t **aptr;
- register int i;
-
- /* Extract the softc struct pointer. */
- aptr = (u_int64_t **)(buf - sizeof(u_int64_t));
- sc = (struct ti_softc *)(aptr[0]);
-
- if (sc == NULL)
- panic("ti_jref: can't find softc pointer!");
-
- if (size != TI_JUMBO_FRAMELEN)
- panic("ti_jref: adjusting refcount of buf of wrong size!");
-
- /* calculate the slot this buffer belongs to */
-
- i = ((caddr_t)aptr
- - (caddr_t)sc->ti_cdata.ti_jumbo_buf) / TI_JLEN;
-
- if ((i < 0) || (i >= TI_JSLOTS))
- panic("ti_jref: asked to reference buffer "
- "that we don't manage!");
- else if (sc->ti_cdata.ti_jslots[i].ti_inuse == 0)
- panic("ti_jref: buffer already free!");
- else
- sc->ti_cdata.ti_jslots[i].ti_inuse++;
-
- return;
-}
-#endif
-
/*
* Release a jumbo buffer.
*/
@@ -983,9 +910,6 @@
m_new->m_ext.ext_size = TI_JUMBO_FRAMELEN;
m_new->m_ext.ext_free = ti_jfree;
m_new->m_ext.ext_arg = sc;
-#if 0
- m_new->m_ext.ext_ref = ti_jref;
-#endif
MCLINITREFERENCE(m_new);
} else {
m_new = m;
@@ -1532,8 +1456,6 @@
/* Set up the command ring and producer mailbox. */
rcb = &sc->ti_rdata->ti_info.ti_cmd_rcb;
- sc->ti_rdata->ti_cmd_ring =
- (struct ti_cmd_desc *)(sc->ti_vhandle + TI_GCR_CMDRING);
TI_HOSTADDR(rcb->ti_hostaddr) = TI_GCR_NIC_ADDR(TI_GCR_CMDRING);
rcb->ti_flags = 0;
rcb->ti_max_len = 0;
@@ -1670,6 +1592,26 @@
}
/*
+ * look for id in the device list, returning the first match
+ */
+static struct ti_type * ti_type_match(pa)
+ struct pci_attach_args *pa;
+{
+ struct ti_type *t;
+
+ t = ti_devs;
+ while(t->ti_name != NULL) {
+ if ((PCI_VENDOR(pa->pa_id) == t->ti_vid) &&
+ (PCI_PRODUCT(pa->pa_id) == t->ti_did)) {
+ return (t);
+ }
+ t++;
+ }
+
+ return(NULL);
+}
+
+/*
* Probe for a Tigon chip. Check the PCI vendor and device IDs
* against our list and return its name if we find a match.
*/
@@ -1681,24 +1623,15 @@
struct pci_attach_args *pa = aux;
struct ti_type *t;
- t = ti_devs;
+ t = ti_type_match(pa);
- while(t->ti_name != NULL) {
- if ((PCI_VENDOR(pa->pa_id) == t->ti_vid) &&
- (PCI_PRODUCT(pa->pa_id) == t->ti_did)) {
- return(1);
- }
- t++;
- }
-
- return(0);
+ return((t == NULL) ? 0 : 1);
}
static void ti_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
{
- int s;
u_int32_t command;
struct ifnet *ifp;
struct ti_softc *sc;
@@ -1708,23 +1641,38 @@
pci_intr_handle_t ih;
const char *intrstr = NULL;
bus_dma_segment_t dmaseg;
- int error, dmanseg;
+ int error, dmanseg, nolinear;
- s = splimp();
+ t = ti_type_match(pa);
+ if (t == NULL) {
+ printf("ti_attach: were did the card go ?\n");
+ return;
+ }
+
+ printf(": %s (rev. 0x%02x)\n", t->ti_name, PCI_REVISION(pa->pa_class));
sc = (struct ti_softc *)self;
/*
* Map control/status registers.
*/
- if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM, BUS_SPACE_MAP_LINEAR,
- &sc->ti_btag, &sc->ti_bhandle, NULL, NULL)) {
- printf(": can't map i/o space\n");
- goto fail;
+ nolinear = 0;
+ if (pci_mapreg_map(pa, 0x10,
+ PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT,
+ BUS_SPACE_MAP_LINEAR , &sc->ti_btag, &sc->ti_bhandle,
+ NULL, NULL)) {
+ nolinear = 1;
+ if (pci_mapreg_map(pa, 0x10,
+ PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT,
+ 0 , &sc->ti_btag, &sc->ti_bhandle, NULL, NULL)) {
+ printf(": can't map memory space\n");
+ return;
+ }
}
- sc->ti_vhandle = (void *)(sc->ti_bhandle); /* XXX XXX XXX */
-
Home |
Main Index |
Thread Index |
Old Index