diff options
author | yongari <yongari@FreeBSD.org> | 2008-03-23 05:06:16 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2008-03-23 05:06:16 +0000 |
commit | 00b0cf0b1a63138fc9dccb07d253d6f08bf63f35 (patch) | |
tree | 9592ec9f80e35aab287eac141410f0ce9336ec74 /sys/dev/re/if_re.c | |
parent | fd413d352f75c321c300654fb2b8d7a5762a9f7f (diff) | |
download | FreeBSD-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 )
Diffstat (limited to 'sys/dev/re/if_re.c')
-rw-r--r-- | sys/dev/re/if_re.c | 24 |
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); |