kernel: add missing config symbols
[openwrt/staging/yousong.git] / package / kernel / mac80211 / patches / 652-0037-rtl8xxxu-Implement-rtl8xxxu_fill_txdesc_v3-for-8188e.patch
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
5
6 Getting closer but still no cigar.
7
8 Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
9 ---
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(+)
14
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)
23
24 /* Word 3 */
25 #define TXDESC40_USE_DRIVER_RATE BIT(8)
26 @@ -553,6 +555,10 @@ struct rtl8xxxu_txdesc40 {
27
28 /* Word 6 */
29 #define TXDESC_MAX_AGG_SHIFT 11
30 +#define TXDESC_USB_TX_AGG_SHIT 24
31 +
32 +/* Word 7 */
33 +#define TXDESC_ANTENNA_SELECT_C BIT(29)
34
35 /* Word 8 */
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,
40 bool ampdu_enable);
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,
44 + bool ampdu_enable);
45
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
61 }
62 }
63
64 +/*
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.
68 + */
69 +void
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,
73 + bool ampdu_enable)
74 +{
75 + u16 seq_number;
76 +
77 + seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
78 +
79 + tx_desc->txdw5 = cpu_to_le32(rate);
80 +
81 + /*
82 + * Data/RTS rate FB limit
83 + */
84 + if (ieee80211_is_data(hdr->frame_control))
85 + tx_desc->txdw5 |= cpu_to_le32(0x0001ff00);
86 +
87 + tx_desc->txdw3 = cpu_to_le32((u32)seq_number << TXDESC32_SEQ_SHIFT);
88 +
89 + if (ampdu_enable)
90 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_ENABLE);
91 + else
92 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_BREAK);
93 +
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);
99 + }
100 +
101 + if (ieee80211_is_data_qos(hdr->frame_control))
102 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_QOS);
103 +
104 + if (short_preamble)
105 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_SHORT_PREAMBLE);
106 +
107 + if (sgi)
108 + tx_desc->txdw5 |= cpu_to_le32(TXDESC32_SHORT_GI);
109 +
110 + if (rate_flag & IEEE80211_TX_RC_USE_RTS_CTS) {
111 + /*
112 + * Use RTS rate 24M - does the mac80211 tell
113 + * us which to use?
114 + */
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);
119 + }
120 +
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);
124 +}
125 +
126 static void rtl8xxxu_tx(struct ieee80211_hw *hw,
127 struct ieee80211_tx_control *control,
128 struct sk_buff *skb)