summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/re.c11
-rw-r--r--sys/dev/pci/if_bnx.c20
-rw-r--r--sys/dev/pci/if_ix.c19
-rw-r--r--sys/dev/pci/if_txp.c48
4 files changed, 33 insertions, 65 deletions
diff --git a/sys/dev/ic/re.c b/sys/dev/ic/re.c
index c1b54c09189..35520604f42 100644
--- a/sys/dev/ic/re.c
+++ b/sys/dev/ic/re.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: re.c,v 1.94 2008/10/11 23:49:05 brad Exp $ */
+/* $OpenBSD: re.c,v 1.95 2008/10/16 19:16:21 naddy Exp $ */
/* $FreeBSD: if_re.c,v 1.31 2004/09/04 07:54:05 ru Exp $ */
/*
* Copyright (c) 1997, 1998-2003
@@ -1461,6 +1461,13 @@ re_rxeof(struct rl_softc *sc)
m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK |
M_UDP_CSUM_IN_OK;
}
+#if NVLAN > 0
+ if (rxvlan & RL_RDESC_VLANCTL_TAG) {
+ m->m_pkthdr.ether_vtag =
+ ntohs((rxvlan & RL_RDESC_VLANCTL_DATA));
+ m->m_flags |= M_VLANTAG;
+ }
+#endif
#if NBPFILTER > 0
if (ifp->if_bpf)
@@ -1917,6 +1924,8 @@ re_init(struct ifnet *ifp)
cfg = RL_CPLUSCMD_PCI_MRW;
if (ifp->if_capabilities & IFCAP_CSUM_IPv4)
cfg |= RL_CPLUSCMD_RXCSUM_ENB;
+ if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING)
+ cfg |= RL_CPLUSCMD_VLANSTRIP;
if (sc->rl_flags & RL_FLAG_MACSTAT) {
cfg |= RL_CPLUSCMD_MACSTAT_DIS;
/* XXX magic. */
diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c
index aea799bddb6..b5fc6269d48 100644
--- a/sys/dev/pci/if_bnx.c
+++ b/sys/dev/pci/if_bnx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_bnx.c,v 1.66 2008/10/02 20:21:14 brad Exp $ */
+/* $OpenBSD: if_bnx.c,v 1.67 2008/10/16 19:16:21 naddy Exp $ */
/*-
* Copyright (c) 2006 Broadcom Corporation
@@ -4014,26 +4014,14 @@ bnx_rx_intr(struct bnx_softc *sc)
if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) &&
!(sc->rx_mode & BNX_EMAC_RX_MODE_KEEP_VLAN_TAG)) {
#if NVLAN > 0
- struct ether_vlan_header vh;
-
DBPRINT(sc, BNX_VERBOSE_SEND,
"%s(): VLAN tag = 0x%04X\n",
__FUNCTION__,
l2fhdr->l2_fhdr_vlan_tag);
- if (m->m_pkthdr.len < ETHER_HDR_LEN) {
- m_freem(m);
- goto bnx_rx_int_next_rx;
- }
- m_copydata(m, 0, ETHER_HDR_LEN, (caddr_t)&vh);
- vh.evl_proto = vh.evl_encap_proto;
- vh.evl_tag = htons(l2fhdr->l2_fhdr_vlan_tag);
- vh.evl_encap_proto = htons(ETHERTYPE_VLAN);
- m_adj(m, ETHER_HDR_LEN);
- M_PREPEND(m, sizeof(vh), M_DONTWAIT);
- if (m == NULL)
- goto bnx_rx_int_next_rx;
- m_copyback(m, 0, sizeof(vh), &vh);
+ m->m_pkthdr.ether_vtag =
+ l2fhdr->l2_fhdr_vlan_tag;
+ m->m_flags |= M_VLANTAG;
#else
m_freem(m);
goto bnx_rx_int_next_rx;
diff --git a/sys/dev/pci/if_ix.c b/sys/dev/pci/if_ix.c
index 0ba819967e7..f7d962f8f54 100644
--- a/sys/dev/pci/if_ix.c
+++ b/sys/dev/pci/if_ix.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_ix.c,v 1.10 2008/10/11 20:31:50 miod Exp $ */
+/* $OpenBSD: if_ix.c,v 1.11 2008/10/16 19:16:21 naddy Exp $ */
/******************************************************************************
@@ -2791,22 +2791,9 @@ ixgbe_rxeof(struct rx_ring *rxr, int count)
#if NVLAN > 0 && defined(IX_CSUM_OFFLOAD)
if (staterr & IXGBE_RXD_STAT_VP) {
- struct ether_vlan_header vh;
-
- if (m->m_pkthdr.len < ETHER_HDR_LEN)
- goto discard;
- m_copydata(m, 0,
- ETHER_HDR_LEN, (caddr_t)&vh);
- vh.evl_proto = vh.evl_encap_proto;
- vh.evl_tag =
+ m->m_pkthdr.ether_vtag =
letoh16(cur->wb.upper.vlan);
- vh.evl_encap_proto =
- htons(ETHERTYPE_VLAN);
- m_adj(m, ETHER_HDR_LEN);
- M_PREPEND(m, sizeof(vh), M_DONTWAIT);
- if (m == NULL)
- goto discard;
- m_copyback(m, 0, sizeof(vh), &vh);
+ m->m_flags |= M_VLANTAG;
}
#endif
rxr->fmp = NULL;
diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c
index ba6043f8172..24d1547b530 100644
--- a/sys/dev/pci/if_txp.c
+++ b/sys/dev/pci/if_txp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_txp.c,v 1.95 2008/10/02 20:21:14 brad Exp $ */
+/* $OpenBSD: if_txp.c,v 1.96 2008/10/16 19:16:21 naddy Exp $ */
/*
* Copyright (c) 2001
@@ -641,31 +641,6 @@ txp_rx_reclaim(struct txp_softc *sc, struct txp_rx_ring *r,
free(sd, M_DEVBUF);
m->m_pkthdr.len = m->m_len = letoh16(rxd->rx_len);
-#if NVLAN > 0
- /*
- * XXX Another firmware bug: the vlan encapsulation
- * is always removed, even when we tell the card not
- * to do that. Restore the vlan encapsulation below.
- */
- if (rxd->rx_stat & htole32(RX_STAT_VLAN)) {
- struct ether_vlan_header vh;
-
- if (m->m_pkthdr.len < ETHER_HDR_LEN) {
- m_freem(m);
- goto next;
- }
- m_copydata(m, 0, ETHER_HDR_LEN, (caddr_t)&vh);
- vh.evl_proto = vh.evl_encap_proto;
- vh.evl_tag = rxd->rx_vlan >> 16;
- vh.evl_encap_proto = htons(ETHERTYPE_VLAN);
- m_adj(m, ETHER_HDR_LEN);
- M_PREPEND(m, sizeof(vh), M_DONTWAIT);
- if (m == NULL)
- goto next;
- m_copyback(m, 0, sizeof(vh), &vh);
- }
-#endif
-
#ifdef __STRICT_ALIGNMENT
{
/*
@@ -698,6 +673,18 @@ txp_rx_reclaim(struct txp_softc *sc, struct txp_rx_ring *r,
}
#endif
+#if NVLAN > 0
+ /*
+ * XXX Another firmware bug: the vlan encapsulation
+ * is always removed, even when we tell the card not
+ * to do that. Restore the vlan encapsulation below.
+ */
+ if (rxd->rx_stat & htole32(RX_STAT_VLAN)) {
+ m->m_pkthdr.ether_vtag = ntohs(rxd->rx_vlan >> 16);
+ m->m_flags |= M_VLANTAG;
+ }
+#endif
+
#if NBPFILTER > 0
/*
* Handle BPF listeners. Let the BPF user see the packet.
@@ -775,10 +762,8 @@ txp_rxbuf_reclaim(struct txp_softc *sc)
MCLGET(sd->sd_mbuf, M_DONTWAIT);
if ((sd->sd_mbuf->m_flags & M_EXT) == 0)
goto err_mbuf;
- /* reserve some space for a possible VLAN header */
- sd->sd_mbuf->m_data += 8;
- sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES - 8;
sd->sd_mbuf->m_pkthdr.rcvif = ifp;
+ sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES;
if (bus_dmamap_create(sc->sc_dmat, TXP_MAX_PKTLEN, 1,
TXP_MAX_PKTLEN, 0, BUS_DMA_NOWAIT, &sd->sd_map))
goto err_mbuf;
@@ -1059,9 +1044,7 @@ txp_alloc_rings(struct txp_softc *sc)
if ((sd->sd_mbuf->m_flags & M_EXT) == 0) {
goto bail_rxbufring;
}
- /* reserve some space for a possible VLAN header */
- sd->sd_mbuf->m_data += 8;
- sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES - 8;
+ sd->sd_mbuf->m_pkthdr.len = sd->sd_mbuf->m_len = MCLBYTES;
sd->sd_mbuf->m_pkthdr.rcvif = ifp;
if (bus_dmamap_create(sc->sc_dmat, TXP_MAX_PKTLEN, 1,
TXP_MAX_PKTLEN, 0, BUS_DMA_NOWAIT, &sd->sd_map)) {
@@ -1971,6 +1954,7 @@ txp_capabilities(struct txp_softc *sc)
#if NVLAN > 0
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;
}
#endif