aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-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 0b8757aa59e8..8cf2b7cc9606 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);