1 From cea78f97a74d9e5e3a8cb701e89c3e5c656f5c64 Mon Sep 17 00:00:00 2001
2 From: Jes Sorensen <Jes.Sorensen@redhat.com>
3 Date: Tue, 26 Jul 2016 14:01:14 -0400
4 Subject: [PATCH] rtl8xxxu: Implement rtl8xxxu_fill_txdesc_v3() for 8188eu
6 Getting closer but still no cigar.
8 Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
10 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 10 ++++
11 .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c | 1 +
12 .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 62 ++++++++++++++++++++++
13 3 files changed, 73 insertions(+)
15 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
16 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
17 @@ -509,6 +509,8 @@ struct rtl8xxxu_txdesc40 {
18 #define TXDESC_AMPDU_DENSITY_SHIFT 20
19 #define TXDESC40_BT_INT BIT(23)
20 #define TXDESC40_GID_SHIFT 24
21 +#define TXDESC_ANTENNA_SELECT_A BIT(24)
22 +#define TXDESC_ANTENNA_SELECT_B BIT(25)
25 #define TXDESC40_USE_DRIVER_RATE BIT(8)
26 @@ -553,6 +555,10 @@ struct rtl8xxxu_txdesc40 {
29 #define TXDESC_MAX_AGG_SHIFT 11
30 +#define TXDESC_USB_TX_AGG_SHIT 24
33 +#define TXDESC_ANTENNA_SELECT_C BIT(29)
36 #define TXDESC40_HW_SEQ_ENABLE BIT(15)
37 @@ -1484,6 +1490,10 @@ void rtl8xxxu_fill_txdesc_v2(struct ieee
38 struct rtl8xxxu_txdesc32 *tx_desc32, u32 rate,
39 u16 rate_flag, bool sgi, bool short_preamble,
41 +void rtl8xxxu_fill_txdesc_v3(struct ieee80211_hdr *hdr,
42 + struct rtl8xxxu_txdesc32 *tx_desc32, u32 rate,
43 + u16 rate_flag, bool sgi, bool short_preamble,
46 extern struct rtl8xxxu_fileops rtl8188eu_fops;
47 extern struct rtl8xxxu_fileops rtl8192cu_fops;
48 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
49 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
50 @@ -1101,6 +1101,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops =
51 .set_tx_power = rtl8188e_set_tx_power,
52 .update_rate_mask = rtl8xxxu_gen2_update_rate_mask,
53 .report_connect = rtl8xxxu_gen2_report_connect,
54 + .fill_txdesc = rtl8xxxu_fill_txdesc_v3,
55 .writeN_block_size = 128,
56 .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
57 .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
58 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
59 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
60 @@ -4884,6 +4884,68 @@ rtl8xxxu_fill_txdesc_v2(struct ieee80211
65 + * Fill in v3 (gen1) specific TX descriptor bits.
66 + * This format is a hybrid between the v1 and v2 formats, only seen
67 + * on 8188eu devices so far.
70 +rtl8xxxu_fill_txdesc_v3(struct ieee80211_hdr *hdr,
71 + struct rtl8xxxu_txdesc32 *tx_desc, u32 rate,
72 + u16 rate_flag, bool sgi, bool short_preamble,
77 + seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
79 + tx_desc->txdw5 = cpu_to_le32(rate);
82 + * Data/RTS rate FB limit
84 + if (ieee80211_is_data(hdr->frame_control))
85 + tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);
87 + tx_desc->txdw3 = cpu_to_le32((u32)seq_number << TXDESC32_SEQ_SHIFT);
90 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_ENABLE);
92 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_BREAK);
94 + if (ieee80211_is_mgmt(hdr->frame_control)) {
95 + tx_desc->txdw5 = cpu_to_le32(rate);
96 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_USE_DRIVER_RATE);
97 + tx_desc->txdw5 |= cpu_to_le32(6 << TXDESC32_RETRY_LIMIT_SHIFT);
98 + tx_desc->txdw5 |= cpu_to_le32(TXDESC32_RETRY_LIMIT_ENABLE);
101 + if (ieee80211_is_data_qos(hdr->frame_control))
102 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_QOS);
104 + if (short_preamble)
105 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_SHORT_PREAMBLE);
108 + tx_desc->txdw5 |= cpu_to_le32(TXDESC32_SHORT_GI);
110 + if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
112 + * Use RTS rate 24M - does the mac80211 tell
115 + tx_desc->txdw4 |= cpu_to_le32(DESC_RATE_24M <<
116 + TXDESC32_RTS_RATE_SHIFT);
117 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_RTS_CTS_ENABLE);
118 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE);
121 + tx_desc->txdw2 |= cpu_to_le32(TXDESC_ANTENNA_SELECT_A |
122 + TXDESC_ANTENNA_SELECT_B);
123 + tx_desc->txdw7 |= cpu_to_le32(TXDESC_ANTENNA_SELECT_C);
126 static void rtl8xxxu_tx(struct ieee80211_hw *hw,
127 struct ieee80211_tx_control *control,