Commit aa68cbfb authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

rtl818x: fix RTS/CTS-less transmit

This fixes packet transmission of packets without RTS/CTS.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 9d9bf77d
...@@ -257,19 +257,25 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -257,19 +257,25 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
mapping = pci_map_single(priv->pdev, skb->data, mapping = pci_map_single(priv->pdev, skb->data,
skb->len, PCI_DMA_TODEVICE); skb->len, PCI_DMA_TODEVICE);
BUG_ON(!control->tx_rate);
tx_flags = RTL8180_TX_DESC_FLAG_OWN | RTL8180_TX_DESC_FLAG_FS | tx_flags = RTL8180_TX_DESC_FLAG_OWN | RTL8180_TX_DESC_FLAG_FS |
RTL8180_TX_DESC_FLAG_LS | RTL8180_TX_DESC_FLAG_LS |
(control->tx_rate->hw_value << 24) | (control->tx_rate->hw_value << 24) | skb->len;
(control->rts_cts_rate->hw_value << 19) | skb->len;
if (priv->r8185) if (priv->r8185)
tx_flags |= RTL8180_TX_DESC_FLAG_DMA | tx_flags |= RTL8180_TX_DESC_FLAG_DMA |
RTL8180_TX_DESC_FLAG_NO_ENC; RTL8180_TX_DESC_FLAG_NO_ENC;
if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) {
BUG_ON(!control->rts_cts_rate);
tx_flags |= RTL8180_TX_DESC_FLAG_RTS; tx_flags |= RTL8180_TX_DESC_FLAG_RTS;
else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) tx_flags |= control->rts_cts_rate->hw_value << 19;
} else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) {
BUG_ON(!control->rts_cts_rate);
tx_flags |= RTL8180_TX_DESC_FLAG_CTS; tx_flags |= RTL8180_TX_DESC_FLAG_CTS;
tx_flags |= control->rts_cts_rate->hw_value << 19;
}
*((struct ieee80211_tx_control **) skb->cb) = *((struct ieee80211_tx_control **) skb->cb) =
kmemdup(control, sizeof(*control), GFP_ATOMIC); kmemdup(control, sizeof(*control), GFP_ATOMIC);
......
...@@ -178,17 +178,23 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -178,17 +178,23 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
flags = skb->len; flags = skb->len;
flags |= RTL8187_TX_FLAG_NO_ENCRYPT; flags |= RTL8187_TX_FLAG_NO_ENCRYPT;
flags |= control->rts_cts_rate->hw_value << 19;
BUG_ON(!control->tx_rate);
flags |= control->tx_rate->hw_value << 24; flags |= control->tx_rate->hw_value << 24;
if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data)) if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data))
flags |= RTL8187_TX_FLAG_MORE_FRAG; flags |= RTL8187_TX_FLAG_MORE_FRAG;
if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) {
BUG_ON(!control->rts_cts_rate);
flags |= RTL8187_TX_FLAG_RTS; flags |= RTL8187_TX_FLAG_RTS;
flags |= control->rts_cts_rate->hw_value << 19;
rts_dur = ieee80211_rts_duration(dev, priv->vif, rts_dur = ieee80211_rts_duration(dev, priv->vif,
skb->len, control); skb->len, control);
} } else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) {
if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) BUG_ON(!control->rts_cts_rate);
flags |= RTL8187_TX_FLAG_CTS; flags |= RTL8187_TX_FLAG_CTS;
flags |= control->rts_cts_rate->hw_value << 19;
}
hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr));
hdr->flags = cpu_to_le32(flags); hdr->flags = cpu_to_le32(flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment