len = MHLEN - pad;
len -= pad;
qe_get(sc, idx, totlen)	struct qesoftc *sc;	int idx, totlen;{	struct ifnet *ifp = &sc->sc_arpcom.ac_if;	struct mbuf *m;	struct mbuf *top, **mp;	int len, pad, boff = 0;	MGETHDR(m, M_DONTWAIT, MT_DATA);	if (m == NULL)		return (NULL);	m->m_pkthdr.rcvif = ifp;	m->m_pkthdr.len = totlen;	pad = ALIGN(sizeof(struct ether_header)) - sizeof(struct ether_header);	m->m_data += pad;	len = MHLEN - pad;	top = NULL;	mp = &top;	while (totlen > 0) {		if (top) {			MGET(m, M_DONTWAIT, MT_DATA);			if (m == NULL) {				m_freem(top);				return NULL;			}			len = MLEN;		}		if (top && totlen >= MINCLSIZE) {			MCLGET(m, M_DONTWAIT);			if (m->m_flags & M_EXT)				len = MCLBYTES;		}		m->m_len = len = min(totlen, len);		bcopy(&sc->sc_bufs->rx_buf[idx % QE_RX_RING_SIZE][boff],		      mtod(m, caddr_t), len);		boff += len;		totlen -= len;		*mp = m;		mp = &m->m_next;	}	return (top);}