diff options
author | David Christensen <davidch@FreeBSD.org> | 2008-06-10 02:19:11 +0000 |
---|---|---|
committer | David Christensen <davidch@FreeBSD.org> | 2008-06-10 02:19:11 +0000 |
commit | 680ece5918d2469f4505e754bc478581287d14ec (patch) | |
tree | 8a5784c80bfe37335ae42c29a2075e203b7a48cb | |
parent | 5bbaa5cf025443d6df10952a29a5de67feb6fbe0 (diff) | |
download | src-680ece5918d2469f4505e754bc478581287d14ec.tar.gz src-680ece5918d2469f4505e754bc478581287d14ec.zip |
- Fixed kern/123696 by increasing firmware timeout value from 100 to 1000.
- Fixed a problem on i386 architecture when using split header/jumbo frame
firmware caused by hardware alignment requirements.
- Added #define BCE_USE_SPLIT_HEADER to allow the feature to be enabled/
disabled. Enabled by default.
PR: kern/123696
MFC after: 2 weeks
Notes
Notes:
svn path=/head/; revision=179695
-rw-r--r-- | sys/dev/bce/if_bce.c | 234 | ||||
-rw-r--r-- | sys/dev/bce/if_bcereg.h | 13 |
2 files changed, 193 insertions, 54 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c index 750fee2fca03..468ddcfe993f 100644 --- a/sys/dev/bce/if_bce.c +++ b/sys/dev/bce/if_bce.c @@ -82,6 +82,11 @@ __FBSDID("$FreeBSD$"); int bce_debug_bootcode_running_failure = 0; #endif +/****************************************************************************/ +/* BCE Build Time Options */ +/****************************************************************************/ +#define BCE_USE_SPLIT_HEADER 1
+/* #define BCE_NVRAM_WRITE_SUPPORT 1 */ /****************************************************************************/ /* PCI Device ID Table */ @@ -224,16 +229,22 @@ static u32 bce_ctx_rd (struct bce_softc *, u32, u32); static void bce_dump_mbuf (struct bce_softc *, struct mbuf *); static void bce_dump_tx_mbuf_chain (struct bce_softc *, u16, int); static void bce_dump_rx_mbuf_chain (struct bce_softc *, u16, int); -static void bce_dump_pg_mbuf_chain (struct bce_softc *, u16, int); +#ifdef BCE_USE_SPLIT_HEADER
+static void bce_dump_pg_mbuf_chain (struct bce_softc *, u16, int);
+#endif static void bce_dump_txbd (struct bce_softc *, int, struct tx_bd *); static void bce_dump_rxbd (struct bce_softc *, int, struct rx_bd *); -static void bce_dump_pgbd (struct bce_softc *, int, struct rx_bd *); +#ifdef BCE_USE_SPLIT_HEADER
+static void bce_dump_pgbd (struct bce_softc *, int, struct rx_bd *);
+#endif static void bce_dump_l2fhdr (struct bce_softc *, int, struct l2_fhdr *); static void bce_dump_ctx (struct bce_softc *, u16); static void bce_dump_ftqs (struct bce_softc *); static void bce_dump_tx_chain (struct bce_softc *, u16, int); static void bce_dump_rx_chain (struct bce_softc *, u16, int); -static void bce_dump_pg_chain (struct bce_softc *, u16, int); +#ifdef BCE_USE_SPLIT_HEADER
+static void bce_dump_pg_chain (struct bce_softc *, u16, int);
+#endif static void bce_dump_status_block (struct bce_softc *); static void bce_dump_stats_block (struct bce_softc *); static void bce_dump_driver_state (struct bce_softc *); @@ -294,7 +305,9 @@ static int bce_reset (struct bce_softc *, u32); static int bce_chipinit (struct bce_softc *); static int bce_blockinit (struct bce_softc *); static int bce_get_rx_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *, u32 *); -static int bce_get_pg_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *); +#ifdef BCE_USE_SPLIT_HEADER
+static int bce_get_pg_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *);
+#endif static int bce_init_tx_chain (struct bce_softc *); static void bce_free_tx_chain (struct bce_softc *); @@ -302,10 +315,12 @@ static void bce_free_tx_chain (struct bce_softc *); static int bce_init_rx_chain (struct bce_softc *); static void bce_fill_rx_chain (struct bce_softc *); static void bce_free_rx_chain (struct bce_softc *); - +
+#ifdef BCE_USE_SPLIT_HEADER static int bce_init_pg_chain (struct bce_softc *); static void bce_fill_pg_chain (struct bce_softc *); -static void bce_free_pg_chain (struct bce_softc *); +static void bce_free_pg_chain (struct bce_softc *);
+#endif static int bce_tx_encap (struct bce_softc *, struct mbuf **); static void bce_start_locked (struct ifnet *); @@ -778,10 +793,18 @@ bce_attach(device_t dev) /* Use standard mbuf sizes for buffer allocation. */ #ifdef BCE_USE_SPLIT_HEADER sc->rx_bd_mbuf_alloc_size = MHLEN; + /* Make sure offset is 16 byte aligned for hardware. */
+ sc->rx_bd_mbuf_align_pad = roundup2((MSIZE - MHLEN), 16) -
+ (MSIZE - MHLEN); + sc->rx_bd_mbuf_data_len = sc->rx_bd_mbuf_alloc_size -
+ sc->rx_bd_mbuf_align_pad; + sc->pg_bd_mbuf_alloc_size = MCLBYTES;
#else sc->rx_bd_mbuf_alloc_size = MCLBYTES; -#endif - sc->pg_bd_mbuf_alloc_size = MCLBYTES; + sc->rx_bd_mbuf_align_pad = roundup2(MCLBYTES, 16) - MCLBYTES; + sc->rx_bd_mbuf_data_len = sc->rx_bd_mbuf_alloc_size -
+ sc->rx_bd_mbuf_align_pad; +#endif
ifp->if_snd.ifq_drv_maxlen = USABLE_TX_BD; IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_drv_maxlen); @@ -856,6 +879,9 @@ bce_attach(device_t dev) ((sc->bce_flags & BCE_PCI_32BIT_FLAG) ? "32-bit" : "64-bit"), sc->bus_speed_mhz); printf("F/W (0x%08X); Flags( ", sc->bce_fw_ver); +#ifdef BCE_USE_SPLIT_HEADER
+ printf("SPLT "); +#endif
if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) printf("MFW "); if (sc->bce_flags & BCE_USING_MSI_FLAG) @@ -2246,6 +2272,7 @@ bce_dma_free(struct bce_softc *sc) } +#ifdef BCE_USE_SPLIT_HEADER
/* Free, unmap and destroy all page buffer descriptor chain pages. */ for (i = 0; i < PG_PAGES; i++ ) { if (sc->pg_bd_chain[i] != NULL) { @@ -2272,6 +2299,7 @@ bce_dma_free(struct bce_softc *sc) bus_dma_tag_destroy(sc->pg_bd_chain_tag); sc->pg_bd_chain_tag = NULL; } +#endif
/* Unload and destroy the TX mbuf maps. */ @@ -2308,6 +2336,7 @@ bce_dma_free(struct bce_softc *sc) sc->rx_mbuf_tag = NULL; } +#ifdef BCE_USE_SPLIT_HEADER
/* Unload and destroy the page mbuf maps. */ for (i = 0; i < TOTAL_PG_BD; i++) { if (sc->pg_mbuf_map[i] != NULL) { @@ -2324,6 +2353,7 @@ bce_dma_free(struct bce_softc *sc) bus_dma_tag_destroy(sc->pg_mbuf_tag); sc->pg_mbuf_tag = NULL; } +#endif
/* Destroy the parent tag */ if (sc->parent_tag != NULL) { @@ -2376,7 +2406,21 @@ bce_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error) /* Allocate any DMA memory needed by the driver. */ /* */ /* Allocates DMA memory needed for the various global structures needed by */ -/* hardware. */ +/* hardware. */
+/* */
+/* Memory alignment requirements: */
+/* -----------------+----------+----------+ */
+/* Data Structure | 5706 | 5708 | */
+/* -----------------+----------+----------+ */
+/* Status Block | 8 bytes | 8 bytes | */
+/* Statistics Block | 8 bytes | 8 bytes | */
+/* RX Buffers | 16 bytes | 16 bytes | */
+/* PG Buffers | none | none | */
+/* TX Buffers | none | none | */
+/* Chain Pages(1) | 4KiB | 4KiB | */
+/* -----------------+----------+----------+ */
+/* */
+/* (1) Must align with CPU page size (BCM_PAGE_SZIE). */
/* */ /* Returns: */ /* 0 for success, positive value for failure. */ @@ -2683,8 +2727,12 @@ bce_dma_alloc(device_t dev) /* * Create a DMA tag for RX mbufs. */ +#ifdef BCE_USE_SPLIT_HEADER
max_size = max_seg_size = ((sc->rx_bd_mbuf_alloc_size < MCLBYTES) ? - MCLBYTES : sc->rx_bd_mbuf_alloc_size); + MCLBYTES : sc->rx_bd_mbuf_alloc_size);
+#else
+ max_size = max_seg_size = MJUM9BYTES;
+#endif
if (bus_dma_tag_create(sc->parent_tag, 1, @@ -2715,6 +2763,7 @@ bce_dma_alloc(device_t dev) } } +#ifdef BCE_USE_SPLIT_HEADER
/* * Create a DMA tag for the page buffer descriptor chain, * allocate and clear the memory, and fetch the physical @@ -2777,7 +2826,7 @@ bce_dma_alloc(device_t dev) * Create a DMA tag for page mbufs. */ max_size = max_seg_size = ((sc->pg_bd_mbuf_alloc_size < MCLBYTES) ? - MCLBYTES : sc->rx_bd_mbuf_alloc_size); + MCLBYTES : sc->pg_bd_mbuf_alloc_size); if (bus_dma_tag_create(sc->parent_tag, 1, @@ -2807,6 +2856,7 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } } +#endif
bce_dma_alloc_exit: DBPRINT(sc, BCE_VERBOSE_RESET, "Exiting %s()\n", __FUNCTION__); @@ -3449,7 +3499,9 @@ bce_stop(struct bce_softc *sc) bce_disable_intr(sc); /* Free RX buffers. */ - bce_free_pg_chain(sc); +#ifdef BCE_USE_SPLIT_HEADER
+ bce_free_pg_chain(sc);
+#endif bce_free_rx_chain(sc); /* Free TX buffers. */ @@ -3811,8 +3863,12 @@ bce_get_rx_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, #ifdef BCE_USE_SPLIT_HEADER MGETHDR(m_new, M_DONTWAIT, MT_DATA); #else - m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + if (sc->rx_bd_mbuf_alloc_size == MCLBYTES)
+ m_new = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ else
+ m_new = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, sc->rx_bd_mbuf_alloc_size); #endif +
if (m_new == NULL) { sc->mbuf_alloc_failed++; rc = ENOBUFS; @@ -3825,9 +3881,12 @@ bce_get_rx_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, m_new = m; } + /* Make sure we have a valid packet header. */
M_ASSERTPKTHDR(m_new); - m_new->m_pkthdr.len = m_new->m_len = sc->rx_bd_mbuf_alloc_size; + /* Initialize the mbuf size and pad if necessary for alignment. */
+ m_new->m_pkthdr.len = m_new->m_len = sc->rx_bd_mbuf_alloc_size;
+ m_adj(m_new, sc->rx_bd_mbuf_align_pad); /* ToDo: Consider calling m_fragment() to test error handling. */ @@ -3838,8 +3897,8 @@ bce_get_rx_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, /* Handle any mapping errors. */ if (error) { - BCE_PRINTF("%s(%d): Error mapping mbuf into RX chain!\n", - __FILE__, __LINE__); + BCE_PRINTF("%s(%d): Error mapping mbuf into RX chain (%d)!\n", + __FILE__, __LINE__, error); m_freem(m_new); DBRUN(sc->debug_rx_mbuf_alloc--); @@ -3861,7 +3920,7 @@ bce_get_rx_buf(struct bce_softc *sc, struct mbuf *m, u16 *prod, rxbd->rx_bd_haddr_hi = htole32(BCE_ADDR_HI(segs[0].ds_addr)); rxbd->rx_bd_len = htole32(segs[0].ds_len); rxbd->rx_bd_flags = htole32(RX_BD_FLAGS_START | RX_BD_FLAGS_END); - *prod_bseq += segs[0].ds_len; + *prod_bseq += segs[0].ds_len; /* Save the mbuf and update our counter. */ sc->rx_mbuf_ptr[*chain_prod] = m_new; @@ -3881,6 +3940,7 @@ bce_get_rx_buf_exit: } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Encapsulate an mbuf cluster into the page chain. */ /* */ @@ -3991,6 +4051,7 @@ bce_get_pg_buf_exit: return(rc); } +#endif /* BCE_USE_SPLIT_HEADER */
/****************************************************************************/ @@ -4234,8 +4295,10 @@ bce_free_rx_chain(struct bce_softc *sc) DBPRINT(sc, BCE_VERBOSE_RESET, "Entering %s()\n", __FUNCTION__); +#ifdef BCE_USE_SPLIT_HEADER
/* Clear the jumbo page chain support. */ - CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_PG_BUF_SIZE, 0); + CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_PG_BUF_SIZE, 0);
+#endif /* Free any mbufs still in the RX mbuf chain. */ for (i = 0; i < TOTAL_RX_BD; i++) { @@ -4264,6 +4327,7 @@ bce_free_rx_chain(struct bce_softc *sc) } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Allocate memory and initialize the page data structures. */ /* Assumes that bce_init_rx_chain() has not already been called. */ @@ -4312,7 +4376,11 @@ bce_init_pg_chain(struct bce_softc *sc) CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_NX_PG_BDHADDR_LO, val); /* Configure the rx_bd and page chain mbuf cluster size. */ - val = (sc->rx_bd_mbuf_alloc_size << 16) | sc->pg_bd_mbuf_alloc_size; +#ifdef BCE_USE_SPLIT_HEADER
+ val = (sc->rx_bd_mbuf_data_len << 16) | sc->pg_bd_mbuf_alloc_size;
+#else + val = (sc->rx_bd_mbuf_data_len << 16);
+#endif CTX_WR(sc, GET_CID_ADDR(RX_CID), BCE_L2CTX_PG_BUF_SIZE, val); /* Configure the context reserved for jumbo support. */ @@ -4413,6 +4481,7 @@ bce_free_pg_chain(struct bce_softc *sc) DBPRINT(sc, BCE_EXCESSIVE_RESET, "Exiting %s()\n", __FUNCTION__); } +#endif /* BCE_USE_SPLIT_HEADER */
/****************************************************************************/ @@ -4567,9 +4636,13 @@ bce_rx_intr(struct bce_softc *sc) { struct ifnet *ifp = sc->bce_ifp; struct l2_fhdr *l2fhdr; - unsigned int pages, pkt_len, rem_len; - u16 sw_rx_cons, sw_rx_cons_idx, sw_pg_cons, sw_pg_cons_idx, hw_rx_cons; + unsigned int pkt_len; + u16 sw_rx_cons, sw_rx_cons_idx, hw_rx_cons;
u32 status; +#ifdef BCE_USE_SPLIT_HEADER
+ unsigned int pages, rem_len; + u16 sw_pg_cons, sw_pg_cons_idx;
+#endif #ifdef BCE_DEBUG @@ -4583,17 +4656,21 @@ bce_rx_intr(struct bce_softc *sc) bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_POSTWRITE); +#ifdef BCE_USE_SPLIT_HEADER
/* Prepare the page chain pages to be accessed by the host CPU. */ for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, - sc->pg_bd_chain_map[i], BUS_DMASYNC_POSTWRITE); + sc->pg_bd_chain_map[i], BUS_DMASYNC_POSTWRITE);
+#endif /* Get the hardware's view of the RX consumer index. */ hw_rx_cons = sc->hw_rx_cons = bce_get_hw_rx_cons(sc); /* Get working copies of the driver's view of the consumer indices. */ sw_rx_cons = sc->rx_cons; - sw_pg_cons = sc->pg_cons; +#ifdef BCE_USE_SPLIT_HEADER
+ sw_pg_cons = sc->pg_cons;
+#endif DBPRINT(sc, BCE_INFO_RECV, "%s(enter): rx_prod = 0x%04X, " "rx_cons = 0x%04X, rx_prod_bseq = 0x%08X\n", @@ -4656,10 +4733,12 @@ bce_rx_intr(struct bce_softc *sc) */ m_adj(m0, sizeof(struct l2_fhdr) + ETHER_ALIGN); +
+#ifdef BCE_USE_SPLIT_HEADER
/* * Check whether the received frame fits in a single * mbuf or not (i.e. packet data + FCS <= - * sc->rx_bd_mbuf_alloc_size bytes). + * sc->rx_bd_mbuf_data_len bytes). */ if (pkt_len > m0->m_len) { /* @@ -4737,7 +4816,8 @@ bce_rx_intr(struct bce_softc *sc) /* Set the total packet length. */ m0->m_pkthdr.len = m0->m_len = pkt_len; - } + }
+#endif /* Remove the trailing Ethernet FCS. */ m_adj(m0, -ETHER_CRC_LEN); @@ -4825,7 +4905,9 @@ bce_rx_int_next_rx: if (m0) { /* Make sure we don't lose our place when we release the lock. */ sc->rx_cons = sw_rx_cons; - sc->pg_cons = sw_pg_cons; +#ifdef BCE_USE_SPLIT_HEADER
+ sc->pg_cons = sw_pg_cons;
+#endif BCE_UNLOCK(sc); (*ifp->if_input)(ifp, m0); @@ -4833,7 +4915,9 @@ bce_rx_int_next_rx: /* Recover our place. */ sw_rx_cons = sc->rx_cons; - sw_pg_cons = sc->pg_cons; +#ifdef BCE_USE_SPLIT_HEADER
+ sw_pg_cons = sc->pg_cons;
+#endif } /* Refresh hw_cons to see if there's new work */ @@ -4842,8 +4926,10 @@ bce_rx_int_next_rx: } /* No new packets to process. Refill the RX and page chains and exit. */ +#ifdef BCE_USE_SPLIT_HEADER
sc->pg_cons = sw_pg_cons; - bce_fill_pg_chain(sc); + bce_fill_pg_chain(sc);
+#endif sc->rx_cons = sw_rx_cons; bce_fill_rx_chain(sc); @@ -4852,9 +4938,11 @@ bce_rx_int_next_rx: bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_PREWRITE); +#ifdef BCE_USE_SPLIT_HEADER
for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, - sc->pg_bd_chain_map[i], BUS_DMASYNC_PREWRITE); + sc->pg_bd_chain_map[i], BUS_DMASYNC_PREWRITE);
+#endif DBPRINT(sc, BCE_INFO_RECV, "%s(exit): rx_prod = 0x%04X, " "rx_cons = 0x%04X, rx_prod_bseq = 0x%08X\n", @@ -5089,12 +5177,19 @@ bce_init_locked(struct bce_softc *sc) bcopy(IF_LLADDR(sc->bce_ifp), sc->eaddr, ETHER_ADDR_LEN); bce_set_mac_addr(sc); - /* Calculate and program the hardware Ethernet MTU size. */ - if (ifp->if_mtu <= sc->pg_bd_mbuf_alloc_size) - /* Be generous on receive if we have room. */ - ether_mtu = sc->pg_bd_mbuf_alloc_size; + /*
+ * Calculate and program the hardware Ethernet MTU
+ * size. Be generous on the receive if we have room.
+ */ +#ifdef BCE_USE_SPLIT_HEADER
+ if (ifp->if_mtu <= (sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size)) + ether_mtu = sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size; +#else
+ if (ifp->if_mtu <= sc->rx_bd_mbuf_data_len) + ether_mtu = sc->rx_bd_mbuf_data_len; +#endif else - ether_mtu = ifp->if_mtu; + ether_mtu = ifp->if_mtu;
ether_mtu += ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETHER_CRC_LEN; @@ -5110,14 +5205,18 @@ bce_init_locked(struct bce_softc *sc) REG_WR(sc, BCE_EMAC_RX_MTU_SIZE, ether_mtu); DBPRINT(sc, BCE_INFO_LOAD, - "%s(): rx_bd_mbuf_alloc_size = %d, pg_bd_mbuf_alloc_size = %d\n", - __FUNCTION__, sc->rx_bd_mbuf_alloc_size, sc->pg_bd_mbuf_alloc_size); + "%s(): rx_bd_mbuf_alloc_size = %d, rx_bce_mbuf_data_len = %d, "
+ "rx_bd_mbuf_align_pad = %d, pg_bd_mbuf_alloc_size = %d\n", + __FUNCTION__, sc->rx_bd_mbuf_alloc_size, sc->rx_bd_mbuf_data_len,
+ sc->rx_bd_mbuf_align_pad, sc->pg_bd_mbuf_alloc_size); /* Program appropriate promiscuous/multicast filtering. */ bce_set_rx_mode(sc); +#ifdef BCE_USE_SPLIT_HEADER
/* Init page buffer descriptor chain. */ - bce_init_pg_chain(sc); + bce_init_pg_chain(sc);
+#endif /* Init RX buffer descriptor chain. */ bce_init_rx_chain(sc); @@ -5583,7 +5682,24 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) BCE_LOCK(sc); ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+#ifdef BCE_USE_SPLIT_HEADER
+ /* No buffer allocation size changes are necessary. */
+#else
+ /* Recalculate our buffer allocation sizes. */
+ if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETHER_CRC_LEN) > MCLBYTES) {
+ sc->rx_bd_mbuf_alloc_size = MJUM9BYTES; + sc->rx_bd_mbuf_align_pad = roundup2(MJUM9BYTES, 16) - MJUM9BYTES; + sc->rx_bd_mbuf_data_len = sc->rx_bd_mbuf_alloc_size -
+ sc->rx_bd_mbuf_align_pad;
+ } else {
+ sc->rx_bd_mbuf_alloc_size = MCLBYTES; + sc->rx_bd_mbuf_align_pad = roundup2(MCLBYTES, 16) - MCLBYTES; + sc->rx_bd_mbuf_data_len = sc->rx_bd_mbuf_alloc_size -
+ sc->rx_bd_mbuf_align_pad;
+ } +#endif
+
bce_init_locked(sc); BCE_UNLOCK(sc); break; @@ -6233,7 +6349,9 @@ bce_tick(void *xsc) bce_stats_update(sc); /* Top off the receive and page chains. */ - bce_fill_pg_chain(sc); +#ifdef BCE_USE_SPLIT_HEADER
+ bce_fill_pg_chain(sc);
+#endif bce_fill_rx_chain(sc); /* Check that chip hasn't hung. */ @@ -6406,6 +6524,7 @@ bce_sysctl_dump_tx_chain(SYSCTL_HANDLER_ARGS) } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Provides a sysctl interface to allow dumping the page chain. */ /* */ @@ -6431,7 +6550,8 @@ bce_sysctl_dump_pg_chain(SYSCTL_HANDLER_ARGS) } return error; -} +}
+#endif /****************************************************************************/ @@ -6923,10 +7043,12 @@ bce_add_sysctls(struct bce_softc *sc) (void *)sc, 0, bce_sysctl_dump_tx_chain, "I", "Dump tx_bd chain"); +#ifdef BCE_USE_SPLIT_HEADER
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "dump_pg_chain", CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, - bce_sysctl_dump_pg_chain, "I", "Dump page chain"); + bce_sysctl_dump_pg_chain, "I", "Dump page chain");
+#endif SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "breakpoint", CTLTYPE_INT | CTLFLAG_RW, @@ -7104,6 +7226,7 @@ bce_dump_rx_mbuf_chain(struct bce_softc *sc, u16 chain_prod, int count) } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Prints out the mbufs in the mbuf page chain. */ /* */ @@ -7132,7 +7255,8 @@ bce_dump_pg_mbuf_chain(struct bce_softc *sc, u16 chain_prod, int count) "----------------------------" "----------------" "----------------------------\n"); -} +}
+#endif /****************************************************************************/ @@ -7226,6 +7350,7 @@ bce_dump_rxbd(struct bce_softc *sc, int idx, struct rx_bd *rxbd) } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Prints out a rx_bd structure in the page chain. */ /* */ @@ -7248,7 +7373,8 @@ bce_dump_pgbd(struct bce_softc *sc, int idx, struct rx_bd *pgbd) "flags = 0x%08X\n", idx, pgbd->rx_bd_haddr_hi, pgbd->rx_bd_haddr_lo, pgbd->rx_bd_len, pgbd->rx_bd_flags); -} +}
+#endif /****************************************************************************/ @@ -7612,6 +7738,7 @@ bce_dump_rx_chain(struct bce_softc *sc, u16 rx_prod, int count) } +#ifdef BCE_USE_SPLIT_HEADER
/****************************************************************************/ /* Prints out the page chain. */ /* */ @@ -7654,7 +7781,8 @@ bce_dump_pg_chain(struct bce_softc *sc, u16 pg_prod, int count) "----------------------------" "----------------" "----------------------------\n"); -} +}
+#endif /****************************************************************************/ @@ -8091,11 +8219,13 @@ bce_dump_driver_state(struct bce_softc *sc) "0x%08X:%08X - (sc->rx_bd_chain) rx_bd chain virtual address\n", val_hi, val_lo); +#ifdef BCE_USE_SPLIT_HEADER
val_hi = BCE_ADDR_HI(sc->pg_bd_chain); val_lo = BCE_ADDR_LO(sc->pg_bd_chain); BCE_PRINTF( "0x%08X:%08X - (sc->pg_bd_chain) page chain virtual address\n", - val_hi, val_lo); + val_hi, val_lo);
+#endif val_hi = BCE_ADDR_HI(sc->tx_mbuf_ptr); val_lo = BCE_ADDR_LO(sc->tx_mbuf_ptr); @@ -8109,11 +8239,13 @@ bce_dump_driver_state(struct bce_softc *sc) "0x%08X:%08X - (sc->rx_mbuf_ptr) rx mbuf chain virtual address\n", val_hi, val_lo); +#ifdef BCE_USE_SPLIT_HEADER
val_hi = BCE_ADDR_HI(sc->pg_mbuf_ptr); val_lo = BCE_ADDR_LO(sc->pg_mbuf_ptr); BCE_PRINTF( "0x%08X:%08X - (sc->pg_mbuf_ptr) page mbuf chain virtual address\n", - val_hi, val_lo); + val_hi, val_lo);
+#endif BCE_PRINTF(" 0x%08X - (sc->interrupts_generated) h/w intrs\n", sc->interrupts_generated); @@ -8160,6 +8292,7 @@ bce_dump_driver_state(struct bce_softc *sc) BCE_PRINTF(" 0x%08X - (sc->free_rx_bd) free rx_bd's\n", sc->free_rx_bd); +#ifdef BCE_USE_SPLIT_HEADER
BCE_PRINTF(" 0x%04X(0x%04X) - (sc->pg_prod) page producer index\n", sc->pg_prod, (u16) PG_CHAIN_IDX(sc->pg_prod)); @@ -8174,6 +8307,7 @@ bce_dump_driver_state(struct bce_softc *sc) BCE_PRINTF("0x%08X/%08X - (sc->pg_low_watermark) page low watermark\n", sc->pg_low_watermark, sc->max_pg_bd); +#endif
BCE_PRINTF(" 0x%08X - (sc->mbuf_alloc_failed) " "mbuf alloc failures\n", @@ -8482,16 +8616,13 @@ bce_breakpoint(struct bce_softc *sc) bce_unfreeze_controller(sc); bce_dump_txbd(sc, 0, NULL); bce_dump_rxbd(sc, 0, NULL); - bce_dump_pgbd(sc, 0, NULL); bce_dump_tx_mbuf_chain(sc, 0, USABLE_TX_BD); bce_dump_rx_mbuf_chain(sc, 0, USABLE_RX_BD); - bce_dump_pg_mbuf_chain(sc, 0, USABLE_PG_BD); bce_dump_l2fhdr(sc, 0, NULL); bce_dump_ctx(sc, RX_CID); bce_dump_ftqs(sc); bce_dump_tx_chain(sc, 0, USABLE_TX_BD); bce_dump_rx_chain(sc, 0, USABLE_RX_BD); - bce_dump_pg_chain(sc, 0, USABLE_PG_BD); bce_dump_status_block(sc); bce_dump_stats_block(sc); bce_dump_driver_state(sc); @@ -8500,6 +8631,11 @@ bce_breakpoint(struct bce_softc *sc) bce_dump_txp_state(sc); bce_dump_rxp_state(sc); bce_dump_tpat_state(sc); +#ifdef BCE_USE_SPLIT_HEADER
+ bce_dump_pgbd(sc, 0, NULL); + bce_dump_pg_mbuf_chain(sc, 0, USABLE_PG_BD);
+ bce_dump_pg_chain(sc, 0, USABLE_PG_BD); +#endif } bce_dump_status_block(sc); diff --git a/sys/dev/bce/if_bcereg.h b/sys/dev/bce/if_bcereg.h index e25386f94cdb..515d36eb07a2 100644 --- a/sys/dev/bce/if_bcereg.h +++ b/sys/dev/bce/if_bcereg.h @@ -131,7 +131,9 @@ /****************************************************************************/ /* Debugging macros and definitions. */ -/****************************************************************************/ +/****************************************************************************/
+/* #define BCE_DEBUG 1 */ +
#define BCE_CP_LOAD 0x00000001 #define BCE_CP_SEND 0x00000002 #define BCE_CP_RECV 0x00000004 @@ -466,7 +468,7 @@ struct flash_spec { * running and there won't be any firmware-driver synchronization during a * driver reset. */ -#define FW_ACK_TIME_OUT_MS 100 +#define FW_ACK_TIME_OUT_MS 1000 #define BCE_DRV_RESET_SIGNATURE 0x00000000 @@ -4924,8 +4926,7 @@ struct fw_info { #define BCE_MAX_JUMBO_ETHER_MTU 9018 #define BCE_MAX_JUMBO_ETHER_MTU_VLAN 9022 -// #define BCE_MAX_MTU ETHER_MAX_LEN_JUMBO + ETHER_VLAN_ENCAP_LEN /* 9022 */ - +
/****************************************************************************/ /* BCE Device State Data Structure */ /****************************************************************************/ @@ -5047,7 +5048,9 @@ struct bce_softc /* Frame size and mbuf allocation size for RX frames. */ u32 max_frame_size; - int rx_bd_mbuf_alloc_size; + int rx_bd_mbuf_alloc_size;
+ int rx_bd_mbuf_data_len;
+ int rx_bd_mbuf_align_pad; int pg_bd_mbuf_alloc_size; /* Receive mode settings (i.e promiscuous, multicast, etc.). */ |