summaryrefslogtreecommitdiffstats
path: root/sys/dev/bce
diff options
context:
space:
mode:
authordavidch <davidch@FreeBSD.org>2008-06-10 02:19:11 +0000
committerdavidch <davidch@FreeBSD.org>2008-06-10 02:19:11 +0000
commit1a7f0803e4fbcc7296bbe6ec98d87438ca50abc4 (patch)
tree8a5784c80bfe37335ae42c29a2075e203b7a48cb /sys/dev/bce
parent407d56cbcfa6ec0869c28bf403f2674560cc3321 (diff)
downloadFreeBSD-src-1a7f0803e4fbcc7296bbe6ec98d87438ca50abc4.zip
FreeBSD-src-1a7f0803e4fbcc7296bbe6ec98d87438ca50abc4.tar.gz
- 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
Diffstat (limited to 'sys/dev/bce')
-rw-r--r--sys/dev/bce/if_bce.c234
-rw-r--r--sys/dev/bce/if_bcereg.h13
2 files changed, 193 insertions, 54 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c
index 750fee2..468ddcf 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 e25386f..515d36e 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.). */
OpenPOWER on IntegriCloud