diff options
author | sam <sam@FreeBSD.org> | 2002-11-14 23:54:55 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2002-11-14 23:54:55 +0000 |
commit | 14c32b5f40c5ee3bd5649c3737f359f7e65e6944 (patch) | |
tree | 84eb7252cc6a518796c6bf88903ed6e2d12e7b91 /sys/dev/em/if_em.c | |
parent | 10eb947d277840d02ef35d6c6303b64329d53806 (diff) | |
download | FreeBSD-src-14c32b5f40c5ee3bd5649c3737f359f7e65e6944.zip FreeBSD-src-14c32b5f40c5ee3bd5649c3737f359f7e65e6944.tar.gz |
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
Diffstat (limited to 'sys/dev/em/if_em.c')
-rw-r--r-- | sys/dev/em/if_em.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/sys/dev/em/if_em.c b/sys/dev/em/if_em.c index 1915e91..ecbea9a 100644 --- a/sys/dev/em/if_em.c +++ b/sys/dev/em/if_em.c @@ -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; |