On 02/12/2008, at 15:51, "Insan Praja SW" <[EMAIL PROTECTED]> wrote:

On Tue, 02 Dec 2008 11:17:42 +0700, David Gwynne <[EMAIL PROTECTED]> wrote:

hi,

can you please try this diff and see if it solves your panics?


Hi David and Misc@,
I already use the rev1.199 source code which back out the 1.197 source code. But I'm going to give it a try on a non-production machine with identical h/w.

That would be much appreciated, thank you.


Thanks,

Index: if_em.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em.c,v
retrieving revision 1.199
diff -u -p -r1.199 if_em.c
--- if_em.c    29 Nov 2008 10:23:29 -0000    1.199
+++ if_em.c    2 Dec 2008 02:36:08 -0000
@@ -31,7 +31,7 @@ POSSIBILITY OF SUCH DAMAGE.
*** *** *** ******************************************************************/
-/* $OpenBSD: if_em.c,v 1.199 2008/11/29 10:23:29 sthen Exp $ */
+/* $OpenBSD: if_em.c,v 1.197 2008/11/26 00:14:48 dlg Exp $ */
/* $FreeBSD: if_em.c,v 1.46 2004/09/29 18:28:28 mlaier Exp $ */
#include <dev/pci/if_em.h>
@@ -164,6 +164,12 @@ void em_update_stats_counters(struct em_
void em_txeof(struct em_softc *);
int  em_allocate_receive_structures(struct em_softc *);
int  em_allocate_transmit_structures(struct em_softc *);
+#ifdef __STRICT_ALIGNMENT
+void em_realign(struct em_softc *, struct mbuf *, u_int16_t *);
+#else
+#define em_realign(a, b, c) /* a, b, c */
+#endif
+int  em_rxfill(struct em_softc *);
void em_rxeof(struct em_softc *, int);
void em_receive_checksum(struct em_softc *, struct em_rx_desc *,
            struct mbuf *);
@@ -798,6 +804,11 @@ em_intr(void *arg)
       if (ifp->if_flags & IFF_RUNNING) {
           em_rxeof(sc, -1);
+            if (em_rxfill(sc)) {
+                /* Advance the Rx Queue #0 "Tail Pointer". */
+                E1000_WRITE_REG(&sc->hw, RDT,
+                    sc->last_rx_desc_filled);
+            }
           em_txeof(sc);
       }
@@ -1448,15 +1459,15 @@ em_stop(void *arg)
   struct em_softc *sc = arg;
   ifp = &sc->interface_data.ac_if;
+    /* Tell the stack that the interface is no longer active */
+    ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+
   INIT_DEBUGOUT("em_stop: begin");
   em_disable_intr(sc);
   em_reset_hw(&sc->hw);
   timeout_del(&sc->timer_handle);
   timeout_del(&sc->tx_fifo_timer_handle);
-    /* Tell the stack that the interface is no longer active */
-    ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-
   em_free_transmit_structures(sc);
   em_free_receive_structures(sc);
}
@@ -2287,51 +2298,54 @@ int
em_get_buf(struct em_softc *sc, int i)
{
   struct mbuf    *m;
-    bus_dmamap_t    map;
-    struct em_buffer *rx_buffer;
+    struct em_buffer *pkt;
+    struct em_rx_desc *desc;
   int error;
+    pkt = &sc->rx_buffer_area[i];
+    desc = &sc->rx_desc_base[i];
+
+    if (pkt->m_head != NULL) {
+        printf("%s: em_get_buf: slot %d already has an mbuf\n",
+            sc->sc_dv.dv_xname, i);
+        return (ENOBUFS);
+    }
+
   MGETHDR(m, M_DONTWAIT, MT_DATA);
   if (m == NULL) {
       sc->mbuf_alloc_failed++;
       return (ENOBUFS);
   }
-    MCLGET(m, M_DONTWAIT);
+    MCLGETI(m, M_DONTWAIT, &sc->interface_data.ac_if, MCLBYTES);
   if ((m->m_flags & M_EXT) == 0) {
       m_freem(m);
       sc->mbuf_cluster_failed++;
       return (ENOBUFS);
   }
   m->m_len = m->m_pkthdr.len = MCLBYTES;
-
   if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
       m_adj(m, ETHER_ALIGN);
-    /*
-     * Using memory from the mbuf cluster pool, invoke the
-     * bus_dma machinery to arrange the memory mapping.
-     */
-    error = bus_dmamap_load_mbuf(sc->rxtag, sc->rx_sparemap,
-        m, BUS_DMA_NOWAIT);
+ error = bus_dmamap_load_mbuf(sc->rxtag, pkt->map, m, BUS_DMA_NOWAIT);
   if (error) {
       m_freem(m);
       return (error);
   }
-    rx_buffer = &sc->rx_buffer_area[i];
-    if (rx_buffer->m_head != NULL)
-        bus_dmamap_unload(sc->rxtag, rx_buffer->map);
+    bus_dmamap_sync(sc->rxtag, pkt->map, 0, pkt->map->dm_mapsize,
+        BUS_DMASYNC_PREREAD);
+    pkt->m_head = m;
-    map = rx_buffer->map;
-    rx_buffer->map = sc->rx_sparemap;
-    sc->rx_sparemap = map;
+    bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map,
+        sizeof(*desc) * i, sizeof(*desc), BUS_DMASYNC_POSTWRITE);
-    bus_dmamap_sync(sc->rxtag, rx_buffer->map, 0,
-        rx_buffer->map->dm_mapsize, BUS_DMASYNC_PREREAD);
+    bzero(desc, sizeof(*desc));
+    desc->buffer_addr = htole64(pkt->map->dm_segs[0].ds_addr);
-    rx_buffer->m_head = m;
+    bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map,
+        sizeof(*desc) * i, sizeof(*desc), BUS_DMASYNC_PREWRITE);
- sc->rx_desc_base[i].buffer_addr = htole64(rx_buffer->map- >dm_segs[0].ds_addr);
+    sc->rx_ndescs++;
   return (0);
}
@@ -2359,33 +2373,18 @@ em_allocate_receive_structures(struct em
   sc->rxtag = sc->osdep.em_pa.pa_dmat;
-    error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1, MCLBYTES,
-            0, BUS_DMA_NOWAIT, &sc->rx_sparemap);
-    if (error != 0) {
-        printf("%s: em_allocate_receive_structures: "
-            "bus_dmamap_create failed; error %u\n",
-            sc->sc_dv.dv_xname, error);
-        goto fail;
-    }
-
   rx_buffer = sc->rx_buffer_area;
   for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
       error = bus_dmamap_create(sc->rxtag, MCLBYTES, 1,
-                    MCLBYTES, 0, BUS_DMA_NOWAIT,
-                    &rx_buffer->map);
+            MCLBYTES, 0, BUS_DMA_NOWAIT, &rx_buffer->map);
       if (error != 0) {
           printf("%s: em_allocate_receive_structures: "
               "bus_dmamap_create failed; error %u\n",
               sc->sc_dv.dv_xname, error);
           goto fail;
       }
