Index: if_em.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_em.c,v diff -u -p -r1.378 if_em.c --- if_em.c 31 Aug 2024 16:23:09 -0000 1.378 +++ if_em.c 29 Oct 2024 09:17:54 -0000 @@ -452,7 +452,7 @@ em_attach(struct device *parent, struct sc->hw.wait_autoneg_complete = WAIT_FOR_AUTO_NEG_DEFAULT; sc->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; sc->hw.tbi_compatibility_en = TRUE; - sc->sc_rx_buffer_len = EM_RXBUFFER_2048; + sc->sc_rx_buffer_len = EM_MCLBYTES; sc->hw.phy_init_script = 1; sc->hw.phy_reset_disable = FALSE; @@ -780,7 +780,7 @@ em_ioctl(struct ifnet *ifp, u_long comma case SIOCGIFRXR: error = if_rxr_ioctl((struct if_rxrinfo *)ifr->ifr_data, - NULL, EM_MCLBYTES, &sc->queues->rx.sc_rx_ring); + NULL, sc->sc_rx_buffer_len, &sc->queues->rx.sc_rx_ring); break; case SIOCGIFSFFPAGE: @@ -2712,16 +2712,18 @@ em_get_buf(struct em_queue *que, int i) KASSERT(pkt->pkt_m == NULL); - m = MCLGETL(NULL, M_DONTWAIT, EM_MCLBYTES); + m = MCLGETL(NULL, M_DONTWAIT, sc->sc_rx_buffer_len + ETHER_ALIGN); if (m == NULL) { sc->mbuf_cluster_failed++; return (ENOBUFS); } - m->m_len = m->m_pkthdr.len = EM_MCLBYTES; - m_adj(m, ETHER_ALIGN); + + m->m_data += ETHER_ALIGN; + m->m_len = m->m_pkthdr.len = sc->sc_rx_buffer_len; error = bus_dmamap_load_mbuf(sc->sc_dmat, pkt->pkt_map, - m, BUS_DMA_NOWAIT); + m, BUS_DMA_NOWAIT | + (ISSET(sc->sc_ac.ac_if.if_flags, IFF_LINK0) ? BUS_DMA_BUS4 : 0)); if (error) { m_freem(m); return (error); @@ -2771,8 +2773,9 @@ em_allocate_receive_structures(struct em for (i = 0; i < sc->sc_rx_slots; i++) { pkt = &que->rx.sc_rx_pkts_ring[i]; - error = bus_dmamap_create(sc->sc_dmat, EM_MCLBYTES, 1, - EM_MCLBYTES, 0, BUS_DMA_NOWAIT, &pkt->pkt_map); + error = bus_dmamap_create(sc->sc_dmat, + sc->sc_rx_buffer_len, 1, sc->sc_rx_buffer_len, 0, + BUS_DMA_NOWAIT, &pkt->pkt_map); if (error != 0) { printf("%s: em_allocate_receive_structures: " "bus_dmamap_create failed; error %u\n", @@ -2801,7 +2804,6 @@ em_setup_receive_structures(struct em_so { struct ifnet *ifp = &sc->sc_ac.ac_if; struct em_queue *que; - u_int lwm; if (em_allocate_receive_structures(sc)) return (ENOMEM); @@ -2814,8 +2816,9 @@ em_setup_receive_structures(struct em_so que->rx.sc_rx_desc_tail = 0; que->rx.sc_rx_desc_head = sc->sc_rx_slots - 1; - lwm = max(4, 2 * ((ifp->if_hardmtu / MCLBYTES) + 1)); - if_rxr_init(&que->rx.sc_rx_ring, lwm, sc->sc_rx_slots); + if_rxr_init(&que->rx.sc_rx_ring, + 2 * howmany(ifp->if_hardmtu, sc->sc_rx_buffer_len) + 1, + sc->sc_rx_slots - 1); if (em_rxfill(que) == 0) { printf("%s: unable to fill any rx descriptors\n", Index: if_em.h =================================================================== RCS file: /cvs/src/sys/dev/pci/if_em.h,v diff -u -p -r1.83 if_em.h --- if_em.h 16 Feb 2024 22:30:54 -0000 1.83 +++ if_em.h 29 Oct 2024 09:17:54 -0000 @@ -268,7 +268,7 @@ typedef int boolean_t; #define EM_RXBUFFER_8192 8192 #define EM_RXBUFFER_16384 16384 -#define EM_MCLBYTES (EM_RXBUFFER_2048 + ETHER_ALIGN) +#define EM_MCLBYTES EM_RXBUFFER_2048 #define EM_MAX_SCATTER 64 #define EM_TSO_SIZE 65535