Index: if_arge.c =================================================================== --- if_arge.c (revision 286142) +++ if_arge.c (working copy) @@ -177,7 +177,6 @@ static int arge_dma_alloc(struct arge_softc *); static void arge_dma_free(struct arge_softc *); static int arge_newbuf(struct arge_softc *, int); -static __inline void arge_fixup_rx(struct mbuf *); static device_method_t arge_methods[] = { /* Device interface */ @@ -2128,8 +2127,8 @@ desc = rxd->desc; if (segs[0].ds_addr & 3) panic("RX packet address unaligned"); - desc->packet_addr = segs[0].ds_addr; - desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len); + desc->packet_addr = segs[0].ds_addr + 2; + desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len - 2); bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag, sc->arge_cdata.arge_rx_ring_map, @@ -2138,25 +2137,6 @@ return (0); } -static __inline void -arge_fixup_rx(struct mbuf *m) -{ - int i; - uint16_t *src, *dst; - - src = mtod(m, uint16_t *); - dst = src - 1; - - for (i = 0; i < m->m_len / sizeof(uint16_t); i++) { - *dst++ = *src++; - } - - if (m->m_len % sizeof(uint16_t)) - *(uint8_t *)dst = *(uint8_t *)src; - - m->m_data -= ETHER_ALIGN; -} - #ifdef DEVICE_POLLING static int arge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) @@ -2277,10 +2257,11 @@ BUS_DMASYNC_POSTREAD); m = rxd->rx_m; - arge_fixup_rx(m); m->m_pkthdr.rcvif = ifp; /* Skip 4 bytes of CRC */ m->m_pkthdr.len = m->m_len = packet_len - ETHER_CRC_LEN; + /* Add 2 to fix data align, after segs[0].ds_addr + 2 */ + m->m_data += 2; if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1); rx_npkts++;