+        rx_buffer->m_head = NULL;
   }
-
-    for (i = 0; i < sc->num_rx_desc; i++) {
-        error = em_get_buf(sc, i);
-        if (error != 0)
-            goto fail;
-        }
   bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
       sc->rxdma.dma_map->dm_mapsize,
       BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
@@ -2413,6 +2412,14 @@ em_setup_receive_structures(struct em_so
   /* Setup our descriptor pointers */
   sc->next_rx_desc_to_check = 0;
+    sc->last_rx_desc_filled = sc->num_rx_desc - 1;
+
+    em_rxfill(sc);
+    if (sc->rx_ndescs < 1) {
+        printf("%s: unable to fill any rx descriptors\n",
+            sc->sc_dv.dv_xname);
+    }
+
   return (0);
}
@@ -2492,7 +2499,7 @@ em_initialize_receive_unit(struct em_sof
   /* Setup the HW Rx Head and Tail Descriptor Pointers */
   E1000_WRITE_REG(&sc->hw, RDH, 0);
-    E1000_WRITE_REG(&sc->hw, RDT, sc->num_rx_desc - 1);
+    E1000_WRITE_REG(&sc->hw, RDT, sc->last_rx_desc_filled);
}
/ *********************************************************************
@@ -2508,30 +2515,18 @@ em_free_receive_structures(struct em_sof
   INIT_DEBUGOUT("free_receive_structures: begin");
-    if (sc->rx_sparemap) {
-        bus_dmamap_destroy(sc->rxtag, sc->rx_sparemap);
-        sc->rx_sparemap = NULL;
-    }
   if (sc->rx_buffer_area != NULL) {
       rx_buffer = sc->rx_buffer_area;
       for (i = 0; i < sc->num_rx_desc; i++, rx_buffer++) {
-            if (rx_buffer->map != NULL &&
-                rx_buffer->map->dm_nsegs > 0) {
+            if (rx_buffer->m_head != NULL) {
               bus_dmamap_sync(sc->rxtag, rx_buffer->map,
                   0, rx_buffer->map->dm_mapsize,
                   BUS_DMASYNC_POSTREAD);
-                bus_dmamap_unload(sc->rxtag,
-                    rx_buffer->map);
-            }
-            if (rx_buffer->m_head != NULL) {
+                bus_dmamap_unload(sc->rxtag, rx_buffer->map);
               m_freem(rx_buffer->m_head);
               rx_buffer->m_head = NULL;
           }
-            if (rx_buffer->map != NULL) {
-                bus_dmamap_destroy(sc->rxtag,
-                    rx_buffer->map);
-                rx_buffer->map = NULL;
-            }
+            bus_dmamap_destroy(sc->rxtag, rx_buffer->map);
       }
   }
   if (sc->rx_buffer_area != NULL) {
@@ -2540,6 +2535,81 @@ em_free_receive_structures(struct em_sof
   }
   if (sc->rxtag != NULL)
       sc->rxtag = NULL;
+
+    if (sc->fmp != NULL) {
+        m_freem(sc->fmp);
+        sc->fmp = NULL;
+        sc->lmp = NULL;
+    }
+}
+
+#ifdef __STRICT_ALIGNMENT
+void
+em_realign(struct em_softc *sc, struct mbuf *m, u_int16_t *prev_len_adj)
+{
+    unsigned char tmp_align_buf[ETHER_ALIGN];
+    int tmp_align_buf_len = 0;
+
+    /*
+     * The Ethernet payload is not 32-bit aligned when
+     * Jumbo packets are enabled, so on architectures with
+     * strict alignment we need to shift the entire packet
+     * ETHER_ALIGN bytes. Ugh.
+     */
+    if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
+        return;
+
+    if (*prev_len_adj > sc->align_buf_len)
+        *prev_len_adj -= sc->align_buf_len;
+    else
+        *prev_len_adj = 0;
+
+    if (m->m_len > (MCLBYTES - ETHER_ALIGN)) {
+        bcopy(m->m_data + (MCLBYTES - ETHER_ALIGN),
+            &tmp_align_buf, ETHER_ALIGN);
+        tmp_align_buf_len = m->m_len -
+            (MCLBYTES - ETHER_ALIGN);
+        m->m_len -= ETHER_ALIGN;
+    }
+
+    if (m->m_len) {
+        bcopy(m->m_data, m->m_data + ETHER_ALIGN, m->m_len);
+        if (!sc->align_buf_len)
+            m->m_data += ETHER_ALIGN;
+    }
+
+    if (sc->align_buf_len) {
+        m->m_len += sc->align_buf_len;
+        bcopy(&sc->align_buf, m->m_data, sc->align_buf_len);
+    }
+
+    if (tmp_align_buf_len)
+        bcopy(&tmp_align_buf, &sc->align_buf, tmp_align_buf_len);
+
+    sc->align_buf_len = tmp_align_buf_len;
+}
+#endif /* __STRICT_ALIGNMENT */
+
+int
+em_rxfill(struct em_softc *sc)
+{
+    int post = 0;
+    int i;
+
+    i = sc->last_rx_desc_filled;
+
+    while (sc->rx_ndescs < sc->num_rx_desc) {
+        if (++i == sc->num_rx_desc)
+            i = 0;
+
+        if (em_get_buf(sc, i) != 0)
+            break;
+
+        sc->last_rx_desc_filled = i;
+        post = 1;
+    }
+
+    return (post);
}
/ *********************************************************************
@@ -2555,44 +2625,62 @@ em_free_receive_structures(struct em_sof
void
em_rxeof(struct em_softc *sc, int count)
{
-    struct ifnet        *ifp;
-    struct mbuf        *mp;
+    struct ifnet        *ifp = &sc->interface_data.ac_if;
+    struct mbuf        *m;
   u_int8_t        accept_frame = 0;
   u_int8_t        eop = 0;
   u_int16_t        len, desc_len, prev_len_adj;
   int            i;
   /* Pointer to the receive descriptor being examined. */
-    struct em_rx_desc   *current_desc;
+    struct em_rx_desc   *desc;
+    struct em_buffer    *pkt;
   u_int8_t        status;
   ifp = &sc->interface_data.ac_if;
-    i = sc->next_rx_desc_to_check;
-    current_desc = &sc->rx_desc_base[i];
-    bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
-        sc->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
-    if (!((current_desc->status) & E1000_RXD_STAT_DD))
+    if (!ISSET(ifp->if_flags, IFF_RUNNING))
       return;
-    while ((current_desc->status & E1000_RXD_STAT_DD) &&
-        (count != 0) &&
-        (ifp->if_flags & IFF_RUNNING)) {
-        struct mbuf *m = NULL;
+    i = sc->next_rx_desc_to_check;
-        mp = sc->rx_buffer_area[i].m_head;
-        /*
-         * Can't defer bus_dmamap_sync(9) because TBI_ACCEPT
-         * needs to access the last received byte in the mbuf.
-         */
-        bus_dmamap_sync(sc->rxtag, sc->rx_buffer_area[i].map,
-            0, sc->rx_buffer_area[i].map->dm_mapsize,
+    while (count != 0 && sc->rx_ndescs > 1) {
+        m = NULL;
+
+        desc = &sc->rx_desc_base[i];
+        pkt = &sc->rx_buffer_area[i];
+
+        bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map,
+            sizeof(*desc) * i, sizeof(*desc),
+            BUS_DMASYNC_POSTREAD);
+
+        status = desc->status;
+        if (!ISSET(status, E1000_RXD_STAT_DD)) {
+            bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map,
+                sizeof(*desc) * i, sizeof(*desc),
+                BUS_DMASYNC_PREREAD);
+            break;
+        }
+
+        /* pull the mbuf off the ring */
+ bus_dmamap_sync(sc->rxtag, pkt->map, 0, pkt->map- >dm_mapsize,
           BUS_DMASYNC_POSTREAD);
+        bus_dmamap_unload(sc->rxtag, pkt->map);
+        m = pkt->m_head;
+        pkt->m_head = NULL;
+
+        if (m == NULL) {
+            panic("em_rxeof: NULL mbuf in slot %d "
+                "(nrx %d, filled %d)", i, sc->rx_ndescs,
+                sc->last_rx_desc_filled);
+        }
+
+        sc->rx_ndescs--;
       accept_frame = 1;
       prev_len_adj = 0;
-        desc_len = letoh16(current_desc->length);
-        status = current_desc->status;
+        desc_len = letoh16(desc->length);
+
       if (status & E1000_RXD_STAT_EOP) {
           count--;
           eop = 1;
@@ -2606,20 +2694,18 @@ em_rxeof(struct em_softc *sc, int count)
           len = desc_len;
       }
-        if (current_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
+        if (desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK) {
           u_int8_t last_byte;
           u_int32_t pkt_len = desc_len;
           if (sc->fmp != NULL)
               pkt_len += sc->fmp->m_pkthdr.len;
-            last_byte = *(mtod(mp, caddr_t) + desc_len - 1);
-            if (TBI_ACCEPT(&sc->hw, status, current_desc->errors,
+            last_byte = *(mtod(m, caddr_t) + desc_len - 1);
+            if (TBI_ACCEPT(&sc->hw, status, desc->errors,
               pkt_len, last_byte)) {
-                em_tbi_adjust_stats(&sc->hw,
-                            &sc->stats,
-                            pkt_len,
-                            sc->hw.mac_addr);
+                em_tbi_adjust_stats(&sc->hw, &sc->stats,
+                    pkt_len, sc->hw.mac_addr);
               if (len > 0)
                   len--;
           } else
@@ -2627,70 +2713,18 @@ em_rxeof(struct em_softc *sc, int count)
       }
       if (accept_frame) {
-            if (em_get_buf(sc, i) != 0) {
-                sc->dropped_pkts++;
-                goto discard;
-            }
-
           /* Assign correct length to the current fragment */
-            mp->m_len = len;
-
-#ifdef __STRICT_ALIGNMENT
-            /*
-             * The Ethernet payload is not 32-bit aligned when
-             * Jumbo packets are enabled, so on architectures with
-             * strict alignment we need to shift the entire packet
-             * ETHER_ALIGN bytes. Ugh.
-             */
-            if (sc->hw.max_frame_size > (MCLBYTES - ETHER_ALIGN)) {
-                unsigned char tmp_align_buf[ETHER_ALIGN];
-                int tmp_align_buf_len = 0;
-
-                if (prev_len_adj > sc->align_buf_len)
-                    prev_len_adj -= sc->align_buf_len;
-                else
-                    prev_len_adj = 0;
-
-                if (mp->m_len > (MCLBYTES - ETHER_ALIGN)) {
-                    bcopy(mp->m_data +
-                        (MCLBYTES - ETHER_ALIGN),
-                        &tmp_align_buf,
-                        ETHER_ALIGN);
-                    tmp_align_buf_len = mp->m_len -
-                        (MCLBYTES - ETHER_ALIGN);
-                    mp->m_len -= ETHER_ALIGN;
-                }
-
-                if (mp->m_len) {
-                    bcopy(mp->m_data,
-                        mp->m_data + ETHER_ALIGN,
-                        mp->m_len);
-                    if (!sc->align_buf_len)
-                        mp->m_data += ETHER_ALIGN;
-                }
+            m->m_len = len;
-                if (sc->align_buf_len) {
-                    mp->m_len += sc->align_buf_len;
-                    bcopy(&sc->align_buf,
-                        mp->m_data,
-                        sc->align_buf_len);
-                }
-
-                if (tmp_align_buf_len)
-                    bcopy(&tmp_align_buf,
-                        &sc->align_buf,
-                        tmp_align_buf_len);
-                sc->align_buf_len = tmp_align_buf_len;
-            }
-#endif /* __STRICT_ALIGNMENT */
+            em_realign(sc, m, &prev_len_adj); /* STRICT_ALIGN */
           if (sc->fmp == NULL) {
-                mp->m_pkthdr.len = mp->m_len;
-                sc->fmp = mp;     /* Store the first mbuf */
-                sc->lmp = mp;
+                m->m_pkthdr.len = m->m_len;
+                sc->fmp = m;     /* Store the first mbuf */
+                sc->lmp = m;
           } else {
               /* Chain mbuf's together */
-                mp->m_flags &= ~M_PKTHDR;
+                m->m_flags &= ~M_PKTHDR;
               /*
                * Adjust length of previous mbuf in chain if
                * we received less than 4 bytes in the last
@@ -2700,81 +2734,59 @@ em_rxeof(struct em_softc *sc, int count)
                   sc->lmp->m_len -= prev_len_adj;
                   sc->fmp->m_pkthdr.len -= prev_len_adj;
               }
-                sc->lmp->m_next = mp;
-                sc->lmp = sc->lmp->m_next;
-                sc->fmp->m_pkthdr.len += mp->m_len;
+                sc->lmp->m_next = m;
+                sc->lmp = m;
+                sc->fmp->m_pkthdr.len += m->m_len;
           }
           if (eop) {
-                sc->fmp->m_pkthdr.rcvif = ifp;
               ifp->if_ipackets++;
-                em_receive_checksum(sc, current_desc, sc->fmp);
+                m = sc->fmp;
+                m->m_pkthdr.rcvif = ifp;
+
+                em_receive_checksum(sc, desc, m);
#if NVLAN > 0
-                if (current_desc->status & E1000_RXD_STAT_VP) {
-                    sc->fmp->m_pkthdr.ether_vtag =
-                        (current_desc->special &
+                if (desc->status & E1000_RXD_STAT_VP) {
+                    m->m_pkthdr.ether_vtag =
+                        (desc->special &
                        E1000_RXD_SPC_VLAN_MASK);
-                    sc->fmp->m_flags |= M_VLANTAG;
+                    m->m_flags |= M_VLANTAG;
+                }
+#endif
+#if NBPFILTER > 0
+                if (ifp->if_bpf) {
+                    bpf_mtap_ether(ifp->if_bpf, m,
+                        BPF_DIRECTION_IN);
               }
#endif
-                m = sc->fmp;
+                ether_input_mbuf(ifp, m);
+
               sc->fmp = NULL;
               sc->lmp = NULL;
           }
       } else {
           sc->dropped_pkts++;
-discard:
-            /* Reuse loaded DMA map and just update mbuf chain */
-            mp = sc->rx_buffer_area[i].m_head;
-            mp->m_len = mp->m_pkthdr.len = MCLBYTES;
-            mp->m_data = mp->m_ext.ext_buf;
-            mp->m_next = NULL;
-            if (sc->hw.max_frame_size <= (MCLBYTES - ETHER_ALIGN))
-                m_adj(mp, ETHER_ALIGN);
+
           if (sc->fmp != NULL) {
                 m_freem(sc->fmp);
               sc->fmp = NULL;
               sc->lmp = NULL;
           }
-            m = NULL;
+
+            m_freem(m);
       }
-        /* Zero out the receive descriptors status. */
-        current_desc->status = 0;
-        bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map, 0,
-            sc->rxdma.dma_map->dm_mapsize,
-            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+        bus_dmamap_sync(sc->rxdma.dma_tag, sc->rxdma.dma_map,
+            sizeof(*desc) * i, sizeof(*desc),
+            BUS_DMASYNC_PREREAD);
       /* Advance our pointers to the next descriptor. */
       if (++i == sc->num_rx_desc)
           i = 0;
-        if (m != NULL) {
-            sc->next_rx_desc_to_check = i;
-
-#if NBPFILTER > 0
-            /*
-             * Handle BPF listeners. Let the BPF
-             * user see the packet.
-             */
-            if (ifp->if_bpf)
-                bpf_mtap_ether(ifp->if_bpf, m,
-                    BPF_DIRECTION_IN);
-#endif
-
-            ether_input_mbuf(ifp, m);
-
-            i = sc->next_rx_desc_to_check;
-        }
-        current_desc = &sc->rx_desc_base[i];
   }
   sc->next_rx_desc_to_check = i;
-
-    /* Advance the E1000's Receive Queue #0  "Tail Pointer". */
-    if (--i < 0)
-        i = sc->num_rx_desc - 1;
-    E1000_WRITE_REG(&sc->hw, RDT, i);
}
/ *********************************************************************
Index: if_em.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_em.h,v
retrieving revision 1.40
diff -u -p -r1.40 if_em.h
--- if_em.h    29 Nov 2008 10:23:29 -0000    1.40
+++ if_em.h    2 Dec 2008 02:36:08 -0000
@@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.
*** *** *** ******************************************************************/
/* $FreeBSD: if_em.h,v 1.26 2004/09/01 23:22:41 pdeuskar Exp $ */
-/* $OpenBSD: if_em.h,v 1.40 2008/11/29 10:23:29 sthen Exp $ */
+/* $OpenBSD: if_em.h,v 1.37 2008/07/22 11:20:10 martynas Exp $ */
#ifndef _EM_H_DEFINED_
#define _EM_H_DEFINED_
@@ -379,6 +379,8 @@ struct em_softc {
struct em_dma_alloc rxdma; /* bus_dma glue for rx desc */
   struct em_rx_desc    *rx_desc_base;
   u_int32_t        next_rx_desc_to_check;
+    u_int32_t        last_rx_desc_filled;
+    int            rx_ndescs;
   u_int32_t        rx_buffer_len;
   u_int16_t        num_rx_desc;
   struct em_buffer    *rx_buffer_area;



--
insandotpraja(at)gmaildotcom

Reply via email to