diff options
| author | Mike Silbersack <silby@FreeBSD.org> | 2006-05-04 07:41:01 +0000 |
|---|---|---|
| committer | Mike Silbersack <silby@FreeBSD.org> | 2006-05-04 07:41:01 +0000 |
| commit | 5511c4d6dc41144ab0ca52af6f0fceb409603230 (patch) | |
| tree | db07d1d82b73d9e76552efe6860376ba29a48be7 /sys/dev/bfe | |
| parent | de916c8b747ae5d875788555f6d39adb3fc91e4a (diff) | |
Notes
Diffstat (limited to 'sys/dev/bfe')
| -rw-r--r-- | sys/dev/bfe/if_bfe.c | 35 | ||||
| -rw-r--r-- | sys/dev/bfe/if_bfereg.h | 4 |
2 files changed, 22 insertions, 17 deletions
diff --git a/sys/dev/bfe/if_bfe.c b/sys/dev/bfe/if_bfe.c index 79e539bfa188..fb9087fcca63 100644 --- a/sys/dev/bfe/if_bfe.c +++ b/sys/dev/bfe/if_bfe.c @@ -297,7 +297,7 @@ bfe_dma_alloc(device_t dev) bzero(sc->bfe_rx_list, BFE_RX_LIST_SIZE); error = bus_dmamap_load(sc->bfe_rx_tag, sc->bfe_rx_map, sc->bfe_rx_list, sizeof(struct bfe_desc), - bfe_dma_map, &sc->bfe_rx_dma, 0); + bfe_dma_map, &sc->bfe_rx_dma, BUS_DMA_NOWAIT); if(error) return (ENOMEM); @@ -312,7 +312,7 @@ bfe_dma_alloc(device_t dev) error = bus_dmamap_load(sc->bfe_tx_tag, sc->bfe_tx_map, sc->bfe_tx_list, sizeof(struct bfe_desc), - bfe_dma_map, &sc->bfe_tx_dma, 0); + bfe_dma_map, &sc->bfe_tx_dma, BUS_DMA_NOWAIT); if(error) return (ENOMEM); @@ -572,6 +572,7 @@ bfe_list_newbuf(struct bfe_softc *sc, int c, struct mbuf *m) struct bfe_desc *d; struct bfe_data *r; u_int32_t ctrl; + int error; if ((c < 0) || (c >= BFE_RX_LIST_CNT)) return (EINVAL); @@ -593,8 +594,10 @@ bfe_list_newbuf(struct bfe_softc *sc, int c, struct mbuf *m) sc->bfe_rx_cnt = c; d = &sc->bfe_rx_list[c]; r = &sc->bfe_rx_ring[c]; - bus_dmamap_load(sc->bfe_tag, r->bfe_map, mtod(m, void *), - MCLBYTES, bfe_dma_map_desc, d, 0); + error = bus_dmamap_load(sc->bfe_tag, r->bfe_map, mtod(m, void *), + MCLBYTES, bfe_dma_map_desc, d, BUS_DMA_NOWAIT); + if (error) + printf("Serious error: bfe failed to map RX buffer\n"); bus_dmamap_sync(sc->bfe_tag, r->bfe_map, BUS_DMASYNC_PREWRITE); ctrl = ETHER_MAX_LEN + 32; @@ -1100,8 +1103,8 @@ bfe_txeof(struct bfe_softc *sc) ifp->if_opackets++; m_freem(r->bfe_mbuf); r->bfe_mbuf = NULL; - bus_dmamap_unload(sc->bfe_tag, r->bfe_map); } + bus_dmamap_unload(sc->bfe_tag, r->bfe_map); sc->bfe_tx_cnt--; BFE_INC(i, BFE_TX_LIST_CNT); } @@ -1239,13 +1242,14 @@ bfe_intr(void *xsc) } static int -bfe_encap(struct bfe_softc *sc, struct mbuf *m_head, u_int32_t *txidx) +bfe_encap(struct bfe_softc *sc, struct mbuf **m_head, u_int32_t *txidx) { struct bfe_desc *d = NULL; struct bfe_data *r = NULL; struct mbuf *m; u_int32_t frag, cur, cnt = 0; int chainlen = 0; + int error; if(BFE_TX_LIST_CNT - sc->bfe_tx_cnt < 2) return (ENOBUFS); @@ -1256,16 +1260,16 @@ bfe_encap(struct bfe_softc *sc, struct mbuf *m_head, u_int32_t *txidx) * by all packets, we'll m_defrag long chains so that they * do not use up the entire list, even if they would fit. */ - for(m = m_head; m != NULL; m = m->m_next) + for(m = *m_head; m != NULL; m = m->m_next) chainlen++; if ((chainlen > BFE_TX_LIST_CNT / 4) || ((BFE_TX_LIST_CNT - (chainlen + sc->bfe_tx_cnt)) < 2)) { - m = m_defrag(m_head, M_DONTWAIT); + m = m_defrag(*m_head, M_DONTWAIT); if (m == NULL) return (ENOBUFS); - m_head = m; + *m_head = m; } /* @@ -1273,11 +1277,10 @@ bfe_encap(struct bfe_softc *sc, struct mbuf *m_head, u_int32_t *txidx) * the fragment pointers. Stop when we run out * of fragments or hit the end of the mbuf chain. */ - m = m_head; cur = frag = *txidx; cnt = 0; - for(m = m_head; m != NULL; m = m->m_next) { + for(m = *m_head; m != NULL; m = m->m_next) { if(m->m_len != 0) { if((BFE_TX_LIST_CNT - (sc->bfe_tx_cnt + cnt)) < 2) return (ENOBUFS); @@ -1297,9 +1300,11 @@ bfe_encap(struct bfe_softc *sc, struct mbuf *m_head, u_int32_t *txidx) */ d->bfe_ctrl |= BFE_DESC_EOT; - bus_dmamap_load(sc->bfe_tag, + error = bus_dmamap_load(sc->bfe_tag, r->bfe_map, mtod(m, void*), m->m_len, - bfe_dma_map_desc, d, 0); + bfe_dma_map_desc, d, BUS_DMA_NOWAIT); + if (error) + return (ENOBUFS); bus_dmamap_sync(sc->bfe_tag, r->bfe_map, BUS_DMASYNC_PREWRITE); @@ -1313,7 +1318,7 @@ bfe_encap(struct bfe_softc *sc, struct mbuf *m_head, u_int32_t *txidx) return (ENOBUFS); sc->bfe_tx_list[frag].bfe_ctrl |= BFE_DESC_EOF; - sc->bfe_tx_ring[frag].bfe_mbuf = m_head; + sc->bfe_tx_ring[frag].bfe_mbuf = *m_head; bus_dmamap_sync(sc->bfe_tx_tag, sc->bfe_tx_map, BUS_DMASYNC_PREWRITE); *txidx = cur; @@ -1366,7 +1371,7 @@ bfe_start_locked(struct ifnet *ifp) * Pack the data into the tx ring. If we dont have * enough room, let the chip drain the ring. */ - if(bfe_encap(sc, m_head, &idx)) { + if(bfe_encap(sc, &m_head, &idx)) { IFQ_DRV_PREPEND(&ifp->if_snd, m_head); ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; diff --git a/sys/dev/bfe/if_bfereg.h b/sys/dev/bfe/if_bfereg.h index da7cb4ff67fe..f5af78069b97 100644 --- a/sys/dev/bfe/if_bfereg.h +++ b/sys/dev/bfe/if_bfereg.h @@ -427,8 +427,8 @@ #define BFE_RX_RING_SIZE 512 #define BFE_TX_RING_SIZE 512 #define BFE_LINK_DOWN 5 -#define BFE_TX_LIST_CNT 511 -#define BFE_RX_LIST_CNT 511 +#define BFE_TX_LIST_CNT 128 +#define BFE_RX_LIST_CNT 128 #define BFE_TX_LIST_SIZE BFE_TX_LIST_CNT * sizeof(struct bfe_desc) #define BFE_RX_LIST_SIZE BFE_RX_LIST_CNT * sizeof(struct bfe_desc) #define BFE_RX_OFFSET 30 |
