diff options
author | silby <silby@FreeBSD.org> | 2006-05-28 18:41:47 +0000 |
---|---|---|
committer | silby <silby@FreeBSD.org> | 2006-05-28 18:41:47 +0000 |
commit | a83bbac451d755b1bbb0fe94982e811b2e87c59f (patch) | |
tree | ebc140b4c0106881535771b2d545870c3d29f525 | |
parent | 0daaa33f18003993aa6051fcc24b2bfff9abd912 (diff) | |
download | FreeBSD-src-a83bbac451d755b1bbb0fe94982e811b2e87c59f.zip FreeBSD-src-a83bbac451d755b1bbb0fe94982e811b2e87c59f.tar.gz |
1. Make sure that the TX and RX descriptor rings are 4096 byte aligned.
Also use BUS_DMA_ALLOCNOW to be on the safe side.
2. Look for the Descriptor Error, and Descriptor Protocol Error flags from
the card, and down the interface if we detect either.
#1 (along with fixes to busdma) makes sure that this card works in all
memory situations. Prior to this change, it was just luck that 512 count
RX/TX lists were properly aligned. Now we can use any size of RX/TX lists
and still have them properly aligned.
#2 ensures that we don't get into an endless interrupt storm if busdma fails
us. Descriptor Protocol Error would occur if we misaligned the TX/RX rings,
and Descriptor Error would occur if we tried to give the card descriptors
or rings with addresses > 1G. Trying to reinitialize the card isn't going
to fix these errors, hence we don't try.
-rw-r--r-- | sys/dev/bfe/if_bfe.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/sys/dev/bfe/if_bfe.c b/sys/dev/bfe/if_bfe.c index 2cda657..b343012 100644 --- a/sys/dev/bfe/if_bfe.c +++ b/sys/dev/bfe/if_bfe.c @@ -201,27 +201,27 @@ bfe_dma_alloc(device_t dev) * greater than 1GB. */ error = bus_dma_tag_create(NULL, /* parent */ - PAGE_SIZE, 0, /* alignment, boundary */ + 4096, 0, /* alignment, boundary */ 0x3FFFFFFF, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ MAXBSIZE, /* maxsize */ BUS_SPACE_UNRESTRICTED, /* num of segments */ BUS_SPACE_MAXSIZE_32BIT, /* max segment size */ - 0, /* flags */ + BUS_DMA_ALLOCNOW, /* flags */ NULL, NULL, /* lockfunc, lockarg */ &sc->bfe_parent_tag); /* tag for TX ring */ error = bus_dma_tag_create(sc->bfe_parent_tag, - 1, 0, + 4096, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, BFE_TX_LIST_SIZE, 1, BUS_SPACE_MAXSIZE_32BIT, - 0, + BUS_DMA_ALLOCNOW, NULL, NULL, &sc->bfe_tx_tag); @@ -232,14 +232,14 @@ bfe_dma_alloc(device_t dev) /* tag for RX ring */ error = bus_dma_tag_create(sc->bfe_parent_tag, - 1, 0, + 4096, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, BFE_RX_LIST_SIZE, 1, BUS_SPACE_MAXSIZE_32BIT, - 0, + BUS_DMA_ALLOCNOW, NULL, NULL, &sc->bfe_rx_tag); @@ -1212,6 +1212,21 @@ bfe_intr(void *xsc) } if(istat & BFE_ISTAT_ERRORS) { + + if (istat & BFE_ISTAT_DSCE) { + printf("if_bfe Descriptor Error\n"); + bfe_stop(sc); + BFE_UNLOCK(sc); + return; + } + + if (istat & BFE_ISTAT_DPE) { + printf("if_bfe Descriptor Protocol Error\n"); + bfe_stop(sc); + BFE_UNLOCK(sc); + return; + } + flag = CSR_READ_4(sc, BFE_DMATX_STAT); if(flag & BFE_STAT_EMASK) ifp->if_oerrors++; |