summaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch')
-rw-r--r--package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch165
1 files changed, 165 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch b/package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch
new file mode 100644
index 0000000000..e61ba5bc5a
--- /dev/null
+++ b/package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch
@@ -0,0 +1,165 @@
+From a635df8a41ace30d15cb6fa22a04ba5b4c364cff Mon Sep 17 00:00:00 2001
+From: Jes Sorensen <Jes.Sorensen@redhat.com>
+Date: Mon, 27 Jun 2016 12:32:00 -0400
+Subject: [PATCH] rtl8xxxu: Move skb delivery into parse_tx_desc() handler
+
+This is another prepatory patch to be able to handle aggregated RX
+packets.
+
+In order to avoid adding a prototype, this also moves the
+rtl8723bu_handle_c2h() function.
+
+Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+ .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 104 ++++++++++-----------
+ 1 file changed, 50 insertions(+), 54 deletions(-)
+
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+@@ -5045,6 +5045,51 @@ static void rtl8xxxu_rx_urb_work(struct
+ }
+ }
+
++static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
++ struct sk_buff *skb)
++{
++ struct rtl8723bu_c2h *c2h = (struct rtl8723bu_c2h *)skb->data;
++ struct device *dev = &priv->udev->dev;
++ int len;
++
++ len = skb->len - 2;
++
++ dev_dbg(dev, "C2H ID %02x seq %02x, len %02x source %02x\n",
++ c2h->id, c2h->seq, len, c2h->bt_info.response_source);
++
++ switch(c2h->id) {
++ case C2H_8723B_BT_INFO:
++ if (c2h->bt_info.response_source >
++ BT_INFO_SRC_8723B_BT_ACTIVE_SEND)
++ dev_dbg(dev, "C2H_BT_INFO WiFi only firmware\n");
++ else
++ dev_dbg(dev, "C2H_BT_INFO BT/WiFi coexist firmware\n");
++
++ if (c2h->bt_info.bt_has_reset)
++ dev_dbg(dev, "BT has been reset\n");
++ if (c2h->bt_info.tx_rx_mask)
++ dev_dbg(dev, "BT TRx mask\n");
++
++ break;
++ case C2H_8723B_BT_MP_INFO:
++ dev_dbg(dev, "C2H_MP_INFO ext ID %02x, status %02x\n",
++ c2h->bt_mp_info.ext_id, c2h->bt_mp_info.status);
++ break;
++ case C2H_8723B_RA_REPORT:
++ dev_dbg(dev,
++ "C2H RA RPT: rate %02x, unk %i, macid %02x, noise %i\n",
++ c2h->ra_report.rate, c2h->ra_report.dummy0_0,
++ c2h->ra_report.macid, c2h->ra_report.noisy_state);
++ break;
++ default:
++ dev_info(dev, "Unhandled C2H event %02x seq %02x\n",
++ c2h->id, c2h->seq);
++ print_hex_dump(KERN_INFO, "C2H content: ", DUMP_PREFIX_NONE,
++ 16, 1, c2h->raw.payload, len, false);
++ break;
++ }
++}
++
+ int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb,
+ struct ieee80211_rx_status *rx_status)
+ {
+@@ -5094,6 +5139,7 @@ int rtl8xxxu_parse_rxdesc16(struct rtl8x
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
+
++ ieee80211_rx_irqsafe(hw, skb);
+ return RX_TYPE_DATA_PKT;
+ }
+
+@@ -5125,6 +5171,8 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8x
+ if (rx_desc->rpt_sel) {
+ struct device *dev = &priv->udev->dev;
+ dev_dbg(dev, "%s: C2H packet\n", __func__);
++ rtl8723bu_handle_c2h(priv, skb);
++ dev_kfree_skb(skb);
+ return RX_TYPE_C2H;
+ }
+
+@@ -5152,54 +5200,10 @@ int rtl8xxxu_parse_rxdesc24(struct rtl8x
+ rx_status->freq = hw->conf.chandef.chan->center_freq;
+ rx_status->band = hw->conf.chandef.chan->band;
+
++ ieee80211_rx_irqsafe(hw, skb);
+ return RX_TYPE_DATA_PKT;
+ }
+
+-static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv,
+- struct sk_buff *skb)
+-{
+- struct rtl8723bu_c2h *c2h = (struct rtl8723bu_c2h *)skb->data;
+- struct device *dev = &priv->udev->dev;
+- int len;
+-
+- len = skb->len - 2;
+-
+- dev_dbg(dev, "C2H ID %02x seq %02x, len %02x source %02x\n",
+- c2h->id, c2h->seq, len, c2h->bt_info.response_source);
+-
+- switch(c2h->id) {
+- case C2H_8723B_BT_INFO:
+- if (c2h->bt_info.response_source >
+- BT_INFO_SRC_8723B_BT_ACTIVE_SEND)
+- dev_dbg(dev, "C2H_BT_INFO WiFi only firmware\n");
+- else
+- dev_dbg(dev, "C2H_BT_INFO BT/WiFi coexist firmware\n");
+-
+- if (c2h->bt_info.bt_has_reset)
+- dev_dbg(dev, "BT has been reset\n");
+- if (c2h->bt_info.tx_rx_mask)
+- dev_dbg(dev, "BT TRx mask\n");
+-
+- break;
+- case C2H_8723B_BT_MP_INFO:
+- dev_dbg(dev, "C2H_MP_INFO ext ID %02x, status %02x\n",
+- c2h->bt_mp_info.ext_id, c2h->bt_mp_info.status);
+- break;
+- case C2H_8723B_RA_REPORT:
+- dev_dbg(dev,
+- "C2H RA RPT: rate %02x, unk %i, macid %02x, noise %i\n",
+- c2h->ra_report.rate, c2h->ra_report.dummy0_0,
+- c2h->ra_report.macid, c2h->ra_report.noisy_state);
+- break;
+- default:
+- dev_info(dev, "Unhandled C2H event %02x seq %02x\n",
+- c2h->id, c2h->seq);
+- print_hex_dump(KERN_INFO, "C2H content: ", DUMP_PREFIX_NONE,
+- 16, 1, c2h->raw.payload, len, false);
+- break;
+- }
+-}
+-
+ static void rtl8xxxu_rx_complete(struct urb *urb)
+ {
+ struct rtl8xxxu_rx_urb *rx_urb =
+@@ -5209,19 +5213,11 @@ static void rtl8xxxu_rx_complete(struct
+ struct sk_buff *skb = (struct sk_buff *)urb->context;
+ struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
+ struct device *dev = &priv->udev->dev;
+- int rx_type;
+
+ skb_put(skb, urb->actual_length);
+
+ if (urb->status == 0) {
+- rx_type = priv->fops->parse_rx_desc(priv, skb, rx_status);
+-
+- if (rx_type == RX_TYPE_DATA_PKT)
+- ieee80211_rx_irqsafe(hw, skb);
+- else {
+- rtl8723bu_handle_c2h(priv, skb);
+- dev_kfree_skb(skb);
+- }
++ priv->fops->parse_rx_desc(priv, skb, rx_status);
+
+ skb = NULL;
+ rx_urb->urb.context = NULL;