network interface driver changes:
o don't strip the Ethernet header from inbound packets; pass packets up the stack intact (required significant changes to some drivers) o reference common definitions in net/ethernet.h (e.g. ETHER_ALIGN) o track ether_ifattach/ether_ifdetach API changes o track bpf changes (use BPF_TAP and BPF_MTAP) o track vlan changes (ifnet capabilities, revised processing scheme, etc.) o use if_input to pass packets "up" o call ether_ioctl for default handling of ioctls Reviewed by: many Approved by: re
This commit is contained in:
parent
10eb947d27
commit
14c32b5f40
@ -190,6 +190,10 @@ static char an_conf[256];
|
||||
/* sysctl vars */
|
||||
SYSCTL_NODE(_machdep, OID_AUTO, an, CTLFLAG_RD, 0, "dump RID");
|
||||
|
||||
/* XXX violate ethernet/netgraph callback hooks */
|
||||
extern void (*ng_ether_attach_p)(struct ifnet *ifp);
|
||||
extern void (*ng_ether_detach_p)(struct ifnet *ifp);
|
||||
|
||||
static int
|
||||
sysctl_an_dump(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
@ -499,7 +503,7 @@ an_attach(sc, unit, flags)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
callout_handle_init(&sc->an_stat_ch);
|
||||
AN_UNLOCK(sc);
|
||||
|
||||
@ -592,9 +596,7 @@ an_rxeof(sc)
|
||||
rx_frame.an_rx_payload_len);
|
||||
}
|
||||
/* dump raw 802.11 packet to bpf and skip ip stack */
|
||||
if (ifp->if_bpf != NULL) {
|
||||
bpf_tap(ifp, bpf_buf, len);
|
||||
}
|
||||
BPF_TAP(ifp, bpf_buf, len);
|
||||
} else {
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
if (m == NULL) {
|
||||
@ -654,11 +656,10 @@ an_rxeof(sc)
|
||||
ifp->if_ipackets++;
|
||||
|
||||
/* Receive packet. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
#ifdef ANCACHE
|
||||
an_cache_store(sc, eh, m, rx_frame.an_rx_signal_strength);
|
||||
#endif
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1293,11 +1294,6 @@ an_ioctl(ifp, command, data)
|
||||
}
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_flags & IFF_RUNNING &&
|
||||
@ -1809,7 +1805,7 @@ an_ioctl(ifp, command, data)
|
||||
an_setdef(sc, &sc->areq);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
out:
|
||||
@ -2021,8 +2017,7 @@ an_start(ifp)
|
||||
* If there's a BPF listner, bounce a copy of
|
||||
* this frame to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m0);
|
||||
BPF_MTAP(ifp, m0);
|
||||
|
||||
m_freem(m0);
|
||||
m0 = NULL;
|
||||
|
@ -140,7 +140,7 @@ an_detach_isa(device_t dev)
|
||||
|
||||
an_stop(sc);
|
||||
ifmedia_removeall(&sc->an_ifmedia);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||
an_release_resources(dev);
|
||||
|
||||
|
@ -144,7 +144,7 @@ an_pccard_detach(device_t dev)
|
||||
an_stop(sc);
|
||||
ifmedia_removeall(&sc->an_ifmedia);
|
||||
ifp->if_flags &= ~IFF_RUNNING;
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
sc->an_gone = 1;
|
||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||
an_release_resources(dev);
|
||||
|
@ -202,7 +202,7 @@ an_detach_pci(device_t dev)
|
||||
|
||||
an_stop(sc);
|
||||
ifmedia_removeall(&sc->an_ifmedia);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||
an_release_resources(dev);
|
||||
|
||||
|
@ -700,8 +700,7 @@ top_arstart:
|
||||
i++;
|
||||
|
||||
#ifndef NETGRAPH
|
||||
if(ifp->if_bpf)
|
||||
bpf_mtap(ifp, mtx);
|
||||
BPF_MTAP(ifp, mtx);
|
||||
m_freem(mtx);
|
||||
++sc->ifsppp.pp_if.if_opackets;
|
||||
#else /* NETGRAPH */
|
||||
@ -1703,8 +1702,7 @@ ar_get_packets(struct ar_softc *sc)
|
||||
}
|
||||
ar_copy_rxbuf(m, sc, len);
|
||||
#ifndef NETGRAPH
|
||||
if(sc->ifsppp.pp_if.if_bpf)
|
||||
bpf_mtap(&sc->ifsppp.pp_if, m);
|
||||
BPF_MTAP(&sc->ifsppp.pp_if, m);
|
||||
sppp_input(&sc->ifsppp.pp_if, m);
|
||||
sc->ifsppp.pp_if.if_ipackets++;
|
||||
#else /* NETGRAPH */
|
||||
|
@ -217,8 +217,8 @@ int awi_dump_len = 28;
|
||||
#define AWI_BPF_RAW 1
|
||||
#ifdef __FreeBSD__
|
||||
#define AWI_BPF_MTAP(sc, m, raw) do { \
|
||||
if ((sc)->sc_ifp->if_bpf && (sc)->sc_rawbpf == (raw)) \
|
||||
bpf_mtap((sc)->sc_ifp, (m)); \
|
||||
if ((sc)->sc_rawbpf == (raw)) \
|
||||
BPF_MTAP((sc)->sc_ifp, (m)); \
|
||||
} while (0);
|
||||
#else
|
||||
#define AWI_BPF_MTAP(sc, m, raw) do { \
|
||||
@ -239,6 +239,7 @@ int awi_dump_len = 28;
|
||||
devclass_t awi_devclass;
|
||||
#endif
|
||||
|
||||
#if __FreeBSD_version < 500043
|
||||
/* NetBSD compatible functions */
|
||||
static char * ether_sprintf(u_int8_t *);
|
||||
|
||||
@ -252,6 +253,7 @@ ether_sprintf(enaddr)
|
||||
return strbuf;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int
|
||||
awi_attach(sc)
|
||||
@ -317,7 +319,7 @@ awi_attach(sc)
|
||||
printf("%s: address %s\n",
|
||||
sc->sc_dev.dv_xname, ether_sprintf(sc->sc_mib_addr.aMAC_Address));
|
||||
#ifdef __FreeBSD__
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->sc_mib_addr.aMAC_Address);
|
||||
#else
|
||||
if_attach(ifp);
|
||||
ether_ifattach(ifp, sc->sc_mib_addr.aMAC_Address);
|
||||
@ -1370,9 +1372,6 @@ awi_input(sc, m, rxts, rssi)
|
||||
{
|
||||
struct ifnet *ifp = sc->sc_ifp;
|
||||
struct ieee80211_frame *wh;
|
||||
#ifndef __NetBSD__
|
||||
struct ether_header *eh;
|
||||
#endif
|
||||
|
||||
/* trim CRC here for WEP can find its own CRC at the end of packet. */
|
||||
m_adj(m, -ETHER_CRC_LEN);
|
||||
@ -1430,13 +1429,7 @@ awi_input(sc, m, rxts, rssi)
|
||||
#if !(defined(__FreeBSD__) && __FreeBSD_version >= 400000)
|
||||
AWI_BPF_MTAP(sc, m, AWI_BPF_NORM);
|
||||
#endif
|
||||
#ifdef __NetBSD__
|
||||
(*ifp->if_input)(ifp, m);
|
||||
#else
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m_adj(m, sizeof(*eh));
|
||||
ether_input(ifp, eh, m);
|
||||
#endif
|
||||
break;
|
||||
case IEEE80211_FC0_TYPE_MGT:
|
||||
if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) !=
|
||||
|
@ -234,7 +234,7 @@ awi_pccard_detach(device_t dev)
|
||||
struct awi_softc *sc = &psc->sc_awi;
|
||||
struct ifnet *ifp = &sc->sc_ec.ac_if;
|
||||
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
ifp->if_flags &= ~IFF_RUNNING;
|
||||
if (psc->sc_intrhand) {
|
||||
bus_teardown_intr(dev, psc->sc_irq_res, psc->sc_intrhand);
|
||||
|
@ -1594,7 +1594,7 @@ bge_attach(dev)
|
||||
ifp->if_mtu = ETHERMTU;
|
||||
ifp->if_snd.ifq_maxlen = BGE_TX_RING_CNT - 1;
|
||||
ifp->if_hwassist = BGE_CSUM_FEATURES;
|
||||
ifp->if_capabilities = IFCAP_HWCSUM;
|
||||
ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
|
||||
ifp->if_capenable = ifp->if_capabilities;
|
||||
|
||||
/* Save ASIC rev. */
|
||||
@ -1669,7 +1669,7 @@ bge_attach(dev)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
callout_handle_init(&sc->bge_stat_ch);
|
||||
|
||||
fail:
|
||||
@ -1691,7 +1691,7 @@ bge_detach(dev)
|
||||
sc = device_get_softc(dev);
|
||||
ifp = &sc->arpcom.ac_if;
|
||||
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
bge_stop(sc);
|
||||
bge_reset(sc);
|
||||
|
||||
@ -1913,9 +1913,6 @@ bge_rxeof(sc)
|
||||
m->m_pkthdr.len = m->m_len = cur_rx->bge_len;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
#if 0 /* currently broken for some packets, possibly related to TCP options */
|
||||
if (ifp->if_hwassist) {
|
||||
m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
|
||||
@ -1930,16 +1927,13 @@ bge_rxeof(sc)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we received a packet with a vlan tag, pass it
|
||||
* to vlan_input() instead of ether_input().
|
||||
* If we received a packet with a vlan tag,
|
||||
* attach that information to the packet.
|
||||
*/
|
||||
if (have_tag) {
|
||||
VLAN_INPUT_TAG(eh, m, vlan_tag);
|
||||
have_tag = vlan_tag = 0;
|
||||
continue;
|
||||
}
|
||||
if (have_tag)
|
||||
VLAN_INPUT_TAG(ifp, m, vlan_tag, continue);
|
||||
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
CSR_WRITE_4(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx);
|
||||
@ -2164,12 +2158,7 @@ bge_encap(sc, m_head, txidx)
|
||||
struct mbuf *m;
|
||||
u_int32_t frag, cur, cnt = 0;
|
||||
u_int16_t csum_flags = 0;
|
||||
struct ifvlan *ifv = NULL;
|
||||
|
||||
if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
|
||||
m_head->m_pkthdr.rcvif != NULL &&
|
||||
m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
|
||||
ifv = m_head->m_pkthdr.rcvif->if_softc;
|
||||
struct m_tag *mtag;
|
||||
|
||||
m = m_head;
|
||||
cur = frag = *txidx;
|
||||
@ -2185,6 +2174,8 @@ bge_encap(sc, m_head, txidx)
|
||||
csum_flags |= BGE_TXBDFLAG_IP_FRAG;
|
||||
}
|
||||
|
||||
mtag = VLAN_OUTPUT_TAG(&sc->arpcom.ac_if, m);
|
||||
|
||||
/*
|
||||
* Start packing the mbufs in this chain into
|
||||
* the fragment pointers. Stop when we run out
|
||||
@ -2199,9 +2190,9 @@ bge_encap(sc, m_head, txidx)
|
||||
vtophys(mtod(m, vm_offset_t));
|
||||
f->bge_len = m->m_len;
|
||||
f->bge_flags = csum_flags;
|
||||
if (ifv != NULL) {
|
||||
if (mtag != NULL) {
|
||||
f->bge_flags |= BGE_TXBDFLAG_VLAN_TAG;
|
||||
f->bge_vlan_tag = ifv->ifv_tag;
|
||||
f->bge_vlan_tag = VLAN_TAG_VALUE(mtag);
|
||||
} else {
|
||||
f->bge_vlan_tag = 0;
|
||||
}
|
||||
@ -2289,8 +2280,7 @@ bge_start(ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
}
|
||||
|
||||
/* Transmit */
|
||||
@ -2538,10 +2528,6 @@ bge_ioctl(ifp, command, data)
|
||||
s = splimp();
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFMTU:
|
||||
if (ifr->ifr_mtu > BGE_JUMBO_MTU)
|
||||
error = EINVAL;
|
||||
@ -2610,7 +2596,7 @@ bge_ioctl(ifp, command, data)
|
||||
error = 0;
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1986,17 +1986,6 @@ struct bge_gib {
|
||||
struct bge_rcb bge_return_rcb;
|
||||
};
|
||||
|
||||
/*
|
||||
* NOTE! On the Alpha, we have an alignment constraint.
|
||||
* The first thing in the packet is a 14-byte Ethernet header.
|
||||
* This means that the packet is misaligned. To compensate,
|
||||
* we actually offset the data 2 bytes into the cluster. This
|
||||
* alignes the packet after the Ethernet header at a 32-bit
|
||||
* boundary.
|
||||
*/
|
||||
|
||||
#define ETHER_ALIGN 2
|
||||
|
||||
#define BGE_FRAMELEN 1518
|
||||
#define BGE_MAX_FRAMELEN 1536
|
||||
#define BGE_JUMBO_FRAMELEN 9018
|
||||
|
@ -519,8 +519,7 @@ cm_start(ifp)
|
||||
* (can't give the copy in A2060 card RAM to bpf, because
|
||||
* that RAM is just accessed as on every other byte)
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
#ifdef CM_DEBUG
|
||||
if (m->m_len < ARC_HDRLEN)
|
||||
|
@ -850,8 +850,7 @@ cnw_start(ifp)
|
||||
bpf_mtap(ifp->if_bpf, m0);
|
||||
#endif
|
||||
#else /* FreeBSD */
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m0);
|
||||
BPF_MTAP(ifp, m0);
|
||||
#endif
|
||||
|
||||
cnw_transmit(sc, m0);
|
||||
@ -1024,7 +1023,6 @@ cnw_recv(sc)
|
||||
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
|
||||
#else
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
struct ether_header *eh;
|
||||
#endif
|
||||
struct mbuf *m;
|
||||
|
||||
@ -1053,19 +1051,10 @@ cnw_recv(sc)
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp->if_bpf, m);
|
||||
#endif
|
||||
#else /* FreeBSD */
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
#endif
|
||||
|
||||
/* Pass the packet up. */
|
||||
#if !defined(__FreeBSD__)
|
||||
(*ifp->if_input)(ifp, m);
|
||||
#else
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, m) ;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -1660,7 +1649,7 @@ static int cnw_pccard_attach(device_t dev)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
/* callout_handle_init(&sc->cnw_stat_ch); */
|
||||
|
||||
return(0);
|
||||
|
@ -657,7 +657,7 @@ cs_attach(struct cs_softc *sc, int unit, int flags)
|
||||
ifmedia_set(&sc->media, media);
|
||||
cs_mediaset(sc, media);
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
}
|
||||
|
||||
if (bootverbose)
|
||||
@ -750,8 +750,7 @@ cs_init(void *xsc)
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the packet from the board and send it to the upper layer
|
||||
* via ether_input().
|
||||
* Get the packet from the board and send it to the upper layer.
|
||||
*/
|
||||
static int
|
||||
cs_get_packet(struct cs_softc *sc)
|
||||
@ -811,12 +810,8 @@ cs_get_packet(struct cs_softc *sc)
|
||||
|
||||
if (status & (RX_IA | RX_BROADCAST) ||
|
||||
(ifp->if_flags & IFF_MULTICAST && status & RX_HASHED)) {
|
||||
m->m_pkthdr.len -= sizeof(struct ether_header);
|
||||
m->m_len -= sizeof(struct ether_header);
|
||||
m->m_data += sizeof(struct ether_header);
|
||||
|
||||
/* Feed the packet to the upper layer */
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
ifp->if_ipackets++;
|
||||
|
||||
@ -961,9 +956,7 @@ cs_start(struct ifnet *ifp)
|
||||
|
||||
cs_write_mbufs(sc, m);
|
||||
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, m);
|
||||
}
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
m_freem(m);
|
||||
}
|
||||
@ -1085,12 +1078,6 @@ cs_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
|
||||
s=splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* Switch interface state between "running" and
|
||||
@ -1132,7 +1119,8 @@ cs_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
(void) splx(s);
|
||||
|
@ -1642,7 +1642,7 @@ ed_attach(sc, unit, flags)
|
||||
/*
|
||||
* Attach the interface
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
}
|
||||
/* device attach does transition from UNCONFIGURED to IDLE state */
|
||||
|
||||
@ -2127,9 +2127,7 @@ outloop:
|
||||
/*
|
||||
* Tap off here if there is a bpf listener.
|
||||
*/
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, m0);
|
||||
}
|
||||
BPF_MTAP(ifp, m0);
|
||||
|
||||
m_freem(m0);
|
||||
|
||||
@ -2565,13 +2563,6 @@ ed_ioctl(ifp, command, data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
|
||||
/*
|
||||
@ -2631,7 +2622,7 @@ ed_ioctl(ifp, command, data)
|
||||
#endif
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
}
|
||||
(void) splx(s);
|
||||
return (error);
|
||||
@ -2683,6 +2674,7 @@ ed_get_packet(sc, buf, len)
|
||||
char *buf;
|
||||
u_short len;
|
||||
{
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
|
||||
@ -2690,7 +2682,7 @@ ed_get_packet(sc, buf, len)
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
if (m == NULL)
|
||||
return;
|
||||
m->m_pkthdr.rcvif = &sc->arpcom.ac_if;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = len;
|
||||
|
||||
/*
|
||||
@ -2721,11 +2713,11 @@ ed_get_packet(sc, buf, len)
|
||||
* Don't read in the entire packet if we know we're going to drop it
|
||||
* and no bpf is active.
|
||||
*/
|
||||
if (!sc->arpcom.ac_if.if_bpf && BDG_ACTIVE( (&sc->arpcom.ac_if) ) ) {
|
||||
if (!ifp->if_bpf && BDG_ACTIVE( (ifp) ) ) {
|
||||
struct ifnet *bif;
|
||||
|
||||
ed_ring_copy(sc, buf, (char *)eh, ETHER_HDR_LEN);
|
||||
bif = bridge_in_ptr(&sc->arpcom.ac_if, eh) ;
|
||||
bif = bridge_in_ptr(ifp, eh) ;
|
||||
if (bif == BDG_DROP) {
|
||||
m_freem(m);
|
||||
return;
|
||||
@ -2739,13 +2731,9 @@ ed_get_packet(sc, buf, len)
|
||||
*/
|
||||
ed_ring_copy(sc, buf, (char *)eh, len);
|
||||
|
||||
/*
|
||||
* Remove link layer address.
|
||||
*/
|
||||
m->m_pkthdr.len = m->m_len = len - sizeof(struct ether_header);
|
||||
m->m_data += sizeof(struct ether_header);
|
||||
m->m_pkthdr.len = m->m_len = len;
|
||||
|
||||
ether_input(&sc->arpcom.ac_if, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -106,7 +106,7 @@ ed_pccard_detach(device_t dev)
|
||||
}
|
||||
ed_stop(sc);
|
||||
ifp->if_flags &= ~IFF_RUNNING;
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
sc->gone = 1;
|
||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||
ed_release_resources(dev);
|
||||
|
@ -398,7 +398,7 @@ em_detach(device_t dev)
|
||||
|
||||
em_stop(adapter);
|
||||
em_phy_hw_reset(&adapter->hw);
|
||||
ether_ifdetach(&adapter->interface_data.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&adapter->interface_data.ac_if);
|
||||
em_free_pci_resources(adapter);
|
||||
|
||||
size = EM_ROUNDUP(adapter->num_tx_desc *
|
||||
@ -482,8 +482,7 @@ em_start(struct ifnet *ifp)
|
||||
}
|
||||
|
||||
/* Send a copy of the frame to the BPF listener */
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
/* Set timeout in case hardware has problems transmitting */
|
||||
ifp->if_timer = EM_TX_TIMEOUT;
|
||||
@ -876,11 +875,11 @@ em_encap(struct adapter *adapter, struct mbuf *m_head)
|
||||
u_int16_t txd_used, count;
|
||||
|
||||
struct mbuf *mp;
|
||||
struct ifvlan *ifv = NULL;
|
||||
struct em_tx_buffer *tx_buffer;
|
||||
struct em_tx_desc *saved_tx_desc = NULL;
|
||||
struct em_tx_desc *current_tx_desc = NULL;
|
||||
struct ifnet *ifp = &adapter->interface_data.ac_if;
|
||||
struct m_tag *mtag;
|
||||
|
||||
/* Force a cleanup if number of descriptors available hit the threshold */
|
||||
if (adapter->num_tx_desc_avail <= EM_TX_CLEANUP_THRESHOLD)
|
||||
@ -922,11 +921,7 @@ em_encap(struct adapter *adapter, struct mbuf *m_head)
|
||||
}
|
||||
|
||||
/* Find out if we are in vlan mode */
|
||||
if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
|
||||
m_head->m_pkthdr.rcvif != NULL &&
|
||||
m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
|
||||
ifv = m_head->m_pkthdr.rcvif->if_softc;
|
||||
|
||||
mtag = VLAN_OUTPUT_TAG(ifp, m_head);
|
||||
|
||||
txd_used = 0;
|
||||
saved_tx_desc = adapter->next_avail_tx_desc;
|
||||
@ -964,12 +959,12 @@ em_encap(struct adapter *adapter, struct mbuf *m_head)
|
||||
}
|
||||
adapter->num_tx_desc_avail-= txd_used;
|
||||
|
||||
if (ifv != NULL) {
|
||||
if (mtag != NULL) {
|
||||
/* Tell hardware to add tag */
|
||||
current_tx_desc->lower.data |= E1000_TXD_CMD_VLE;
|
||||
|
||||
/* Set the vlan id */
|
||||
current_tx_desc->upper.fields.special = ifv->ifv_tag;
|
||||
current_tx_desc->upper.fields.special = VLAN_TAG_VALUE(mtag);
|
||||
}
|
||||
|
||||
/* Last Descriptor of Packet needs End Of Packet (EOP) bit set. */
|
||||
@ -1376,12 +1371,13 @@ em_setup_interface(device_t dev, struct adapter * adapter)
|
||||
ifp->if_start = em_start;
|
||||
ifp->if_watchdog = em_watchdog;
|
||||
ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 1;
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, adapter->interface_data.ac_enaddr);
|
||||
|
||||
if (adapter->hw.mac_type >= em_82543) {
|
||||
ifp->if_capabilities = IFCAP_HWCSUM;
|
||||
ifp->if_capenable = ifp->if_capabilities;
|
||||
}
|
||||
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU;
|
||||
|
||||
/*
|
||||
* Specify the media types supported by this adapter and register
|
||||
@ -2001,7 +1997,6 @@ em_process_receive_interrupts(struct adapter * adapter)
|
||||
{
|
||||
struct mbuf *mp;
|
||||
struct ifnet *ifp;
|
||||
struct ether_header *eh;
|
||||
u_int16_t len;
|
||||
u_int8_t last_byte;
|
||||
u_int8_t accept_frame = 0;
|
||||
@ -2096,18 +2091,14 @@ em_process_receive_interrupts(struct adapter * adapter)
|
||||
|
||||
if (eop) {
|
||||
adapter->fmp->m_pkthdr.rcvif = ifp;
|
||||
|
||||
eh = mtod(adapter->fmp, struct ether_header *);
|
||||
|
||||
/* Remove ethernet header from mbuf */
|
||||
m_adj(adapter->fmp, sizeof(struct ether_header));
|
||||
em_receive_checksum(adapter, current_desc,
|
||||
adapter->fmp);
|
||||
if (current_desc->status & E1000_RXD_STAT_VP)
|
||||
VLAN_INPUT_TAG(eh, adapter->fmp,
|
||||
current_desc->special);
|
||||
else
|
||||
ether_input(ifp, eh, adapter->fmp);
|
||||
VLAN_INPUT_TAG(ifp, adapter->fmp,
|
||||
current_desc->special,
|
||||
adapter->fmp = NULL);
|
||||
if (adapter->fmp != NULL)
|
||||
(*ifp->if_input)(ifp, adapter->fmp);
|
||||
|
||||
adapter->fmp = NULL;
|
||||
adapter->lmp = NULL;
|
||||
|
@ -207,7 +207,9 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||
#define IOCTL_CMD_TYPE u_long
|
||||
#define MAX_NUM_MULTICAST_ADDRESSES 128
|
||||
#define PCI_ANY_ID (~0U)
|
||||
#ifndef ETHER_ALIGN
|
||||
#define ETHER_ALIGN 2
|
||||
#endif
|
||||
#define QTAG_TYPE 0x8100
|
||||
|
||||
/* Defines for printing debug information */
|
||||
|
@ -176,7 +176,6 @@
|
||||
#include <net/bpf.h>
|
||||
#ifdef __FreeBSD__
|
||||
#define BPFATTACH(ifp, dlt, hlen) bpfattach((ifp), (dlt), (hlen))
|
||||
#define BPF_MTAP(ifp, m) bpf_mtap((ifp), (m))
|
||||
#else
|
||||
#define BPFATTACH(ifp, dlt, hlen) bpfattach(&(ifp)->if_bpf, (ifp), (dlt), (hlen))
|
||||
#define BPF_MTAP(ifp, m) bpf_mtap((ifp)->if_bpf, (m))
|
||||
|
@ -311,7 +311,7 @@ ep_attach(sc)
|
||||
}
|
||||
|
||||
if (!attached)
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
|
||||
#ifdef EP_LOCAL_STATS
|
||||
sc->rx_no_first = sc->rx_no_mbuf = sc->rx_bpf_disc =
|
||||
@ -509,9 +509,7 @@ startagain:
|
||||
|
||||
splx(s);
|
||||
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, top);
|
||||
}
|
||||
BPF_MTAP(ifp, top);
|
||||
|
||||
ifp->if_timer = 2;
|
||||
ifp->if_opackets++;
|
||||
@ -657,7 +655,6 @@ static void
|
||||
epread(sc)
|
||||
register struct ep_softc *sc;
|
||||
{
|
||||
struct ether_header *eh;
|
||||
struct mbuf *top, *mcur, *m;
|
||||
struct ifnet *ifp;
|
||||
int lenthisone;
|
||||
@ -765,9 +762,7 @@ read_again:
|
||||
top->m_pkthdr.rcvif = &sc->arpcom.ac_if;
|
||||
top->m_pkthdr.len = sc->cur_len;
|
||||
|
||||
eh = mtod(top, struct ether_header *);
|
||||
m_adj(top, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, top);
|
||||
(*ifp->if_input)(ifp, top);
|
||||
sc->top = 0;
|
||||
while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS);
|
||||
outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH);
|
||||
@ -857,12 +852,6 @@ ep_if_ioctl(ifp, cmd, data)
|
||||
s = splimp();
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if (((ifp->if_flags & IFF_UP) == 0) &&
|
||||
(ifp->if_flags & IFF_RUNNING)) {
|
||||
@ -899,7 +888,7 @@ ep_if_ioctl(ifp, cmd, data)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -233,7 +233,7 @@ ep_pccard_detach(device_t dev)
|
||||
return (0);
|
||||
}
|
||||
sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING;
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
sc->gone = 1;
|
||||
bus_teardown_intr(dev, sc->irq, sc->ep_intrhand);
|
||||
ep_free(dev);
|
||||
|
@ -262,7 +262,7 @@ ex_attach(device_t dev)
|
||||
/*
|
||||
* Attach the interface.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
|
||||
device_printf(sc->dev, "Ethernet address %6D\n",
|
||||
sc->arpcom.ac_enaddr, ":");
|
||||
@ -523,9 +523,7 @@ ex_start(struct ifnet *ifp)
|
||||
sc->tx_last = dest;
|
||||
sc->tx_tail = next;
|
||||
|
||||
if (ifp->if_bpf != NULL) {
|
||||
bpf_mtap(ifp, opkt);
|
||||
}
|
||||
BPF_MTAP(ifp, opkt);
|
||||
|
||||
ifp->if_timer = 2;
|
||||
ifp->if_opackets++;
|
||||
@ -752,8 +750,7 @@ ex_rx_intr(struct ex_softc *sc)
|
||||
} /* QQQ */
|
||||
}
|
||||
#endif
|
||||
m_adj(ipkt, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, ipkt);
|
||||
(*ifp->if_input)(ifp, ipkt);
|
||||
ifp->if_ipackets++;
|
||||
}
|
||||
} else {
|
||||
|
@ -816,7 +816,7 @@ fe_attach (device_t dev)
|
||||
#endif
|
||||
|
||||
/* Attach and stop the interface. */
|
||||
ether_ifattach(&sc->sc_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(&sc->sc_if, sc->arpcom.ac_enaddr);
|
||||
fe_stop(sc);
|
||||
|
||||
/* Print additional info when attached. */
|
||||
@ -1281,9 +1281,8 @@ fe_start (struct ifnet *ifp)
|
||||
* and only if it is in "receive everything"
|
||||
* mode.)
|
||||
*/
|
||||
if (sc->sc_if.if_bpf &&
|
||||
!(sc->sc_if.if_flags & IFF_PROMISC))
|
||||
bpf_mtap(&sc->sc_if, m);
|
||||
if (!(sc->sc_if.if_flags & IFF_PROMISC))
|
||||
BPF_MTAP(&sc->sc_if, m);
|
||||
|
||||
m_freem(m);
|
||||
}
|
||||
@ -1757,13 +1756,6 @@ fe_ioctl (struct ifnet * ifp, u_long command, caddr_t data)
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
/* Just an ordinary action. */
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* Switch interface state between "running" and
|
||||
@ -1803,7 +1795,7 @@ fe_ioctl (struct ifnet * ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1819,6 +1811,7 @@ fe_ioctl (struct ifnet * ifp, u_long command, caddr_t data)
|
||||
static int
|
||||
fe_get_packet (struct fe_softc * sc, u_short len)
|
||||
{
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
|
||||
@ -1868,7 +1861,7 @@ fe_get_packet (struct fe_softc * sc, u_short len)
|
||||
}
|
||||
|
||||
/* Initialize packet header info. */
|
||||
m->m_pkthdr.rcvif = &sc->sc_if;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = len;
|
||||
|
||||
/* Set the length of this packet. */
|
||||
@ -1890,13 +1883,8 @@ fe_get_packet (struct fe_softc * sc, u_short len)
|
||||
fe_insw(sc, FE_BMPR8, (u_int16_t *)eh, (len + 1) >> 1);
|
||||
}
|
||||
|
||||
/* Strip off the Ethernet header. */
|
||||
m->m_pkthdr.len -= sizeof (struct ether_header);
|
||||
m->m_len -= sizeof (struct ether_header);
|
||||
m->m_data += sizeof (struct ether_header);
|
||||
|
||||
/* Feed the packet to upper layer. */
|
||||
ether_input(&sc->sc_if, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -174,7 +174,7 @@ fe_pccard_detach(device_t dev)
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
|
||||
fe_stop(sc);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||
fe_release_resource(dev);
|
||||
|
||||
|
@ -192,11 +192,12 @@ fwe_attach(device_t dev)
|
||||
ifp->if_snd.ifq_maxlen = FWMAXQUEUE - 1;
|
||||
|
||||
s = splimp();
|
||||
ether_ifattach(ifp, 1);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
splx(s);
|
||||
|
||||
/* Tell the upper layer(s) we support long frames. */
|
||||
ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
|
||||
ifp->if_capabilities |= IFCAP_VLAN_MTU;
|
||||
|
||||
ifp->if_snd.ifq_maxlen = MAX_QUEUED - 1;
|
||||
|
||||
@ -239,7 +240,7 @@ fwe_detach(device_t dev)
|
||||
s = splimp();
|
||||
|
||||
fwe_stop(fwe);
|
||||
ether_ifdetach(&fwe->fwe_if, 1);
|
||||
ether_ifdetach(&fwe->fwe_if);
|
||||
|
||||
splx(s);
|
||||
return 0;
|
||||
@ -311,13 +312,6 @@ fwe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
int s, error, len;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
s = splimp();
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
splx(s);
|
||||
return (error);
|
||||
case SIOCSIFFLAGS:
|
||||
s = splimp();
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
@ -348,7 +342,10 @@ fwe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
return (EINVAL);
|
||||
s = splimp();
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
splx(s);
|
||||
return (error);
|
||||
}
|
||||
|
||||
return (0);
|
||||
@ -434,8 +431,7 @@ fwe_as_output(struct fwe_softc *fwe, struct ifnet *ifp)
|
||||
if (xfer == NULL) {
|
||||
return;
|
||||
}
|
||||
if (ifp->if_bpf != NULL)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
xfer->send.off = 0;
|
||||
xfer->spd = 2;
|
||||
@ -543,9 +539,7 @@ fwe_as_input(struct fw_xferq *xferq)
|
||||
#endif
|
||||
p = xfer->recv.buf + xfer->recv.off + HDR_LEN + ALIGN_PAD;
|
||||
eh = (struct ether_header *)p;
|
||||
p += sizeof(struct ether_header);
|
||||
len -= xfer->recv.off + HDR_LEN + ALIGN_PAD
|
||||
+ sizeof(struct ether_header);
|
||||
len -= xfer->recv.off + HDR_LEN + ALIGN_PAD;
|
||||
m->m_data = p;
|
||||
m->m_len = m->m_pkthdr.len = len;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
@ -565,7 +559,7 @@ fwe_as_input(struct fw_xferq *xferq)
|
||||
c[20], c[21], c[22], c[23]
|
||||
);
|
||||
#endif
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
ifp->if_ipackets ++;
|
||||
|
||||
xfer->recv.buf = NULL;
|
||||
|
@ -646,12 +646,13 @@ fxp_attach(device_t dev)
|
||||
/*
|
||||
* Attach the interface.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
|
||||
/*
|
||||
* Tell the upper layer(s) we support long frames.
|
||||
*/
|
||||
ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
|
||||
ifp->if_capabilities |= IFCAP_VLAN_MTU;
|
||||
|
||||
/*
|
||||
* Let the system queue as many packets as we have available
|
||||
@ -725,7 +726,7 @@ fxp_detach(device_t dev)
|
||||
/*
|
||||
* Close down routes etc.
|
||||
*/
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
|
||||
/*
|
||||
* Free all media structures.
|
||||
@ -1138,8 +1139,7 @@ tbdinit:
|
||||
/*
|
||||
* Pass packet to bpf if there is a listener.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, mb_head);
|
||||
BPF_MTAP(ifp, mb_head);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1352,7 +1352,9 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
|
||||
}
|
||||
|
||||
m->m_pkthdr.len = m->m_len = total_len;
|
||||
ether_input(ifp, NULL, m);
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
}
|
||||
if (rnr) {
|
||||
@ -1974,12 +1976,6 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_ALLMULTI)
|
||||
sc->flags |= FXP_FLAG_ALL_MCAST;
|
||||
@ -2033,7 +2029,7 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
}
|
||||
splx(s);
|
||||
return (error);
|
||||
|
@ -299,7 +299,7 @@ gem_attach(sc)
|
||||
bus_space_write_4(sc->sc_bustag, sc->sc_h, GEM_MIF_CONFIG,
|
||||
sc->sc_mif_config);
|
||||
/* Attach the interface. */
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->sc_arpcom.ac_enaddr);
|
||||
|
||||
#if notyet
|
||||
/*
|
||||
@ -1546,13 +1546,11 @@ gem_rint(sc)
|
||||
}
|
||||
m->m_data += 2; /* We're already off by two */
|
||||
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = len - ETHER_CRC_LEN;
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
/* Pass it on. */
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
if (progress) {
|
||||
@ -1952,7 +1950,7 @@ gem_ioctl(ifp, cmd, data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii->mii_media, cmd);
|
||||
break;
|
||||
default:
|
||||
error = ENOTTY;
|
||||
error = ENOTTY; /* XXX EINVAL??? */
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -348,6 +348,7 @@ gx_attach(device_t dev)
|
||||
ifp->if_init = gx_init;
|
||||
ifp->if_mtu = ETHERMTU;
|
||||
ifp->if_snd.ifq_maxlen = GX_TX_RING_CNT - 1;
|
||||
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
|
||||
|
||||
/* see if we can enable hardware checksumming */
|
||||
if (gx->gx_vflags & GXF_CSUM) {
|
||||
@ -382,7 +383,7 @@ gx_attach(device_t dev)
|
||||
/*
|
||||
* Call MI attach routines.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, gx->arpcom.ac_enaddr);
|
||||
|
||||
GX_UNLOCK(gx);
|
||||
splx(s);
|
||||
@ -611,7 +612,7 @@ gx_detach(device_t dev)
|
||||
ifp = &gx->arpcom.ac_if;
|
||||
GX_LOCK(gx);
|
||||
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
gx_reset(gx);
|
||||
gx_stop(gx);
|
||||
ifmedia_removeall(&gx->gx_media);
|
||||
@ -917,10 +918,6 @@ gx_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
GX_LOCK(gx);
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFMTU:
|
||||
if (ifr->ifr_mtu > GX_MAX_MTU) {
|
||||
error = EINVAL;
|
||||
@ -971,7 +968,7 @@ gx_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1220,7 +1217,6 @@ gx_setmulti(struct gx_softc *gx)
|
||||
static void
|
||||
gx_rxeof(struct gx_softc *gx)
|
||||
{
|
||||
struct ether_header *eh;
|
||||
struct gx_rx_desc *rx;
|
||||
struct ifnet *ifp;
|
||||
int idx, staterr, len;
|
||||
@ -1286,12 +1282,8 @@ gx_rxeof(struct gx_softc *gx)
|
||||
}
|
||||
|
||||
ifp->if_ipackets++;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
#define IP_CSMASK (GX_RXSTAT_IGNORE_CSUM | GX_RXSTAT_HAS_IP_CSUM)
|
||||
#define TCP_CSMASK \
|
||||
(GX_RXSTAT_IGNORE_CSUM | GX_RXSTAT_HAS_TCP_CSUM | GX_RXERR_TCP_CSUM)
|
||||
@ -1315,14 +1307,13 @@ gx_rxeof(struct gx_softc *gx)
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If we received a packet with a vlan tag, pass it
|
||||
* to vlan_input() instead of ether_input().
|
||||
* If we received a packet with a vlan tag,
|
||||
* mark the packet before it's passed up.
|
||||
*/
|
||||
if (staterr & GX_RXSTAT_VLAN_PKT) {
|
||||
VLAN_INPUT_TAG(eh, m, rx->rx_special);
|
||||
continue;
|
||||
VLAN_INPUT_TAG(ifp, m, rx->rx_special, continue);
|
||||
}
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
continue;
|
||||
|
||||
ierror:
|
||||
@ -1471,12 +1462,7 @@ gx_encap(struct gx_softc *gx, struct mbuf *m_head)
|
||||
struct gx_tx_desc_ctx *tctx;
|
||||
struct mbuf *m;
|
||||
int idx, cnt, csumopts, txcontext;
|
||||
struct ifvlan *ifv = NULL;
|
||||
|
||||
if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
|
||||
m_head->m_pkthdr.rcvif != NULL &&
|
||||
m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
|
||||
ifv = m_head->m_pkthdr.rcvif->if_softc;
|
||||
struct m_tag *mtag;
|
||||
|
||||
cnt = gx->gx_txcnt;
|
||||
idx = gx->gx_tx_tail_idx;
|
||||
@ -1526,7 +1512,6 @@ gx_encap(struct gx_softc *gx, struct mbuf *m_head)
|
||||
cnt++;
|
||||
}
|
||||
context_done:
|
||||
|
||||
/*
|
||||
* Start packing the mbufs in this chain into the transmit
|
||||
* descriptors. Stop when we run out of descriptors or hit
|
||||
@ -1562,9 +1547,10 @@ printf("overflow(2): %d, %d\n", cnt, GX_TX_RING_CNT);
|
||||
if (tx != NULL) {
|
||||
tx->tx_command |= GX_TXTCP_REPORT_STATUS | GX_TXTCP_INT_DELAY |
|
||||
GX_TXTCP_ETHER_CRC | GX_TXTCP_END_OF_PKT;
|
||||
if (ifv != NULL) {
|
||||
mtag = VLAN_OUTPUT_TAG(&gx->arpcom.ac_if, m);
|
||||
if (mtag != NULL) {
|
||||
tx->tx_command |= GX_TXTCP_VLAN_ENABLE;
|
||||
tx->tx_vlan = ifv->ifv_tag;
|
||||
tx->tx_vlan = VLAN_TAG_VALUE(mtag);
|
||||
}
|
||||
gx->gx_txcnt = cnt;
|
||||
gx->gx_tx_tail_idx = idx;
|
||||
@ -1613,8 +1599,7 @@ gx_start(struct ifnet *ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
/*
|
||||
* Set a timeout in case the chip goes out to lunch.
|
||||
|
@ -49,8 +49,6 @@ struct mtx { int filler; };
|
||||
#define PCIM_CMD_MWIEN 0x0010
|
||||
#endif
|
||||
|
||||
#define ETHER_ALIGN 2
|
||||
|
||||
/* CSR_WRITE_8 assumes the register is in low/high order */
|
||||
#define CSR_WRITE_8(gx, reg, val) do { \
|
||||
bus_space_write_4((gx)->gx_btag, (gx)->gx_bhandle, \
|
||||
|
@ -314,7 +314,7 @@ hme_config(struct hme_softc *sc)
|
||||
}
|
||||
|
||||
/* Attach the interface. */
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->sc_arpcom.ac_enaddr);
|
||||
|
||||
callout_init(&sc->sc_tick_ch, 0);
|
||||
return (0);
|
||||
@ -987,7 +987,6 @@ static void
|
||||
hme_read(struct hme_softc *sc, int ix, int len)
|
||||
{
|
||||
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
int offs;
|
||||
|
||||
@ -1026,10 +1025,8 @@ hme_read(struct hme_softc *sc, int ix, int len)
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = len + offs;
|
||||
m_adj(m, offs);
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
/* Pass the packet up. */
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1055,8 +1052,7 @@ hme_start(struct ifnet *ifp)
|
||||
break;
|
||||
} else {
|
||||
enq = 1;
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1376,11 +1372,6 @@ hme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
s = splnet();
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if ((ifp->if_flags & IFF_UP) == 0 &&
|
||||
(ifp->if_flags & IFF_RUNNING) != 0) {
|
||||
@ -1420,7 +1411,7 @@ hme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii->mii_media, cmd);
|
||||
break;
|
||||
default:
|
||||
error = ENOTTY;
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -202,8 +202,7 @@ static int ierint(int unit, struct ie_softc * ie);
|
||||
static int ietint(int unit, struct ie_softc * ie);
|
||||
static int iernr(int unit, struct ie_softc * ie);
|
||||
static void start_receiver(int unit);
|
||||
static __inline int ieget(int, struct ie_softc *, struct mbuf **,
|
||||
struct ether_header *);
|
||||
static __inline int ieget(int, struct ie_softc *, struct mbuf **);
|
||||
static v_caddr_t setup_rfa(v_caddr_t ptr, struct ie_softc * ie);
|
||||
static int mc_setup(int, v_caddr_t, volatile struct ie_sys_ctl_block *);
|
||||
static void ie_mc_reset(int unit);
|
||||
@ -796,7 +795,7 @@ ieattach(struct isa_device *dvp)
|
||||
EVENTHANDLER_REGISTER(shutdown_post_sync, ee16_shutdown,
|
||||
ie, SHUTDOWN_PRI_DEFAULT);
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, ie->arpcom.ac_enaddr);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -1122,10 +1121,9 @@ ie_packet_len(int unit, struct ie_softc * ie)
|
||||
* operation considerably. (Provided that it works, of course.)
|
||||
*/
|
||||
static __inline int
|
||||
ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
|
||||
ieget(int unit, struct ie_softc *ie, struct mbuf **mp)
|
||||
{
|
||||
struct mbuf *m, *top, **mymp;
|
||||
int i;
|
||||
int offset;
|
||||
int totlen, resid;
|
||||
int thismboff;
|
||||
@ -1135,12 +1133,18 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
|
||||
if (totlen <= 0)
|
||||
return (-1);
|
||||
|
||||
i = ie->rbhead;
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
if (!m) {
|
||||
ie_drop_packet_buffer(unit, ie);
|
||||
/* XXXX if_ierrors++; */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Snarf the Ethernet header.
|
||||
*/
|
||||
bcopy((v_caddr_t) ie->cbuffs[i], (caddr_t) ehp, sizeof *ehp);
|
||||
bcopy((v_caddr_t) ie->cbuffs[ie->rbhead], mtod(m, caddr_t),
|
||||
sizeof (struct ether_header));
|
||||
/* ignore cast-qual warning here */
|
||||
|
||||
/*
|
||||
@ -1149,25 +1153,25 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
|
||||
* This is only a consideration when FILTER is defined; i.e., when
|
||||
* we are either running BPF or doing multicasting.
|
||||
*/
|
||||
if (!check_eh(ie, ehp)) {
|
||||
if (!check_eh(ie, mtod(m, struct ether_header *))) {
|
||||
m_free(m);
|
||||
ie_drop_packet_buffer(unit, ie);
|
||||
ie->arpcom.ac_if.if_ierrors--; /* just this case, it's not an
|
||||
* error
|
||||
*/
|
||||
return (-1);
|
||||
}
|
||||
totlen -= (offset = sizeof *ehp);
|
||||
|
||||
MGETHDR(*mp, M_DONTWAIT, MT_DATA);
|
||||
if (!*mp) {
|
||||
ie_drop_packet_buffer(unit, ie);
|
||||
return (-1);
|
||||
}
|
||||
m = *mp;
|
||||
/* XXX way too complicated, check carefully XXXX */
|
||||
|
||||
*mp = m;
|
||||
m->m_pkthdr.rcvif = &ie->arpcom.ac_if;
|
||||
m->m_len = MHLEN;
|
||||
resid = m->m_pkthdr.len = totlen;
|
||||
top = 0;
|
||||
/* deduct header just copied; m_len must reflect space avail below */
|
||||
m->m_len = MHLEN - sizeof (struct ether_header);
|
||||
m->m_pkthdr.len = totlen;
|
||||
|
||||
resid = totlen - sizeof (struct ether_header); /* remaining data */
|
||||
top = NULL;
|
||||
mymp = ⊤
|
||||
|
||||
/*
|
||||
@ -1208,10 +1212,11 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
|
||||
mymp = &m->m_next;
|
||||
} while (resid > 0);
|
||||
|
||||
resid = totlen;
|
||||
m = top;
|
||||
thismboff = 0;
|
||||
head = ie->rbhead;
|
||||
resid = totlen - sizeof (struct ether_header); /* remaining data */
|
||||
offset = sizeof (struct ether_header); /* packet offset */
|
||||
m = top; /* current mbuf */
|
||||
thismboff = sizeof (struct ether_header); /* offset in m */
|
||||
head = ie->rbhead; /* current rx buffer */
|
||||
|
||||
/*
|
||||
* Now we take the mbuf chain (hopefully only one mbuf most of the
|
||||
@ -1232,7 +1237,7 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
|
||||
mtod(m, v_caddr_t) +thismboff, (unsigned) newlen);
|
||||
/* ignore cast-qual warning */
|
||||
m = m->m_next;
|
||||
thismboff = 0; /* new mbuf, so no offset */
|
||||
thismboff = 0; /* new mbuf, so no offset */
|
||||
offset += newlen; /* we are now this far into
|
||||
* the packet */
|
||||
resid -= newlen; /* so there is this much left
|
||||
@ -1296,9 +1301,12 @@ nextbuf:
|
||||
static void
|
||||
ie_readframe(int unit, struct ie_softc *ie, int num/* frame number to read */)
|
||||
{
|
||||
struct ifnet *ifp = &ie->arpcom.ac_if;
|
||||
struct ie_recv_frame_desc rfd;
|
||||
struct mbuf *m = 0;
|
||||
struct ether_header eh;
|
||||
#ifdef DEBUG
|
||||
struct ether_header *eh;
|
||||
#endif
|
||||
|
||||
bcopy((v_caddr_t) (ie->rframes[num]), &rfd,
|
||||
sizeof(struct ie_recv_frame_desc));
|
||||
@ -1314,19 +1322,20 @@ ie_readframe(int unit, struct ie_softc *ie, int num/* frame number to read */)
|
||||
ie->rfhead = (ie->rfhead + 1) % ie->nframes;
|
||||
|
||||
if (rfd.ie_fd_status & IE_FD_OK) {
|
||||
if (ieget(unit, ie, &m, &eh)) {
|
||||
if (ieget(unit, ie, &m)) {
|
||||
ie->arpcom.ac_if.if_ierrors++; /* this counts as an
|
||||
* error */
|
||||
return;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
eh = mtod(m, struct ether_header *);
|
||||
if (ie_debug & IED_READFRAME) {
|
||||
printf("ie%d: frame from ether %6D type %x\n", unit,
|
||||
eh.ether_shost, ":", (unsigned) eh.ether_type);
|
||||
eh->ether_shost, ":", (unsigned) eh->ether_type);
|
||||
}
|
||||
if (ntohs(eh.ether_type) > ETHERTYPE_TRAIL
|
||||
&& ntohs(eh.ether_type) < (ETHERTYPE_TRAIL + ETHERTYPE_NTRAILER))
|
||||
if (ntohs(eh->ether_type) > ETHERTYPE_TRAIL
|
||||
&& ntohs(eh->ether_type) < (ETHERTYPE_TRAIL + ETHERTYPE_NTRAILER))
|
||||
printf("received trailer!\n");
|
||||
#endif
|
||||
|
||||
@ -1336,7 +1345,7 @@ ie_readframe(int unit, struct ie_softc *ie, int num/* frame number to read */)
|
||||
/*
|
||||
* Finally pass this packet up to higher layers.
|
||||
*/
|
||||
ether_input(&ie->arpcom.ac_if, &eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1412,9 +1421,8 @@ iestart(struct ifnet *ifp)
|
||||
* See if bpf is listening on this interface, let it see the
|
||||
* packet before we commit it to the wire.
|
||||
*/
|
||||
if (ie->arpcom.ac_if.if_bpf)
|
||||
bpf_tap(&ie->arpcom.ac_if,
|
||||
(void *)ie->xmit_cbuffs[ie->xmit_count], len);
|
||||
BPF_TAP(&ie->arpcom.ac_if,
|
||||
(void *)ie->xmit_cbuffs[ie->xmit_count], len);
|
||||
|
||||
ie->xmit_buffs[ie->xmit_count]->ie_xmit_flags =
|
||||
IE_XMIT_LAST|len;
|
||||
@ -2093,12 +2101,6 @@ ieioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* Note that this device doesn't have an "all multicast"
|
||||
@ -2133,7 +2135,8 @@ ieioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
splx(s);
|
||||
|
@ -310,8 +310,7 @@ icintr (device_t dev, int event, char *ptr)
|
||||
sc->ic_if.if_ipackets ++;
|
||||
sc->ic_if.if_ibytes += len;
|
||||
|
||||
if (sc->ic_if.if_bpf)
|
||||
bpf_tap(&sc->ic_if, sc->ic_ifbuf, len + ICHDRLEN);
|
||||
BPF_TAP(&sc->ic_if, sc->ic_ifbuf, len + ICHDRLEN);
|
||||
|
||||
top = m_devget(sc->ic_ifbuf + ICHDRLEN, len, 0, &sc->ic_if, 0);
|
||||
|
||||
@ -418,7 +417,7 @@ icoutput(struct ifnet *ifp, struct mbuf *m,
|
||||
m0.m_data = (char *)&hdr;
|
||||
n = &m0;
|
||||
|
||||
bpf_mtap(ifp, n);
|
||||
BPF_MTAP(ifp, n);
|
||||
}
|
||||
|
||||
sc->ic_sending = 1;
|
||||
|
@ -674,7 +674,7 @@ lge_attach(dev)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
callout_handle_init(&sc->lge_stat_ch);
|
||||
|
||||
fail:
|
||||
@ -697,7 +697,7 @@ lge_detach(dev)
|
||||
|
||||
lge_reset(sc);
|
||||
lge_stop(sc);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
bus_generic_detach(dev);
|
||||
device_delete_child(dev, sc->lge_miibus);
|
||||
@ -971,7 +971,6 @@ lge_rxeof(sc, cnt)
|
||||
struct lge_softc *sc;
|
||||
int cnt;
|
||||
{
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
struct ifnet *ifp;
|
||||
struct lge_rx_desc *cur_rx;
|
||||
@ -1027,10 +1026,6 @@ lge_rxeof(sc, cnt)
|
||||
}
|
||||
|
||||
ifp->if_ipackets++;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
/* Do IP checksum checking. */
|
||||
if (rxsts & LGE_RXSTS_ISIP)
|
||||
@ -1046,7 +1041,7 @@ lge_rxeof(sc, cnt)
|
||||
m->m_pkthdr.csum_data = 0xffff;
|
||||
}
|
||||
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
sc->lge_cdata.lge_rx_cons = i;
|
||||
@ -1299,8 +1294,7 @@ lge_start(ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
}
|
||||
|
||||
sc->lge_cdata.lge_tx_prod = idx;
|
||||
@ -1508,10 +1502,6 @@ lge_ioctl(ifp, command, data)
|
||||
s = splimp();
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFMTU:
|
||||
if (ifr->ifr_mtu > LGE_JUMBO_MTU)
|
||||
error = EINVAL;
|
||||
@ -1553,7 +1543,7 @@ lge_ioctl(ifp, command, data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -563,7 +563,6 @@ struct lge_softc {
|
||||
bus_space_read_1(sc->lge_btag, sc->lge_bhandle, reg)
|
||||
|
||||
#define LGE_TIMEOUT 1000
|
||||
#define ETHER_ALIGN 2
|
||||
#define LGE_RXLEN 1536
|
||||
#define LGE_MIN_FRAMELEN 60
|
||||
|
||||
|
@ -446,6 +446,7 @@ mbuf_packet(struct lnc_softc *sc, int start_of_packet, int pkt_len)
|
||||
static __inline void
|
||||
lnc_rint(struct lnc_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
struct host_ring_entry *next, *start;
|
||||
int start_of_packet;
|
||||
struct mbuf *head;
|
||||
@ -465,13 +466,13 @@ lnc_rint(struct lnc_softc *sc)
|
||||
|
||||
#ifdef DIAGNOSTIC
|
||||
if ((sc->recv_ring + sc->recv_next)->md->md1 & OWN) {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
log(LOG_ERR, "lnc%d: Receive interrupt with buffer still owned by controller -- Resetting\n", unit);
|
||||
lnc_reset(sc);
|
||||
return;
|
||||
}
|
||||
if (!((sc->recv_ring + sc->recv_next)->md->md1 & STP)) {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
log(LOG_ERR, "lnc%d: Receive interrupt but not start of packet -- Resetting\n", unit);
|
||||
lnc_reset(sc);
|
||||
return;
|
||||
@ -503,7 +504,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
} while (!(flags & (STP | OWN | ENP | MDERR)));
|
||||
|
||||
if (flags & STP) {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
log(LOG_ERR, "lnc%d: Start of packet found before end of previous in receive ring -- Resetting\n", unit);
|
||||
lnc_reset(sc);
|
||||
return;
|
||||
@ -517,7 +518,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
sc->recv_next = start_of_packet;
|
||||
break;
|
||||
} else {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
log(LOG_ERR, "lnc%d: End of received packet not found-- Resetting\n", unit);
|
||||
lnc_reset(sc);
|
||||
return;
|
||||
@ -532,7 +533,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
next = sc->recv_ring + sc->recv_next;
|
||||
|
||||
if (flags & MDERR) {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
if (flags & RBUFF) {
|
||||
LNCSTATS(rbuff)
|
||||
log(LOG_ERR, "lnc%d: Receive buffer error\n", unit);
|
||||
@ -544,7 +545,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
log(LOG_ERR, "lnc%d: Receive overflow error \n", unit);
|
||||
}
|
||||
} else if (flags & ENP) {
|
||||
if ((sc->arpcom.ac_if.if_flags & IFF_PROMISC)==0) {
|
||||
if ((ifp->if_flags & IFF_PROMISC)==0) {
|
||||
/*
|
||||
* FRAM and CRC are valid only if ENP
|
||||
* is set and OFLO is not.
|
||||
@ -565,7 +566,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
|
||||
/* Drop packet */
|
||||
LNCSTATS(rerr)
|
||||
sc->arpcom.ac_if.if_ierrors++;
|
||||
ifp->if_ierrors++;
|
||||
while (start_of_packet != sc->recv_next) {
|
||||
start = sc->recv_ring + start_of_packet;
|
||||
start->md->md2 = -RECVBUFSIZE; /* XXX - shouldn't be necessary */
|
||||
@ -575,7 +576,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
}
|
||||
} else { /* Valid packet */
|
||||
|
||||
sc->arpcom.ac_if.if_ipackets++;
|
||||
ifp->if_ipackets++;
|
||||
|
||||
|
||||
if (sc->nic.mem_mode == DMA_MBUF)
|
||||
@ -588,7 +589,7 @@ lnc_rint(struct lnc_softc *sc)
|
||||
* First mbuf in packet holds the
|
||||
* ethernet and packet headers
|
||||
*/
|
||||
head->m_pkthdr.rcvif = &sc->arpcom.ac_if;
|
||||
head->m_pkthdr.rcvif = ifp;
|
||||
head->m_pkthdr.len = pkt_len ;
|
||||
eh = (struct ether_header *) head->m_data;
|
||||
|
||||
@ -601,15 +602,10 @@ lnc_rint(struct lnc_softc *sc)
|
||||
sc->arpcom.ac_enaddr, ETHER_ADDR_LEN) == 0) {
|
||||
m_freem(head);
|
||||
} else {
|
||||
/* Skip over the ether header */
|
||||
head->m_data += sizeof *eh;
|
||||
head->m_len -= sizeof *eh;
|
||||
head->m_pkthdr.len -= sizeof *eh;
|
||||
|
||||
ether_input(&sc->arpcom.ac_if, eh, head);
|
||||
(*ifp->if_input)(ifp, head);
|
||||
}
|
||||
} else {
|
||||
int unit = sc->arpcom.ac_if.if_unit;
|
||||
int unit = ifp->if_unit;
|
||||
log(LOG_ERR,"lnc%d: Packet dropped, no mbufs\n",unit);
|
||||
LNCSTATS(drop_packet)
|
||||
}
|
||||
@ -907,7 +903,7 @@ lnc_attach_common(device_t dev)
|
||||
* XXX -- should check return status of if_attach
|
||||
*/
|
||||
|
||||
ether_ifattach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(&sc->arpcom.ac_if, sc->arpcom.ac_enaddr);
|
||||
|
||||
printf("lnc%d: ", unit);
|
||||
if (sc->nic.ic == LANCE || sc->nic.ic == C_LANCE)
|
||||
@ -1381,8 +1377,7 @@ lnc_start(struct ifnet *ifp)
|
||||
|
||||
ifp->if_timer = 2;
|
||||
|
||||
if (sc->arpcom.ac_if.if_bpf)
|
||||
bpf_mtap(&sc->arpcom.ac_if, head);
|
||||
BPF_MTAP(&sc->arpcom.ac_if, head);
|
||||
|
||||
if (sc->nic.mem_mode != DMA_MBUF)
|
||||
m_freem(head);
|
||||
@ -1408,12 +1403,6 @@ lnc_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
#ifdef DEBUG
|
||||
if (ifp->if_flags & IFF_DEBUG)
|
||||
@ -1464,7 +1453,8 @@ lnc_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
|
||||
error = 0;
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
(void) splx(s);
|
||||
return error;
|
||||
|
@ -284,7 +284,7 @@ lnc_isa_detach(device_t dev)
|
||||
lnc_softc_t *sc = device_get_softc(dev);
|
||||
int s = splimp();
|
||||
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
splx(s);
|
||||
|
||||
lnc_stop(sc);
|
||||
|
@ -255,7 +255,7 @@ lnc_isa_detach(device_t dev)
|
||||
lnc_softc_t *sc = device_get_softc(dev);
|
||||
int s = splimp();
|
||||
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
splx(s);
|
||||
|
||||
lnc_stop(sc);
|
||||
|
@ -187,7 +187,7 @@ lnc_pci_detach(device_t dev)
|
||||
lnc_softc_t *sc = device_get_softc(dev);
|
||||
int s = splimp();
|
||||
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
|
||||
lnc_stop(sc);
|
||||
bus_teardown_intr(dev, sc->irqres, sc->intrhand);
|
||||
|
@ -1056,7 +1056,7 @@ my_attach(device_t dev)
|
||||
my_stop(sc);
|
||||
ifmedia_set(&sc->ifmedia, media);
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
|
||||
#if 0
|
||||
at_shutdown(my_shutdown, sc, SHUTDOWN_POST_SYNC);
|
||||
@ -1084,7 +1084,7 @@ my_detach(device_t dev)
|
||||
sc = device_get_softc(dev);
|
||||
MY_LOCK(sc);
|
||||
ifp = &sc->arpcom.ac_if;
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
my_stop(sc);
|
||||
|
||||
#if 0
|
||||
@ -1267,7 +1267,7 @@ my_rxeof(struct my_softc * sc)
|
||||
* address or the interface is in promiscuous mode.
|
||||
*/
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
if (ifp->if_flags & IFF_PROMISC &&
|
||||
(bcmp(eh->ether_dhost, sc->arpcom.ac_enaddr,
|
||||
ETHER_ADDR_LEN) &&
|
||||
@ -1277,9 +1277,7 @@ my_rxeof(struct my_softc * sc)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
MY_UNLOCK(sc);
|
||||
return;
|
||||
@ -1537,8 +1535,7 @@ my_start(struct ifnet * ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame to
|
||||
* him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, cur_tx->my_mbuf);
|
||||
BPF_MTAP(ifp, cur_tx->my_mbuf);
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
@ -1764,11 +1761,6 @@ my_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
MY_LOCK(sc);
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP)
|
||||
my_init(sc);
|
||||
@ -1786,7 +1778,7 @@ my_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
MY_UNLOCK(sc);
|
||||
|
@ -977,7 +977,7 @@ nge_attach(dev)
|
||||
ifp->if_baudrate = 1000000000;
|
||||
ifp->if_snd.ifq_maxlen = NGE_TX_LIST_CNT - 1;
|
||||
ifp->if_hwassist = NGE_CSUM_FEATURES;
|
||||
ifp->if_capabilities = IFCAP_HWCSUM;
|
||||
ifp->if_capabilities = IFCAP_HWCSUM | IFCAP_VLAN_HWTAGGING;
|
||||
ifp->if_capenable = ifp->if_capabilities;
|
||||
|
||||
/*
|
||||
@ -1031,7 +1031,7 @@ nge_attach(dev)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
callout_handle_init(&sc->nge_stat_ch);
|
||||
|
||||
fail:
|
||||
@ -1056,7 +1056,7 @@ nge_detach(dev)
|
||||
|
||||
nge_reset(sc);
|
||||
nge_stop(sc);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
bus_generic_detach(dev);
|
||||
if (!sc->nge_tbi) {
|
||||
@ -1326,7 +1326,6 @@ static void
|
||||
nge_rxeof(sc)
|
||||
struct nge_softc *sc;
|
||||
{
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
struct ifnet *ifp;
|
||||
struct nge_desc *cur_rx;
|
||||
@ -1402,10 +1401,6 @@ nge_rxeof(sc)
|
||||
#endif
|
||||
|
||||
ifp->if_ipackets++;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
/* Do IP checksum checking. */
|
||||
if (extsts & NGE_RXEXTSTS_IPPKT)
|
||||
@ -1426,11 +1421,11 @@ nge_rxeof(sc)
|
||||
* to vlan_input() instead of ether_input().
|
||||
*/
|
||||
if (extsts & NGE_RXEXTSTS_VLANPKT) {
|
||||
VLAN_INPUT_TAG(eh, m, extsts & NGE_RXEXTSTS_VTCI);
|
||||
continue;
|
||||
}
|
||||
VLAN_INPUT_TAG(ifp, m,
|
||||
extsts & NGE_RXEXTSTS_VTCI, continue);
|
||||
}
|
||||
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
sc->nge_cdata.nge_rx_prod = i;
|
||||
@ -1705,12 +1700,7 @@ nge_encap(sc, m_head, txidx)
|
||||
struct nge_desc *f = NULL;
|
||||
struct mbuf *m;
|
||||
int frag, cur, cnt = 0;
|
||||
struct ifvlan *ifv = NULL;
|
||||
|
||||
if ((m_head->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
|
||||
m_head->m_pkthdr.rcvif != NULL &&
|
||||
m_head->m_pkthdr.rcvif->if_type == IFT_L2VLAN)
|
||||
ifv = m_head->m_pkthdr.rcvif->if_softc;
|
||||
struct m_tag *mtag;
|
||||
|
||||
/*
|
||||
* Start packing the mbufs in this chain into
|
||||
@ -1752,9 +1742,10 @@ nge_encap(sc, m_head, txidx)
|
||||
NGE_TXEXTSTS_UDPCSUM;
|
||||
}
|
||||
|
||||
if (ifv != NULL) {
|
||||
mtag = VLAN_OUTPUT_TAG(&sc->arpcom.ac_if, m);
|
||||
if (mtag != NULL) {
|
||||
sc->nge_ldata->nge_tx_list[cur].nge_extsts |=
|
||||
(NGE_TXEXTSTS_VLANPKT|ifv->ifv_tag);
|
||||
(NGE_TXEXTSTS_VLANPKT|VLAN_TAG_VALUE(mtag));
|
||||
}
|
||||
|
||||
sc->nge_ldata->nge_tx_list[cur].nge_mbuf = m_head;
|
||||
@ -1806,8 +1797,7 @@ nge_start(ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
}
|
||||
|
||||
@ -2140,10 +2130,6 @@ nge_ioctl(ifp, command, data)
|
||||
s = splimp();
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFMTU:
|
||||
if (ifr->ifr_mtu > NGE_JUMBO_MTU)
|
||||
error = EINVAL;
|
||||
@ -2204,7 +2190,7 @@ nge_ioctl(ifp, command, data)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -674,7 +674,6 @@ struct nge_softc {
|
||||
bus_space_read_4(sc->nge_btag, sc->nge_bhandle, reg)
|
||||
|
||||
#define NGE_TIMEOUT 1000
|
||||
#define ETHER_ALIGN 2
|
||||
#define NGE_RXLEN 1536
|
||||
#define NGE_MIN_FRAMELEN 60
|
||||
|
||||
|
@ -189,9 +189,10 @@ pdq_os_receive_pdu(
|
||||
int drop)
|
||||
{
|
||||
pdq_softc_t *sc = pdq->pdq_os_ctx;
|
||||
struct ifnet *ifp = &sc->sc_if;
|
||||
struct fddi_header *fh;
|
||||
|
||||
sc->sc_if.if_ipackets++;
|
||||
ifp->if_ipackets++;
|
||||
#if defined(PDQ_BUS_DMA)
|
||||
{
|
||||
/*
|
||||
@ -217,15 +218,14 @@ pdq_os_receive_pdu(
|
||||
#endif
|
||||
fh = mtod(m, struct fddi_header *);
|
||||
if (drop || (fh->fddi_fc & (FDDIFC_L|FDDIFC_F)) != FDDIFC_LLC_ASYNC) {
|
||||
sc->sc_if.if_iqdrops++;
|
||||
sc->sc_if.if_ierrors++;
|
||||
ifp->if_iqdrops++;
|
||||
ifp->if_ierrors++;
|
||||
PDQ_OS_DATABUF_FREE(pdq, m);
|
||||
return;
|
||||
}
|
||||
|
||||
m_adj(m, FDDI_HDR_LEN);
|
||||
m->m_pkthdr.rcvif = &sc->sc_if;
|
||||
fddi_input(&sc->sc_if, fh, m);
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -459,7 +459,7 @@ lptap(struct ifnet *ifp, struct mbuf *m)
|
||||
m0.m_next = m;
|
||||
m0.m_len = sizeof(u_int32_t);
|
||||
m0.m_data = (char *)⁡
|
||||
bpf_mtap(ifp, &m0);
|
||||
BPF_MTAP(ifp, &m0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -517,7 +517,7 @@ ray_attach(device_t dev)
|
||||
ifp->if_init = ray_init;
|
||||
ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, ep->e_station_addr);
|
||||
|
||||
/*
|
||||
* Initialise the timers and driver
|
||||
@ -593,7 +593,7 @@ ray_detach(device_t dev)
|
||||
sc->sc_gone = 1;
|
||||
sc->sc_c.np_havenet = 0;
|
||||
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
/*
|
||||
* Stop the runq and wake up anyone sleeping for us.
|
||||
@ -644,15 +644,6 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
case SIOCSIFADDR:
|
||||
RAY_DPRINTF(sc, RAY_DBG_IOCTL, "GIFADDR/SIFMTU");
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
/* XXX SIFADDR used to fall through to SIOCSIFFLAGS */
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
RAY_DPRINTF(sc, RAY_DBG_IOCTL, "SIFFLAGS 0x%0x", ifp->if_flags);
|
||||
/*
|
||||
@ -734,7 +725,9 @@ ray_ioctl(register struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
RAY_DPRINTF(sc, RAY_DBG_IOCTL, "OTHER (pass to ether)");
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
@ -1910,7 +1903,6 @@ ray_rx_data(struct ray_softc *sc, struct mbuf *m0, u_int8_t siglev, u_int8_t ant
|
||||
{
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
struct ieee80211_frame *header = mtod(m0, struct ieee80211_frame *);
|
||||
struct ether_header *eh;
|
||||
struct llc *llc;
|
||||
u_int8_t *sa = NULL, *da = NULL, *ra = NULL, *ta = NULL;
|
||||
int trim = 0;
|
||||
@ -2024,6 +2016,7 @@ ray_rx_data(struct ray_softc *sc, struct mbuf *m0, u_int8_t siglev, u_int8_t ant
|
||||
llc->llc_un.type_snap.org_code[0] == 0 &&
|
||||
llc->llc_un.type_snap.org_code[1] == 0 &&
|
||||
llc->llc_un.type_snap.org_code[2] == 0) {
|
||||
struct ether_header *eh;
|
||||
/*
|
||||
* This is not magic. RFC1042 header is 8
|
||||
* bytes, with the last two bytes being the
|
||||
@ -2079,9 +2072,7 @@ ray_rx_data(struct ray_softc *sc, struct mbuf *m0, u_int8_t siglev, u_int8_t ant
|
||||
RAY_MBUF_DUMP(sc, RAY_DBG_RX, m0, "(3) packet after trimming");
|
||||
ifp->if_ipackets++;
|
||||
ray_rx_update_cache(sc, header->i_addr2, siglev, antenna);
|
||||
eh = mtod(m0, struct ether_header *);
|
||||
m_adj(m0, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, m0);
|
||||
(*ifp->if_input)(ifp, m0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -242,7 +242,7 @@ sbni_attach(struct sbni_softc *sc, int unit, struct sbni_flags flags)
|
||||
(csr0 & 0x01 ? 500000 : 2000000) / (1 << flags.rate);
|
||||
|
||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
}
|
||||
/* device attach does transition from UNCONFIGURED to IDLE state */
|
||||
|
||||
@ -693,8 +693,7 @@ prepare_to_send(struct sbni_softc *sc)
|
||||
|
||||
sbni_outb(sc, CSR0, sbni_inb(sc, CSR0) | TR_REQ);
|
||||
sc->arpcom.ac_if.if_flags |= IFF_OACTIVE;
|
||||
if (sc->arpcom.ac_if.if_bpf)
|
||||
bpf_mtap(&sc->arpcom.ac_if, sc->tx_buf_p);
|
||||
BPF_MTAP(&sc->arpcom.ac_if, sc->tx_buf_p);
|
||||
}
|
||||
|
||||
|
||||
@ -851,17 +850,14 @@ get_rx_buf(struct sbni_softc *sc)
|
||||
static void
|
||||
indicate_pkt(struct sbni_softc *sc)
|
||||
{
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
struct mbuf *m;
|
||||
struct ether_header *eh;
|
||||
|
||||
m = sc->rx_buf_p;
|
||||
m->m_pkthdr.rcvif = &sc->arpcom.ac_if;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = sc->inppos;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
|
||||
/* Remove link layer address and indicate packet */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(&sc->arpcom.ac_if, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
sc->rx_buf_p = NULL;
|
||||
}
|
||||
|
||||
@ -1063,11 +1059,6 @@ sbni_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* If the interface is marked up and stopped, then start it.
|
||||
@ -1149,7 +1140,8 @@ sbni_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
splx(s);
|
||||
|
@ -220,7 +220,7 @@ sn_attach(device_t dev)
|
||||
ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
|
||||
ifp->if_timer = 0;
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
|
||||
/*
|
||||
* Fill the hardware address into ifa_addr if we find an AF_LINK
|
||||
@ -250,7 +250,7 @@ sn_detach(device_t dev)
|
||||
struct sn_softc *sc = device_get_softc(dev);
|
||||
|
||||
sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING;
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
sn_deactivate(dev);
|
||||
return 0;
|
||||
}
|
||||
@ -553,9 +553,7 @@ startagain:
|
||||
sc->arpcom.ac_if.if_flags |= IFF_OACTIVE;
|
||||
sc->arpcom.ac_if.if_timer = 1;
|
||||
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, top);
|
||||
}
|
||||
BPF_MTAP(ifp, top);
|
||||
|
||||
sc->arpcom.ac_if.if_opackets++;
|
||||
m_freem(top);
|
||||
@ -750,9 +748,7 @@ snresume(struct ifnet *ifp)
|
||||
sc->intr_mask = mask;
|
||||
outw(BASE + MMU_CMD_REG_W, MMUCR_ENQUEUE);
|
||||
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, top);
|
||||
}
|
||||
BPF_MTAP(ifp, top);
|
||||
|
||||
sc->arpcom.ac_if.if_opackets++;
|
||||
m_freem(top);
|
||||
@ -1099,10 +1095,9 @@ read_another:
|
||||
/*
|
||||
* Remove link layer addresses and whatnot.
|
||||
*/
|
||||
m->m_pkthdr.len = m->m_len = packet_length - sizeof(struct ether_header);
|
||||
m->m_data += sizeof(struct ether_header);
|
||||
m->m_pkthdr.len = m->m_len = packet_length;
|
||||
|
||||
ether_input(&sc->arpcom.ac_if, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
out:
|
||||
|
||||
@ -1140,12 +1135,6 @@ snioctl(register struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
s = splimp();
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if ((ifp->if_flags & IFF_UP) == 0 && ifp->if_flags & IFF_RUNNING) {
|
||||
ifp->if_flags &= ~IFF_RUNNING;
|
||||
@ -1177,6 +1166,8 @@ snioctl(register struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
|
||||
splx(s);
|
||||
|
@ -197,7 +197,7 @@ sncconfig(sc, media, nmedia, defmedia, myea)
|
||||
ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
|
||||
}
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, myea);
|
||||
|
||||
#if NRND > 0
|
||||
rnd_attach_source(&sc->rnd_source, device_get_nameunit(sc->sc_dev),
|
||||
@ -261,12 +261,6 @@ sncioctl(ifp, cmd, data)
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
err = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if ((ifp->if_flags & IFF_UP) == 0 &&
|
||||
(ifp->if_flags & IFF_RUNNING) != 0) {
|
||||
@ -315,7 +309,8 @@ sncioctl(ifp, cmd, data)
|
||||
err = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
|
||||
break;
|
||||
default:
|
||||
err = EINVAL;
|
||||
err = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
splx(s);
|
||||
return (err);
|
||||
@ -358,8 +353,7 @@ outloop:
|
||||
* If bpf is listening on this interface, let it
|
||||
* see the packet before we commit it to the wire.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
/*
|
||||
* If there is nothing in the o/p queue, and there is room in
|
||||
@ -1105,9 +1099,8 @@ sonic_read(sc, pkt, len)
|
||||
}
|
||||
#endif /* SNCDEBUG */
|
||||
|
||||
/* Pass the packet up, with the ether header sort-of removed. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(ifp, et, m);
|
||||
/* Pass the packet up. */
|
||||
(*ifp->if_input)(ifp, m);
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
@ -868,8 +868,7 @@ top_srstart:
|
||||
#endif
|
||||
|
||||
#ifndef NETGRAPH
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, mtx);
|
||||
BPF_MTAP(ifp, mtx);
|
||||
#else /* NETGRAPH */
|
||||
sc->outbytes += len;
|
||||
#endif /* NETGRAPH */
|
||||
@ -2126,8 +2125,7 @@ sr_get_packets(struct sr_softc *sc)
|
||||
sr_copy_rxbuf(m, sc, len); /* copy from DPRAM */
|
||||
|
||||
#ifndef NETGRAPH
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
#if BUGGY > 3
|
||||
{
|
||||
|
@ -333,8 +333,9 @@ epic_attach(dev)
|
||||
printf("\n");
|
||||
|
||||
/* Attach to OS's managers */
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->sc_macaddr);
|
||||
ifp->if_hdrlen = sizeof(struct ether_vlan_header);
|
||||
ifp->if_capabilities |= IFCAP_VLAN_MTU;
|
||||
callout_handle_init(&sc->stat_ch);
|
||||
|
||||
fail:
|
||||
@ -359,7 +360,7 @@ epic_detach(dev)
|
||||
sc = device_get_softc(dev);
|
||||
ifp = &sc->arpcom.ac_if;
|
||||
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
epic_stop(sc);
|
||||
|
||||
@ -416,10 +417,6 @@ epic_ifioctl(ifp, command, data)
|
||||
x = splimp();
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFMTU:
|
||||
if (ifp->if_mtu == ifr->ifr_mtu)
|
||||
break;
|
||||
@ -475,7 +472,8 @@ epic_ifioctl(ifp, command, data)
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
splx(x);
|
||||
|
||||
@ -609,8 +607,7 @@ epic_ifstart(ifp)
|
||||
/* Set watchdog timer */
|
||||
ifp->if_timer = 8;
|
||||
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m0);
|
||||
BPF_MTAP(ifp, m0);
|
||||
}
|
||||
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
@ -631,7 +628,6 @@ epic_rx_done(sc)
|
||||
struct epic_rx_buffer *buf;
|
||||
struct epic_rx_desc *desc;
|
||||
struct mbuf *m;
|
||||
struct ether_header *eh;
|
||||
|
||||
while ((sc->rx_desc[sc->cur_rx].status & 0x8000) == 0) {
|
||||
buf = sc->rx_buffer + sc->cur_rx;
|
||||
@ -671,13 +667,11 @@ epic_rx_done(sc)
|
||||
desc->status = 0x8000;
|
||||
|
||||
/* First mbuf in packet holds the ethernet and packet headers */
|
||||
eh = mtod(m, struct ether_header *);
|
||||
m->m_pkthdr.len = m->m_len = len - sizeof(struct ether_header);
|
||||
m->m_data += sizeof(struct ether_header);
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = m->m_len = len;
|
||||
|
||||
/* Give mbuf to OS */
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
/* Successfuly received frame */
|
||||
ifp->if_ipackets++;
|
||||
|
@ -383,7 +383,7 @@ txp_attach(dev)
|
||||
/*
|
||||
* Attach us everywhere
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->sc_arpcom.ac_enaddr);
|
||||
callout_handle_init(&sc->sc_tick);
|
||||
return(0);
|
||||
|
||||
@ -408,7 +408,7 @@ txp_detach(dev)
|
||||
txp_shutdown(dev);
|
||||
|
||||
ifmedia_removeall(&sc->sc_ifmedia);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
for (i = 0; i < RXBUF_ENTRIES; i++)
|
||||
free(sc->sc_rxbufs[i].rb_sd, M_DEVBUF);
|
||||
@ -736,7 +736,6 @@ txp_rx_reclaim(sc, r)
|
||||
struct mbuf *m;
|
||||
struct txp_swdesc *sd = NULL;
|
||||
u_int32_t roff, woff;
|
||||
struct ether_header *eh = NULL;
|
||||
|
||||
roff = *r->r_roff;
|
||||
woff = *r->r_woff;
|
||||
@ -804,16 +803,12 @@ txp_rx_reclaim(sc, r)
|
||||
m->m_pkthdr.csum_data = 0xffff;
|
||||
}
|
||||
|
||||
eh = mtod(m, struct ether_header *);
|
||||
/* Remove header from mbuf and pass it on. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
|
||||
if (rxd->rx_stat & RX_STAT_VLAN) {
|
||||
VLAN_INPUT_TAG(eh, m, htons(rxd->rx_vlan >> 16));
|
||||
goto next;
|
||||
VLAN_INPUT_TAG(ifp,
|
||||
m, htons(rxd->rx_vlan >> 16), goto next);
|
||||
}
|
||||
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
next:
|
||||
|
||||
@ -1103,17 +1098,7 @@ txp_ioctl(ifp, command, data)
|
||||
|
||||
s = splnet();
|
||||
|
||||
if ((error = ether_ioctl(ifp, command, data)) > 0) {
|
||||
splx(s);
|
||||
return error;
|
||||
}
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
txp_init(sc);
|
||||
@ -1136,7 +1121,7 @@ txp_ioctl(ifp, command, data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &sc->sc_ifmedia, command);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1314,7 +1299,7 @@ txp_start(ifp)
|
||||
struct mbuf *m, *m0;
|
||||
struct txp_swdesc *sd;
|
||||
u_int32_t firstprod, firstcnt, prod, cnt;
|
||||
struct ifvlan *ifv;
|
||||
struct m_tag *mtag;
|
||||
|
||||
if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
|
||||
return;
|
||||
@ -1351,11 +1336,10 @@ txp_start(ifp)
|
||||
if (++cnt >= (TX_ENTRIES - 4))
|
||||
goto oactive;
|
||||
|
||||
if ((m->m_flags & (M_PROTO1|M_PKTHDR)) == (M_PROTO1|M_PKTHDR) &&
|
||||
m->m_pkthdr.rcvif != NULL) {
|
||||
ifv = m->m_pkthdr.rcvif->if_softc;
|
||||
mtag = VLAN_OUTPUT_TAG(ifp, m);
|
||||
if (mtag != NULL) {
|
||||
txd->tx_pflags = TX_PFLAGS_VLAN |
|
||||
(htons(ifv->ifv_tag) << TX_PFLAGS_VLANTAG_S);
|
||||
(htons(VLAN_TAG_VALUE(mtag)) << TX_PFLAGS_VLANTAG_S);
|
||||
}
|
||||
|
||||
if (m->m_pkthdr.csum_flags & CSUM_IP)
|
||||
@ -1394,8 +1378,7 @@ txp_start(ifp)
|
||||
|
||||
ifp->if_timer = 5;
|
||||
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
WRITE_REG(sc, r->r_reg, TXP_IDX2OFFSET(prod));
|
||||
}
|
||||
|
||||
@ -1877,6 +1860,7 @@ txp_capabilities(sc)
|
||||
if (rsp->rsp_par2 & rsp->rsp_par3 & OFFLOAD_VLAN) {
|
||||
sc->sc_tx_capability |= OFFLOAD_VLAN;
|
||||
sc->sc_rx_capability |= OFFLOAD_VLAN;
|
||||
ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
@ -765,7 +765,7 @@ USB_ATTACH(aue)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
callout_handle_init(&sc->aue_stat_ch);
|
||||
usb_register_netisr();
|
||||
sc->aue_dying = 0;
|
||||
@ -786,7 +786,7 @@ aue_detach(device_ptr_t dev)
|
||||
|
||||
sc->aue_dying = 1;
|
||||
untimeout(aue_tick, sc, sc->aue_stat_ch);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
if (sc->aue_ep[AUE_ENDPT_TX] != NULL)
|
||||
usbd_abort_pipe(sc->aue_ep[AUE_ENDPT_TX]);
|
||||
@ -1196,8 +1196,7 @@ aue_start(struct ifnet *ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
|
||||
@ -1367,11 +1366,6 @@ aue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
AUE_LOCK(sc);
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_flags & IFF_RUNNING &&
|
||||
@ -1402,7 +1396,7 @@ aue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -257,7 +257,6 @@ struct aue_softc {
|
||||
#endif
|
||||
|
||||
#define AUE_TIMEOUT 1000
|
||||
#define ETHER_ALIGN 2
|
||||
#define AUE_BUFSZ 1536
|
||||
#define AUE_MIN_FRAMELEN 60
|
||||
#define AUE_INTR_INTERVAL 100 /* ms */
|
||||
|
@ -523,7 +523,7 @@ USB_ATTACH(cue)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, eaddr);
|
||||
callout_handle_init(&sc->cue_stat_ch);
|
||||
usb_register_netisr();
|
||||
sc->cue_dying = 0;
|
||||
@ -544,7 +544,7 @@ cue_detach(device_ptr_t dev)
|
||||
|
||||
sc->cue_dying = 1;
|
||||
untimeout(cue_tick, sc, sc->cue_stat_ch);
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
if (sc->cue_ep[CUE_ENDPT_TX] != NULL)
|
||||
usbd_abort_pipe(sc->cue_ep[CUE_ENDPT_TX]);
|
||||
@ -890,8 +890,7 @@ cue_start(struct ifnet *ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
|
||||
@ -1016,11 +1015,6 @@ cue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
CUE_LOCK(sc);
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_flags & IFF_RUNNING &&
|
||||
@ -1048,7 +1042,7 @@ cue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
error = 0;
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -116,7 +116,6 @@
|
||||
#define CUE_MCAST_TABLE_LEN 64
|
||||
|
||||
#define CUE_TIMEOUT 1000
|
||||
#define ETHER_ALIGN 2
|
||||
#define CUE_BUFSZ 1536
|
||||
#define CUE_MIN_FRAMELEN 60
|
||||
#define CUE_RX_FRAMES 1
|
||||
|
@ -493,7 +493,7 @@ USB_ATTACH(kue)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->kue_desc.kue_macaddr);
|
||||
usb_register_netisr();
|
||||
sc->kue_dying = 0;
|
||||
|
||||
@ -515,7 +515,7 @@ kue_detach(device_ptr_t dev)
|
||||
sc->kue_dying = 1;
|
||||
|
||||
if (ifp != NULL)
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
|
||||
if (sc->kue_ep[KUE_ENDPT_TX] != NULL)
|
||||
usbd_abort_pipe(sc->kue_ep[KUE_ENDPT_TX]);
|
||||
@ -839,8 +839,7 @@ kue_start(struct ifnet *ifp)
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
* to him.
|
||||
*/
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m_head);
|
||||
BPF_MTAP(ifp, m_head);
|
||||
|
||||
ifp->if_flags |= IFF_OACTIVE;
|
||||
|
||||
@ -953,11 +952,6 @@ kue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
KUE_LOCK(sc);
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
if (ifp->if_flags & IFF_RUNNING &&
|
||||
@ -987,7 +981,7 @@ kue_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
error = 0;
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,6 @@ struct kue_ether_desc {
|
||||
#define KUE_RXFILT_MULTICAST 0x0010
|
||||
|
||||
#define KUE_TIMEOUT 1000
|
||||
#define ETHER_ALIGN 2
|
||||
#define KUE_BUFSZ 1536
|
||||
#define KUE_MIN_FRAMELEN 60
|
||||
|
||||
|
@ -80,7 +80,6 @@ Static void usbintr (void);
|
||||
|
||||
Static void usbintr()
|
||||
{
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
struct usb_qdat *q;
|
||||
struct ifnet *ifp;
|
||||
@ -90,12 +89,10 @@ Static void usbintr()
|
||||
IF_DEQUEUE(&usbq_rx, m);
|
||||
if (m == NULL)
|
||||
break;
|
||||
eh = mtod(m, struct ether_header *);
|
||||
q = (struct usb_qdat *)m->m_pkthdr.rcvif;
|
||||
ifp = q->ifp;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
/* Re-arm the receiver */
|
||||
(*q->if_rxstart)(ifp);
|
||||
|
@ -164,7 +164,7 @@ vxattach(sc)
|
||||
ifp->if_watchdog = vxwatchdog;
|
||||
ifp->if_softc = sc;
|
||||
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
|
||||
sc->tx_start_thresh = 20; /* probably a good starting point. */
|
||||
|
||||
@ -441,9 +441,7 @@ startagain:
|
||||
CSR_WRITE_2(sc, VX_COMMAND, SET_TX_START_THRESH |
|
||||
((len / 4 + sc->tx_start_thresh) >> 2));
|
||||
|
||||
if (sc->arpcom.ac_if.if_bpf) {
|
||||
bpf_mtap(&sc->arpcom.ac_if, m);
|
||||
}
|
||||
BPF_MTAP(&sc->arpcom.ac_if, m);
|
||||
|
||||
/*
|
||||
* Do the output at splhigh() so that an interrupt from another device
|
||||
@ -714,8 +712,7 @@ again:
|
||||
return;
|
||||
}
|
||||
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
|
||||
/*
|
||||
* In periods of high traffic we can actually receive enough
|
||||
@ -855,11 +852,6 @@ vxioctl(ifp, cmd, data)
|
||||
s = splimp();
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if ((ifp->if_flags & IFF_UP) == 0 &&
|
||||
(ifp->if_flags & IFF_RUNNING) != 0) {
|
||||
@ -910,7 +902,8 @@ vxioctl(ifp, cmd, data)
|
||||
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
|
||||
splx(s);
|
||||
|
@ -211,7 +211,7 @@ wi_generic_detach(dev)
|
||||
/* Delete all remaining media. */
|
||||
ifmedia_removeall(&sc->ifmedia);
|
||||
|
||||
ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(ifp);
|
||||
bus_teardown_intr(dev, sc->irq, sc->wi_intrhand);
|
||||
wi_free(dev);
|
||||
sc->wi_gone = 1;
|
||||
@ -469,7 +469,7 @@ wi_generic_attach(device_t dev)
|
||||
/*
|
||||
* Call MI attach routine.
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
callout_handle_init(&sc->wi_stat_ch);
|
||||
WI_UNLOCK(sc, s);
|
||||
|
||||
@ -675,8 +675,7 @@ wi_rxeof(sc)
|
||||
ifp->if_ipackets++;
|
||||
|
||||
/* Handle BPF listeners. */
|
||||
if (ifp->if_bpf)
|
||||
bpf_mtap(ifp, m);
|
||||
BPF_MTAP(ifp, m);
|
||||
|
||||
m_freem(m);
|
||||
} else {
|
||||
@ -816,11 +815,10 @@ wi_rxeof(sc)
|
||||
return;
|
||||
}
|
||||
/* Receive packet. */
|
||||
m_adj(m, sizeof(struct ether_header));
|
||||
#ifdef WICACHE
|
||||
wi_cache_store(sc, eh, m, rx_frame.wi_q_info);
|
||||
#endif
|
||||
ether_input(ifp, eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1679,11 +1677,6 @@ wi_ioctl(ifp, command, data)
|
||||
}
|
||||
|
||||
switch(command) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* Can't do promisc and hostap at the same time. If all that's
|
||||
@ -2047,7 +2040,7 @@ wi_ioctl(ifp, command, data)
|
||||
error = wihap_ioctl(sc, command, data);
|
||||
break;
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
}
|
||||
out:
|
||||
@ -2405,8 +2398,8 @@ nextpkt:
|
||||
* this frame to him. Also, don't send this to the bpf sniffer
|
||||
* if we're in procframe or monitor sniffing mode.
|
||||
*/
|
||||
if (!(sc->wi_procframe || sc->wi_debug.wi_monitor) && ifp->if_bpf)
|
||||
bpf_mtap(ifp, m0);
|
||||
if (!(sc->wi_procframe || sc->wi_debug.wi_monitor))
|
||||
BPF_MTAP(ifp, m0);
|
||||
|
||||
m_freem(m0);
|
||||
|
||||
|
@ -505,7 +505,7 @@ wlattach(struct isa_device *id)
|
||||
ifp->if_done
|
||||
ifp->if_reset
|
||||
*/
|
||||
ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(ifp, &sc->wl_addr[0]);
|
||||
|
||||
bcopy(&sc->wl_addr[0], sc->wl_ac.ac_enaddr, WAVELAN_ADDR_SIZE);
|
||||
printf("%s%d: address %6D, NWID 0x%02x%02x", ifp->if_name, ifp->if_unit,
|
||||
@ -886,9 +886,7 @@ wlstart(struct ifnet *ifp)
|
||||
IF_DEQUEUE(&ifp->if_snd, m);
|
||||
if (m != (struct mbuf *)0) {
|
||||
/* let BPF see it before we commit it */
|
||||
if (ifp->if_bpf) {
|
||||
bpf_mtap(ifp, m);
|
||||
}
|
||||
BPF_MTAP(ifp, m);
|
||||
sc->tbusy++;
|
||||
/* set the watchdog timer so that if the board
|
||||
* fails to interrupt we will restart
|
||||
@ -929,45 +927,33 @@ wlread(int unit, u_short fd_p)
|
||||
register struct ifnet *ifp = &sc->wl_if;
|
||||
short base = sc->base;
|
||||
fd_t fd;
|
||||
struct ether_header eh;
|
||||
struct mbuf *m, *tm;
|
||||
struct ether_header *eh;
|
||||
struct mbuf *m;
|
||||
rbd_t rbd;
|
||||
u_char *mb_p;
|
||||
u_short mlen, len, clen;
|
||||
u_short mlen, len;
|
||||
u_short bytes_in_msg, bytes_in_mbuf, bytes;
|
||||
|
||||
|
||||
#ifdef WLDEBUG
|
||||
if (sc->wl_if.if_flags & IFF_DEBUG)
|
||||
printf("wl%d: entered wlread()\n",unit);
|
||||
printf("wl%d: entered wlread()\n", unit);
|
||||
#endif
|
||||
if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) {
|
||||
printf("wl%d read(): board is not running.\n", ifp->if_unit);
|
||||
printf("wl%d read(): board is not running.\n", unit);
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
}
|
||||
/* read ether_header info out of device memory. doesn't
|
||||
* go into mbuf. goes directly into eh structure
|
||||
*/
|
||||
len = sizeof(struct ether_header); /* 14 bytes */
|
||||
outw(PIOR1(base), fd_p);
|
||||
insw(PIOP1(base), &fd, (sizeof(fd_t) - len)/2);
|
||||
insw(PIOP1(base), &eh, (len-2)/2);
|
||||
eh.ether_type = ntohs(inw(PIOP1(base)));
|
||||
#ifdef WLDEBUG
|
||||
if (sc->wl_if.if_flags & IFF_DEBUG) {
|
||||
printf("wlread: rcv packet, type is %x\n", eh.ether_type);
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* WARNING. above is done now in ether_input, above may be
|
||||
* useful for debug. jrb
|
||||
*/
|
||||
eh.ether_type = htons(eh.ether_type);
|
||||
|
||||
/*
|
||||
* Collect message size.
|
||||
*/
|
||||
outw(PIOR1(base), fd_p);
|
||||
insw(PIOP1(base), &fd, sizeof(fd_t)/2);
|
||||
if (fd.rbd_offset == I82586NULL) {
|
||||
printf("wl%d read(): Invalid buffer\n", unit);
|
||||
if (wlhwrst(unit) != TRUE) {
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
printf("wl%d read(): hwrst trouble.\n", unit);
|
||||
}
|
||||
return 0;
|
||||
@ -976,14 +962,12 @@ wlread(int unit, u_short fd_p)
|
||||
outw(PIOR1(base), fd.rbd_offset);
|
||||
insw(PIOP1(base), &rbd, sizeof(rbd_t)/2);
|
||||
bytes_in_msg = rbd.status & RBD_SW_COUNT;
|
||||
MGETHDR(m, M_DONTWAIT, MT_DATA);
|
||||
tm = m;
|
||||
if (m == (struct mbuf *)0) {
|
||||
/*
|
||||
* not only do we want to return, we need to drop the packet on
|
||||
* the floor to clear the interrupt.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Allocate a cluster'd mbuf to receive the packet.
|
||||
*/
|
||||
m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
|
||||
if (m == NULL) {
|
||||
if (wlhwrst(unit) != TRUE) {
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
@ -991,31 +975,15 @@ wlread(int unit, u_short fd_p)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
m->m_next = (struct mbuf *) 0;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
m->m_pkthdr.len = 0; /* don't know this yet */
|
||||
m->m_len = MHLEN;
|
||||
m->m_pkthdr.len = m->m_len = MCLBYTES;
|
||||
m_adj(m, ETHER_ALIGN); /* align IP header */
|
||||
|
||||
/* always use a cluster. jrb
|
||||
/*
|
||||
* Collect the message data.
|
||||
*/
|
||||
MCLGET(m, M_DONTWAIT);
|
||||
if (m->m_flags & M_EXT) {
|
||||
m->m_len = MCLBYTES;
|
||||
}
|
||||
else {
|
||||
m_freem(m);
|
||||
if (wlhwrst(unit) != TRUE) {
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
printf("wl%d read(): hwrst trouble.\n", unit);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
mlen = 0;
|
||||
clen = mlen;
|
||||
bytes_in_mbuf = m->m_len;
|
||||
mb_p = mtod(tm, u_char *);
|
||||
mb_p = mtod(m, u_char *);
|
||||
bytes_in_mbuf = MCLBYTES;
|
||||
bytes = min(bytes_in_mbuf, bytes_in_msg);
|
||||
for (;;) {
|
||||
if (bytes & 1) {
|
||||
@ -1025,40 +993,29 @@ wlread(int unit, u_short fd_p)
|
||||
}
|
||||
outw(PIOR1(base), rbd.buffer_addr);
|
||||
insw(PIOP1(base), mb_p, len/2);
|
||||
clen += bytes;
|
||||
mlen += bytes;
|
||||
|
||||
if (!(bytes_in_mbuf -= bytes)) {
|
||||
MGET(tm->m_next, M_DONTWAIT, MT_DATA);
|
||||
tm = tm->m_next;
|
||||
if (tm == (struct mbuf *)0) {
|
||||
m_freem(m);
|
||||
printf("wl%d read(): No mbuf nth\n", unit);
|
||||
if (wlhwrst(unit) != TRUE) {
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
printf("wl%d read(): hwrst trouble.\n", unit);
|
||||
}
|
||||
return 0;
|
||||
if (bytes > bytes_in_mbuf) {
|
||||
/* XXX something wrong, a packet should fit in 1 cluster */
|
||||
m_freem(m);
|
||||
printf("wl%d read(): packet too large (%u > %u)\n",
|
||||
unit, bytes, bytes_in_mbuf);
|
||||
if (wlhwrst(unit) != TRUE) {
|
||||
sc->hacr &= ~HACR_INTRON;
|
||||
CMD(unit); /* turn off interrupts */
|
||||
printf("wl%d read(): hwrst trouble.\n", unit);
|
||||
}
|
||||
mlen = 0;
|
||||
tm->m_len = MLEN;
|
||||
bytes_in_mbuf = MLEN;
|
||||
mb_p = mtod(tm, u_char *);
|
||||
} else {
|
||||
mb_p += bytes;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(bytes_in_msg -= bytes)) {
|
||||
if (rbd.status & RBD_SW_EOF ||
|
||||
rbd.next_rbd_offset == I82586NULL) {
|
||||
tm->m_len = mlen;
|
||||
mb_p += bytes;
|
||||
bytes_in_msg -= bytes;
|
||||
if (bytes_in_msg == 0) {
|
||||
if (rbd.status & RBD_SW_EOF || rbd.next_rbd_offset == I82586NULL) {
|
||||
break;
|
||||
} else {
|
||||
outw(PIOR1(base), rbd.next_rbd_offset);
|
||||
insw(PIOP1(base), &rbd, sizeof(rbd_t)/2);
|
||||
bytes_in_msg = rbd.status & RBD_SW_COUNT;
|
||||
}
|
||||
outw(PIOR1(base), rbd.next_rbd_offset);
|
||||
insw(PIOP1(base), &rbd, sizeof(rbd_t)/2);
|
||||
bytes_in_msg = rbd.status & RBD_SW_COUNT;
|
||||
} else {
|
||||
rbd.buffer_addr += bytes;
|
||||
}
|
||||
@ -1066,7 +1023,8 @@ wlread(int unit, u_short fd_p)
|
||||
bytes = min(bytes_in_mbuf, bytes_in_msg);
|
||||
}
|
||||
|
||||
m->m_pkthdr.len = clen;
|
||||
m->m_pkthdr.len = m->m_len = mlen;
|
||||
m->m_pkthdr.rcvif = ifp;
|
||||
|
||||
/*
|
||||
* If hw is in promiscuous mode (note that I said hardware, not if
|
||||
@ -1081,6 +1039,8 @@ wlread(int unit, u_short fd_p)
|
||||
* However, there does not appear to be a way to read the nwid
|
||||
* for a received packet. -gdt 1998-08-07
|
||||
*/
|
||||
/* XXX verify mbuf length */
|
||||
eh = mtod(m, struct ether_header *);
|
||||
if (
|
||||
#ifdef WL_USE_IFNET_PROMISC_CHECK /* not defined */
|
||||
(sc->wl_ac.ac_if.if_flags & (IFF_PROMISC|IFF_ALLMULTI))
|
||||
@ -1089,28 +1049,27 @@ wlread(int unit, u_short fd_p)
|
||||
(sc->mode & (MOD_PROM | MOD_ENAL))
|
||||
#endif
|
||||
&&
|
||||
(eh.ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
|
||||
bcmp(eh.ether_dhost, sc->wl_ac.ac_enaddr,
|
||||
sizeof(eh.ether_dhost)) != 0 ) {
|
||||
(eh->ether_dhost[0] & 1) == 0 && /* !mcast and !bcast */
|
||||
bcmp(eh->ether_dhost, sc->wl_ac.ac_enaddr,
|
||||
sizeof(eh->ether_dhost)) != 0 ) {
|
||||
m_freem(m);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef WLDEBUG
|
||||
if (sc->wl_if.if_flags & IFF_DEBUG)
|
||||
printf("wl%d: wlrecv %d bytes\n", unit, clen);
|
||||
printf("wl%d: wlrecv %u bytes\n", unit, mlen);
|
||||
#endif
|
||||
|
||||
#ifdef WLCACHE
|
||||
wl_cache_store(unit, base, &eh, m);
|
||||
wl_cache_store(unit, base, eh, m);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* received packet is now in a chain of mbuf's. next step is
|
||||
* to pass the packet upwards.
|
||||
*
|
||||
*/
|
||||
ether_input(&sc->wl_if, &eh, m);
|
||||
(*ifp->if_input)(ifp, m);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1149,12 +1108,6 @@ wlioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
#endif
|
||||
opri = splimp();
|
||||
switch (cmd) {
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_ALLMULTI) {
|
||||
mode |= MOD_ENAL;
|
||||
@ -1349,7 +1302,8 @@ wlioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
|
||||
#endif
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, cmd, data);
|
||||
break;
|
||||
}
|
||||
splx(opri);
|
||||
return (error);
|
||||
|
@ -289,7 +289,7 @@ xe_attach (device_t dev)
|
||||
device_printf(dev, "Ethernet address %6D\n", scp->arpcom.ac_enaddr, ":");
|
||||
|
||||
/* Attach the interface */
|
||||
ether_ifattach(scp->ifp, ETHER_BPF_SUPPORTED);
|
||||
ether_ifattach(scp->ifp, scp->arpcom.ac_enaddr);
|
||||
|
||||
/* Done */
|
||||
return 0;
|
||||
@ -416,12 +416,7 @@ xe_start(struct ifnet *ifp) {
|
||||
}
|
||||
|
||||
/* Tap off here if there is a bpf listener */
|
||||
if (ifp->if_bpf) {
|
||||
#if XE_DEBUG > 1
|
||||
device_printf(scp->dev, "sending output packet to BPF\n");
|
||||
#endif
|
||||
bpf_mtap(ifp, mbp);
|
||||
}
|
||||
BPF_MTAP(ifp, mbp);
|
||||
|
||||
ifp->if_timer = 5; /* In case we don't hear from the card again */
|
||||
scp->tx_queued++;
|
||||
@ -446,12 +441,6 @@ xe_ioctl (register struct ifnet *ifp, u_long command, caddr_t data) {
|
||||
|
||||
switch (command) {
|
||||
|
||||
case SIOCSIFADDR:
|
||||
case SIOCGIFADDR:
|
||||
case SIOCSIFMTU:
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
/*
|
||||
* If the interface is marked up and stopped, then start it. If it is
|
||||
@ -489,7 +478,7 @@ xe_ioctl (register struct ifnet *ifp, u_long command, caddr_t data) {
|
||||
break;
|
||||
|
||||
default:
|
||||
error = EINVAL;
|
||||
error = ether_ioctl(ifp, command, data);
|
||||
}
|
||||
|
||||
(void)splx(s);
|
||||
@ -729,9 +718,8 @@ xe_intr(void *xscp)
|
||||
|
||||
/* Deliver packet to upper layers */
|
||||
if (mbp != NULL) {
|
||||
mbp->m_pkthdr.len = mbp->m_len = len - ETHER_HDR_LEN;
|
||||
mbp->m_data += ETHER_HDR_LEN; /* Strip off Ethernet header */
|
||||
ether_input(ifp, ehp, mbp); /* Send the packet on its way */
|
||||
mbp->m_pkthdr.len = mbp->m_len = len;
|
||||
(*ifp->if_input)(ifp, mbp); /* Send the packet on its way */
|
||||
ifp->if_ipackets++; /* Success! */
|
||||
}
|
||||
XE_OUTW(XE_DO, 0x8000); /* skip_rx_packet command */
|
||||
|
@ -301,7 +301,7 @@ xe_pccard_detach(device_t dev)
|
||||
struct xe_softc *sc = device_get_softc(dev);
|
||||
|
||||
sc->arpcom.ac_if.if_flags &= ~IFF_RUNNING;
|
||||
ether_ifdetach(&sc->arpcom.ac_if, ETHER_BPF_SUPPORTED);
|
||||
ether_ifdetach(&sc->arpcom.ac_if);
|
||||
xe_deactivate(dev);
|
||||
return (0);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user