summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2008-03-23 05:06:16 +0000
committeryongari <yongari@FreeBSD.org>2008-03-23 05:06:16 +0000
commit00b0cf0b1a63138fc9dccb07d253d6f08bf63f35 (patch)
tree9592ec9f80e35aab287eac141410f0ce9336ec74
parentfd413d352f75c321c300654fb2b8d7a5762a9f7f (diff)
downloadFreeBSD-src-00b0cf0b1a63138fc9dccb07d253d6f08bf63f35.zip
FreeBSD-src-00b0cf0b1a63138fc9dccb07d253d6f08bf63f35.tar.gz
VLAN hardware tag information should be set for all desciptors of a
multi-descriptor transmission attempt. Datasheet said nothing about this requirements. This should fix a long-standing VLAN hardware tagging issues with re(4). Reported by: Giulio Ferro ( auryn AT zirakzigil DOT org ) Tested by: Giulio Ferro ( auryn AT zirakzigil DOT org )
-rw-r--r--sys/dev/re/if_re.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 0b8757a..8cf2b7c 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -2137,7 +2137,7 @@ re_encap(sc, m_head)
int nsegs, prod;
int i, error, ei, si;
int padlen;
- uint32_t cmdstat, csum_flags;
+ uint32_t cmdstat, csum_flags, vlanctl;
RL_LOCK_ASSERT(sc);
M_ASSERTPKTHDR((*m_head));
@@ -2247,10 +2247,21 @@ re_encap(sc, m_head)
csum_flags |= RL_TDESC_CMD_UDPCSUM;
}
+ /*
+ * Set up hardware VLAN tagging. Note: vlan tag info must
+ * appear in all descriptors of a multi-descriptor
+ * transmission attempt.
+ */
+ vlanctl = 0;
+ if ((*m_head)->m_flags & M_VLANTAG)
+ vlanctl =
+ htole32(htons((*m_head)->m_pkthdr.ether_vtag) |
+ RL_TDESC_VLANCTL_TAG);
+
si = prod;
for (i = 0; i < nsegs; i++, prod = RL_TX_DESC_NXT(sc, prod)) {
desc = &sc->rl_ldata.rl_tx_list[prod];
- desc->rl_vlanctl = 0;
+ desc->rl_vlanctl = vlanctl;
desc->rl_bufaddr_lo = htole32(RL_ADDR_LO(segs[i].ds_addr));
desc->rl_bufaddr_hi = htole32(RL_ADDR_HI(segs[i].ds_addr));
cmdstat = segs[i].ds_len;
@@ -2270,15 +2281,6 @@ re_encap(sc, m_head)
desc->rl_cmdstat |= htole32(RL_TDESC_CMD_EOF);
desc = &sc->rl_ldata.rl_tx_list[si];
- /*
- * Set up hardware VLAN tagging. Note: vlan tag info must
- * appear in the first descriptor of a multi-descriptor
- * transmission attempt.
- */
- if ((*m_head)->m_flags & M_VLANTAG)
- desc->rl_vlanctl =
- htole32(htons((*m_head)->m_pkthdr.ether_vtag) |
- RL_TDESC_VLANCTL_TAG);
/* Set SOF and transfer ownership of packet to the chip. */
desc->rl_cmdstat |= htole32(RL_TDESC_CMD_OWN | RL_TDESC_CMD_SOF);
OpenPOWER on IntegriCloud