From c795794eef8737f6272b2acce9025807af52da81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 29 Sep 2016 09:48:09 +0200 Subject: mac80211: use upstream patches for rtl8xxxu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also improves rtl8188eu support. Signed-off-by: Álvaro Fernández Rojas --- ...ve-skb-delivery-into-parse_tx_desc-handle.patch | 165 +++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch (limited to 'package/kernel/mac80211/patches/652-0002-rtl8xxxu-Move-skb-delivery-into-parse_tx_desc-handle.patch') 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 +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 +Signed-off-by: Kalle Valo +--- + .../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; -- cgit v1.2.3