rtl8xxxu: add support for rtl8188eu
[openwrt/staging/rmilecki.git] / package / kernel / mac80211 / patches / 650-0007-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch
1 From 83bb21c65c73a5250504e6056e29683339fb15d2 Mon Sep 17 00:00:00 2001
2 From: Jes Sorensen <Jes.Sorensen@redhat.com>
3 Date: Mon, 16 May 2016 22:03:04 -0400
4 Subject: [PATCH] rtl8xxxu: Move skb delivery into parse_tx_desc() handler
5
6 This is another prepatory patch to be able to handle aggregated RX
7 packets.
8
9 In order to avoid adding a prototype, this also moves the
10 rtl8723bu_handle_c2h() function.
11
12 Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
13 ---
14 .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 104 ++++++++++-----------
15 1 file changed, 50 insertions(+), 54 deletions(-)
16
17 --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
18 +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
19 @@ -5045,6 +5045,51 @@ static void rtl8xxxu_rx_urb_work(struct
20 }
21 }
22
23 +static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
24 + struct sk_buff *skb)
25 +{
26 + struct rtl8723bu_c2h *c2h = (struct rtl8723bu_c2h *)skb->data;
27 + struct device *dev = &priv->udev->dev;
28 + int len;
29 +
30 + len = skb->len - 2;
31 +
32 + dev_dbg(dev, "C2H ID %02x seq %02x, len %02x source %02x\n",
33 + c2h->id, c2h->seq, len, c2h->bt_info.response_source);
34 +
35 + switch(c2h->id) {
36 + case C2H_8723B_BT_INFO:
37 + if (c2h->bt_info.response_source >
38 + BT_INFO_SRC_8723B_BT_ACTIVE_SEND)
39 + dev_dbg(dev, "C2H_BT_INFO WiFi only firmware\n");
40 + else
41 + dev_dbg(dev, "C2H_BT_INFO BT/WiFi coexist firmware\n");
42 +
43 + if (c2h->bt_info.bt_has_reset)
44 + dev_dbg(dev, "BT has been reset\n");
45 + if (c2h->bt_info.tx_rx_mask)
46 + dev_dbg(dev, "BT TRx mask\n");
47 +
48 + break;
49 + case C2H_8723B_BT_MP_INFO:
50 + dev_dbg(dev, "C2H_MP_INFO ext ID %02x, status %02x\n",
51 + c2h->bt_mp_info.ext_id, c2h->bt_mp_info.status);
52 + break;
53 + case C2H_8723B_RA_REPORT:
54 + dev_dbg(dev,
55 + "C2H RA RPT: rate %02x, unk %i, macid %02x, noise %i\n",
56 + c2h->ra_report.rate, c2h->ra_report.dummy0_0,
57 + c2h->ra_report.macid, c2h->ra_report.noisy_state);
58 + break;
59 + default:
60 + dev_info(dev, "Unhandled C2H event %02x seq %02x\n",
61 + c2h->id, c2h->seq);
62 + print_hex_dump(KERN_INFO, "C2H content: ", DUMP_PREFIX_NONE,
63 + 16, 1, c2h->raw.payload, len, false);
64 + break;
65 + }
66 +}
67 +
68 int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb,
69 struct ieee80211_rx_status *rx_status)
70 {
71 @@ -5094,6 +5139,7 @@ int rtl8xxxu_parse_rxdesc16(struct rtl8x
72 rx_status->freq = hw->conf.chandef.chan->center_freq;
73 rx_status->band = hw->conf.chandef.chan->band;
74
75 + ieee80211_rx_irqsafe(hw, skb);
76 return RX_TYPE_DATA_PKT;
77 }
78
79 @@ -5125,6 +5171,8 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8x
80 if (rx_desc->rpt_sel) {
81 struct device *dev = &priv->udev->dev;
82 dev_dbg(dev, "%s: C2H packet\n", __func__);
83 + rtl8723bu_handle_c2h(priv, skb);
84 + dev_kfree_skb(skb);
85 return RX_TYPE_C2H;
86 }
87
88 @@ -5152,54 +5200,10 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8x
89 rx_status->freq = hw->conf.chandef.chan->center_freq;
90 rx_status->band = hw->conf.chandef.chan->band;
91
92 + ieee80211_rx_irqsafe(hw, skb);
93 return RX_TYPE_DATA_PKT;
94 }
95
96 -static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
97 - struct sk_buff *skb)
98 -{
99 - struct rtl8723bu_c2h *c2h = (struct rtl8723bu_c2h *)skb->data;
100 - struct device *dev = &priv->udev->dev;
101 - int len;
102 -
103 - len = skb->len - 2;
104 -
105 - dev_dbg(dev, "C2H ID %02x seq %02x, len %02x source %02x\n",
106 - c2h->id, c2h->seq, len, c2h->bt_info.response_source);
107 -
108 - switch(c2h->id) {
109 - case C2H_8723B_BT_INFO:
110 - if (c2h->bt_info.response_source >
111 - BT_INFO_SRC_8723B_BT_ACTIVE_SEND)
112 - dev_dbg(dev, "C2H_BT_INFO WiFi only firmware\n");
113 - else
114 - dev_dbg(dev, "C2H_BT_INFO BT/WiFi coexist firmware\n");
115 -
116 - if (c2h->bt_info.bt_has_reset)
117 - dev_dbg(dev, "BT has been reset\n");
118 - if (c2h->bt_info.tx_rx_mask)
119 - dev_dbg(dev, "BT TRx mask\n");
120 -
121 - break;
122 - case C2H_8723B_BT_MP_INFO:
123 - dev_dbg(dev, "C2H_MP_INFO ext ID %02x, status %02x\n",
124 - c2h->bt_mp_info.ext_id, c2h->bt_mp_info.status);
125 - break;
126 - case C2H_8723B_RA_REPORT:
127 - dev_dbg(dev,
128 - "C2H RA RPT: rate %02x, unk %i, macid %02x, noise %i\n",
129 - c2h->ra_report.rate, c2h->ra_report.dummy0_0,
130 - c2h->ra_report.macid, c2h->ra_report.noisy_state);
131 - break;
132 - default:
133 - dev_info(dev, "Unhandled C2H event %02x seq %02x\n",
134 - c2h->id, c2h->seq);
135 - print_hex_dump(KERN_INFO, "C2H content: ", DUMP_PREFIX_NONE,
136 - 16, 1, c2h->raw.payload, len, false);
137 - break;
138 - }
139 -}
140 -
141 static void rtl8xxxu_rx_complete(struct urb *urb)
142 {
143 struct rtl8xxxu_rx_urb *rx_urb =
144 @@ -5209,19 +5213,11 @@ static void rtl8xxxu_rx_complete(struct
145 struct sk_buff *skb = (struct sk_buff *)urb->context;
146 struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
147 struct device *dev = &priv->udev->dev;
148 - int rx_type;
149
150 skb_put(skb, urb->actual_length);
151
152 if (urb->status == 0) {
153 - rx_type = priv->fops->parse_rx_desc(priv, skb, rx_status);
154 -
155 - if (rx_type == RX_TYPE_DATA_PKT)
156 - ieee80211_rx_irqsafe(hw, skb);
157 - else {
158 - rtl8723bu_handle_c2h(priv, skb);
159 - dev_kfree_skb(skb);
160 - }
161 + priv->fops->parse_rx_desc(priv, skb, rx_status);
162
163 skb = NULL;
164 rx_urb->urb.context = NULL;