Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -257,19 +257,25 @@ static int rtl8180_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
	mapping = pci_map_single(priv->pdev, skb->data,
				 skb->len, PCI_DMA_TODEVICE);

	BUG_ON(!control->tx_rate);

	tx_flags = RTL8180_TX_DESC_FLAG_OWN | RTL8180_TX_DESC_FLAG_FS |
		   RTL8180_TX_DESC_FLAG_LS |
		   (control->tx_rate->hw_value << 24) |
		   (control->rts_cts_rate->hw_value << 19) | skb->len;
		   (control->tx_rate->hw_value << 24) | skb->len;

	if (priv->r8185)
		tx_flags |= RTL8180_TX_DESC_FLAG_DMA |
			    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;
	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 |= control->rts_cts_rate->hw_value << 19;
	}

	*((struct ieee80211_tx_control **) skb->cb) =
		kmemdup(control, sizeof(*control), GFP_ATOMIC);
+9 −3
Original line number Diff line number Diff line
@@ -178,17 +178,23 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,

	flags = skb->len;
	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;
	if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data))
		flags |= RTL8187_TX_FLAG_MORE_FRAG;
	if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) {
		BUG_ON(!control->rts_cts_rate);
		flags |= RTL8187_TX_FLAG_RTS;
		flags |= control->rts_cts_rate->hw_value << 19;
		rts_dur = ieee80211_rts_duration(dev, priv->vif,
						 skb->len, control);
	}
	if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)
	} else if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) {
		BUG_ON(!control->rts_cts_rate);
		flags |= RTL8187_TX_FLAG_CTS;
		flags |= control->rts_cts_rate->hw_value << 19;
	}

	hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr));
	hdr->flags = cpu_to_le32(flags);