Re-apply changes that were mistakenly lost by the previous revision.
This commit is contained in:
parent
b7b84489c8
commit
846027d4f3
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: if_wm.c,v 1.92 2005/02/18 04:32:35 briggs Exp $ */
|
/* $NetBSD: if_wm.c,v 1.93 2005/02/18 05:58:31 thorpej Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
|
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
|
||||||
@ -47,7 +47,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.92 2005/02/18 04:32:35 briggs Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.93 2005/02/18 05:58:31 thorpej Exp $");
|
||||||
|
|
||||||
#include "bpfilter.h"
|
#include "bpfilter.h"
|
||||||
#include "rnd.h"
|
#include "rnd.h"
|
||||||
@ -796,7 +796,7 @@ wm_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
*/
|
*/
|
||||||
preg = pci_conf_read(pc, pa->pa_tag, i);
|
preg = pci_conf_read(pc, pa->pa_tag, i);
|
||||||
if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
|
if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
|
||||||
aprint_error("%s: WARNING: I/O BAR at zero.",
|
aprint_error("%s: WARNING: I/O BAR at zero.\n",
|
||||||
sc->sc_dev.dv_xname);
|
sc->sc_dev.dv_xname);
|
||||||
} else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
|
} else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
|
||||||
0, &sc->sc_iot, &sc->sc_ioh,
|
0, &sc->sc_iot, &sc->sc_ioh,
|
||||||
@ -1351,7 +1351,6 @@ wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
|
|||||||
struct mbuf *m0 = txs->txs_mbuf;
|
struct mbuf *m0 = txs->txs_mbuf;
|
||||||
struct livengood_tcpip_ctxdesc *t;
|
struct livengood_tcpip_ctxdesc *t;
|
||||||
uint32_t ipcs, tucs;
|
uint32_t ipcs, tucs;
|
||||||
struct ip *ip;
|
|
||||||
struct ether_header *eh;
|
struct ether_header *eh;
|
||||||
int offset, iphl;
|
int offset, iphl;
|
||||||
uint8_t fields = 0;
|
uint8_t fields = 0;
|
||||||
@ -1364,12 +1363,10 @@ wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
|
|||||||
eh = mtod(m0, struct ether_header *);
|
eh = mtod(m0, struct ether_header *);
|
||||||
switch (htons(eh->ether_type)) {
|
switch (htons(eh->ether_type)) {
|
||||||
case ETHERTYPE_IP:
|
case ETHERTYPE_IP:
|
||||||
iphl = sizeof(struct ip);
|
|
||||||
offset = ETHER_HDR_LEN;
|
offset = ETHER_HDR_LEN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ETHERTYPE_VLAN:
|
case ETHERTYPE_VLAN:
|
||||||
iphl = sizeof(struct ip);
|
|
||||||
offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
|
offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1382,38 +1379,7 @@ wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m0->m_len < (offset + iphl)) {
|
iphl = m0->m_pkthdr.csum_data >> 16;
|
||||||
/*
|
|
||||||
* Packet headers aren't in the first mbuf. Let's hope
|
|
||||||
* there is space at the end if it for them.
|
|
||||||
*/
|
|
||||||
WM_EVCNT_INCR(&sc->sc_ev_txpullup_needed);
|
|
||||||
if ((txs->txs_mbuf = m_pullup(m0, offset + iphl)) == NULL) {
|
|
||||||
WM_EVCNT_INCR(&sc->sc_ev_txpullup_nomem);
|
|
||||||
log(LOG_ERR,
|
|
||||||
"%s: wm_tx_offload: mbuf allocation failed, "
|
|
||||||
"packet dropped\n", sc->sc_dev.dv_xname);
|
|
||||||
return (ENOMEM);
|
|
||||||
} else if (m0 != txs->txs_mbuf) {
|
|
||||||
/*
|
|
||||||
* The DMA map has already been loaded, so we
|
|
||||||
* would have to unload and reload it. But then
|
|
||||||
* if that were to fail, we are already committed
|
|
||||||
* to transmitting the packet (can't put it back
|
|
||||||
* on the queue), so we have to drop the packet.
|
|
||||||
*/
|
|
||||||
WM_EVCNT_INCR(&sc->sc_ev_txpullup_fail);
|
|
||||||
log(LOG_ERR, "%s: wm_tx_offload: packet headers did "
|
|
||||||
"not fit in first mbuf, packet dropped\n",
|
|
||||||
sc->sc_dev.dv_xname);
|
|
||||||
m_freem(txs->txs_mbuf);
|
|
||||||
txs->txs_mbuf = NULL;
|
|
||||||
return (EINVAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ip = (struct ip *) (mtod(m0, caddr_t) + offset);
|
|
||||||
iphl = ip->ip_hl << 2;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: Even if we're not using the IP or TCP/UDP checksum
|
* NOTE: Even if we're not using the IP or TCP/UDP checksum
|
||||||
@ -1435,8 +1401,8 @@ wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
|
|||||||
WM_EVCNT_INCR(&sc->sc_ev_txtusum);
|
WM_EVCNT_INCR(&sc->sc_ev_txtusum);
|
||||||
fields |= WTX_TXSM;
|
fields |= WTX_TXSM;
|
||||||
tucs = WTX_TCPIP_TUCSS(offset) |
|
tucs = WTX_TCPIP_TUCSS(offset) |
|
||||||
WTX_TCPIP_TUCSO(offset + m0->m_pkthdr.csum_data) |
|
WTX_TCPIP_TUCSO(offset + (m0->m_pkthdr.csum_data & 0xffff)) |
|
||||||
WTX_TCPIP_TUCSE(0) /* rest of packet */;
|
WTX_TCPIP_TUCSE(0) /* rest of packet */;
|
||||||
} else {
|
} else {
|
||||||
/* Just initialize it to a valid TCP context. */
|
/* Just initialize it to a valid TCP context. */
|
||||||
tucs = WTX_TCPIP_TUCSS(offset) |
|
tucs = WTX_TCPIP_TUCSS(offset) |
|
||||||
@ -2187,11 +2153,15 @@ wm_rxintr(struct wm_softc *sc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Okay, we have the entire packet now...
|
* Okay, we have the entire packet now. The chip is
|
||||||
|
* configured to include the FCS (not all chips can
|
||||||
|
* be configured to strip it), so we need to trim it.
|
||||||
*/
|
*/
|
||||||
|
m->m_len -= ETHER_CRC_LEN;
|
||||||
|
|
||||||
*sc->sc_rxtailp = NULL;
|
*sc->sc_rxtailp = NULL;
|
||||||
m = sc->sc_rxhead;
|
m = sc->sc_rxhead;
|
||||||
len += sc->sc_rxlen;
|
len = m->m_len + sc->sc_rxlen;
|
||||||
|
|
||||||
WM_RXCHAIN_RESET(sc);
|
WM_RXCHAIN_RESET(sc);
|
||||||
|
|
||||||
@ -2220,11 +2190,7 @@ wm_rxintr(struct wm_softc *sc)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* No errors. Receive the packet.
|
* No errors. Receive the packet.
|
||||||
*
|
|
||||||
* Note, we have configured the chip to include the
|
|
||||||
* CRC with every packet.
|
|
||||||
*/
|
*/
|
||||||
m->m_flags |= M_HASFCS;
|
|
||||||
m->m_pkthdr.rcvif = ifp;
|
m->m_pkthdr.rcvif = ifp;
|
||||||
m->m_pkthdr.len = len;
|
m->m_pkthdr.len = len;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user