All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/14] rtlwifi: remove duplicate C2H handlers
@ 2018-05-18  9:29 pkshih
  2018-05-18  9:29 ` [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report pkshih
                   ` (13 more replies)
  0 siblings, 14 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

The goal of patch 1/14 and 2/14 is to use keep-alive mechanism in mac80211
stack that needs accurate TX ack status for null frame reported by firmware
through C2H.
The remaining patches are step by step to remove duplicate C2H handlers
that widely distributed in IC specific files. An example of calling flow
before this patchset is:
	_rtl_pci_rx_interrupt() -> 
	rtlpriv->cfg->ops->rx_command_packet() =
		rtl8723be_rx_command_packet() -->
	rtl8723be_c2h_packet_handler() -->
		case 1: rtl_c2hcmd_enqueue()
		case 2: rtl8723be_c2h_content_parsing()

	if case 1:
	rtl_c2hcmd_launcher() ->
	rtlpriv->cfg->ops->c2h_content_parsing() =
		rtl8723be_c2h_content_parsing()

This patchset remove two ops:
	rtlpriv->cfg->ops->rx_command_packet()
	rtlpriv->cfg->ops->c2h_content_parsing()

But a special C2H is still existing, so add one op for RA report:
	rtlpriv->cfg->ops->c2h_ra_report_handler()

Finally, calling flow becomes:
	_rtl_pci_rx_interrupt() -->
	rtl_c2hcmd_enqueue() -->
		case 1: enqueue
		case 2: rtl_c2h_content_parsing() if fast_cmd
	
	if case 1:
	rtl_c2hcmd_launcher() ->
	rtl_c2h_content_parsing() ->
	hal_ops->c2h_ra_report_handler() =
		rtl8821ae_c2h_ra_report_handler() if C2H_RA_RPT


Ping-Ke Shih (13):
  rtlwifi: remove CONNECTION_MONITOR flag
  rtlwifi: remove duplicate rx_packet_type definition
  rtlwifi: rename register-based C2H command IDs to V0
  rtlwifi: remove duplicate C2H definition
  rtlwifi: remove unused fw C2H command ID
  rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and
    rtl8723ae
  rtlwifi: Add hal_op c2h_ra_report_handler for special process
  rtlwifi: remove duplicate C2H handler
  rtlwifi: remove hal_op rx_command_packet
  rtlwifi: remove hal_op c2h_content_parsing
  rtlwifi: use sk_buff to queue C2H commands
  rtlwifi: access skb->data to get C2H data by macro
  rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO

Tzu-En Huang (1):
  rtlwifi: support accurate nullfunc frame tx ack report

 drivers/net/wireless/realtek/rtlwifi/base.c        | 208 ++++++++++++++++-----
 drivers/net/wireless/realtek/rtlwifi/base.h        |   7 +-
 drivers/net/wireless/realtek/rtlwifi/pci.c         |  18 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/def.h   |  32 ----
 .../net/wireless/realtek/rtlwifi/rtl8188ee/sw.c    |   2 -
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.c   |   7 -
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.h   |   4 -
 .../net/wireless/realtek/rtlwifi/rtl8192ce/def.h   |  25 ---
 .../net/wireless/realtek/rtlwifi/rtl8192ee/def.h   |   8 -
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.c    |  78 +-------
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.h    |  16 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c    |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   |  29 +--
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.h   |   3 -
 .../net/wireless/realtek/rtlwifi/rtl8723ae/def.h   |  25 ---
 .../wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c   |   6 +-
 .../wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h   |  20 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/sw.c    |   1 -
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.c   |   7 -
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.h   |   3 -
 .../net/wireless/realtek/rtlwifi/rtl8723be/def.h   |   8 -
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.c    |  69 -------
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.h    |  13 --
 .../net/wireless/realtek/rtlwifi/rtl8723be/sw.c    |   2 -
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   |  30 +--
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.h   |   3 -
 .../net/wireless/realtek/rtlwifi/rtl8821ae/def.h   |  33 ----
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.c    |  69 +------
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.h    |  21 +--
 .../net/wireless/realtek/rtlwifi/rtl8821ae/sw.c    |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   |  31 +--
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.h   |   3 -
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |  56 +++++-
 33 files changed, 254 insertions(+), 589 deletions(-)

-- 
2.15.1

^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-29  7:18   ` [01/14] " Kalle Valo
  2018-05-18  9:29 ` [PATCH 02/14] rtlwifi: remove CONNECTION_MONITOR flag pkshih
                   ` (12 subsequent siblings)
  13 siblings, 1 reply; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Tzu-En Huang <tehuang@realtek.com>

In order to realize the keep-alive mechanism in mac80211 stack, reporting
accurate tx ack status for nullfunc frame is added in this commit.

If current frame is nullfunc frame, we ask firmware to report by filling
TX report bit in TX descriptor. After this frame DMA done, TX interrupt is
triggered but TX status is unknown at this moment, so enqueue this skb
into tx_report->queue. Finally, C2H report will be received if the frame
is transmitted successfully or retried over, and then we report to mac80211
with IEEE80211_TX_STAT_ACK flag only if it's successful. Otherwise, if
failure or timeout (one second), we report to mac80211 without this flag.

Signed-off-by: Tzu-En Huang <tehuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c        | 84 +++++++++++++++++++---
 drivers/net/wireless/realtek/rtlwifi/base.h        |  5 +-
 drivers/net/wireless/realtek/rtlwifi/pci.c         | 13 ++--
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   |  5 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   |  5 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   |  5 +-
 drivers/net/wireless/realtek/rtlwifi/wifi.h        | 16 +++++
 7 files changed, 112 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 762a29cdf7ad..6620c6842b91 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -574,6 +574,7 @@ int rtl_init_core(struct ieee80211_hw *hw)
 	INIT_LIST_HEAD(&rtlpriv->entry_list);
 	INIT_LIST_HEAD(&rtlpriv->c2hcmd_list);
 	INIT_LIST_HEAD(&rtlpriv->scan_list.list);
+	skb_queue_head_init(&rtlpriv->tx_report.queue);
 
 	rtlmac->link_state = MAC80211_NOLINK;
 
@@ -585,11 +586,14 @@ int rtl_init_core(struct ieee80211_hw *hw)
 EXPORT_SYMBOL_GPL(rtl_init_core);
 
 static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw);
+static void rtl_free_entries_from_ack_queue(struct ieee80211_hw *hw,
+					    bool timeout);
 
 void rtl_deinit_core(struct ieee80211_hw *hw)
 {
 	rtl_c2hcmd_launcher(hw, 0);
 	rtl_free_entries_from_scan_list(hw);
+	rtl_free_entries_from_ack_queue(hw, false);
 }
 EXPORT_SYMBOL_GPL(rtl_deinit_core);
 
@@ -1575,22 +1579,52 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
 }
 EXPORT_SYMBOL_GPL(rtl_is_special_data);
 
+void rtl_tx_ackqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
+
+	__skb_queue_tail(&tx_report->queue, skb);
+}
+EXPORT_SYMBOL_GPL(rtl_tx_ackqueue);
+
+static void rtl_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb,
+			  bool ack)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct ieee80211_tx_info *info;
+
+	info = IEEE80211_SKB_CB(skb);
+	ieee80211_tx_info_clear_status(info);
+	if (ack) {
+		RT_TRACE(rtlpriv, COMP_TX_REPORT, DBG_LOUD,
+			 "tx report: ack\n");
+		info->flags |= IEEE80211_TX_STAT_ACK;
+	} else {
+		RT_TRACE(rtlpriv, COMP_TX_REPORT, DBG_LOUD,
+			 "tx report: not ack\n");
+		info->flags &= ~IEEE80211_TX_STAT_ACK;
+	}
+	ieee80211_tx_status_irqsafe(hw, skb);
+}
+
 bool rtl_is_tx_report_skb(struct ieee80211_hw *hw, struct sk_buff *skb)
 {
 	u16 ether_type;
 	const u8 *ether_type_ptr;
+	__le16 fc = rtl_get_fc(skb);
 
 	ether_type_ptr = rtl_skb_ether_type_ptr(hw, skb, true);
 	ether_type = be16_to_cpup((__be16 *)ether_type_ptr);
 
-	/* EAPOL */
-	if (ether_type == ETH_P_PAE)
+	if (ether_type == ETH_P_PAE || ieee80211_is_nullfunc(fc))
 		return true;
 
 	return false;
 }
 
-static u16 rtl_get_tx_report_sn(struct ieee80211_hw *hw)
+static u16 rtl_get_tx_report_sn(struct ieee80211_hw *hw,
+				struct rtlwifi_tx_info *tx_info)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
@@ -1604,29 +1638,33 @@ static u16 rtl_get_tx_report_sn(struct ieee80211_hw *hw)
 
 	tx_report->last_sent_sn = sn;
 	tx_report->last_sent_time = jiffies;
-
+	tx_info->sn = sn;
+	tx_info->send_time = tx_report->last_sent_time;
 	RT_TRACE(rtlpriv, COMP_TX_REPORT, DBG_DMESG,
 		 "Send TX-Report sn=0x%X\n", sn);
 
 	return sn;
 }
 
-void rtl_get_tx_report(struct rtl_tcb_desc *ptcb_desc, u8 *pdesc,
-		       struct ieee80211_hw *hw)
+void rtl_set_tx_report(struct rtl_tcb_desc *ptcb_desc, u8 *pdesc,
+		       struct ieee80211_hw *hw, struct rtlwifi_tx_info *tx_info)
 {
 	if (ptcb_desc->use_spe_rpt) {
-		u16 sn = rtl_get_tx_report_sn(hw);
+		u16 sn = rtl_get_tx_report_sn(hw, tx_info);
 
 		SET_TX_DESC_SPE_RPT(pdesc, 1);
 		SET_TX_DESC_SW_DEFINE(pdesc, sn);
 	}
 }
-EXPORT_SYMBOL_GPL(rtl_get_tx_report);
+EXPORT_SYMBOL_GPL(rtl_set_tx_report);
 
 void rtl_tx_report_handler(struct ieee80211_hw *hw, u8 *tmp_buf, u8 c2h_cmd_len)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
+	struct rtlwifi_tx_info *tx_info;
+	struct sk_buff_head *queue = &tx_report->queue;
+	struct sk_buff *skb;
 	u16 sn;
 	u8 st, retry;
 
@@ -1642,6 +1680,14 @@ void rtl_tx_report_handler(struct ieee80211_hw *hw, u8 *tmp_buf, u8 c2h_cmd_len)
 
 	tx_report->last_recv_sn = sn;
 
+	skb_queue_walk(queue, skb) {
+		tx_info = rtl_tx_skb_cb_info(skb);
+		if (tx_info->sn == sn) {
+			skb_unlink(skb, queue);
+			rtl_tx_status(hw, skb, st == 0);
+			break;
+		}
+	}
 	RT_TRACE(rtlpriv, COMP_TX_REPORT, DBG_DMESG,
 		 "Recv TX-Report st=0x%02X sn=0x%X retry=0x%X\n",
 		 st, sn, retry);
@@ -1909,6 +1955,25 @@ static void rtl_free_entries_from_scan_list(struct ieee80211_hw *hw)
 	}
 }
 
+static void rtl_free_entries_from_ack_queue(struct ieee80211_hw *hw,
+					    bool chk_timeout)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_tx_report *tx_report = &rtlpriv->tx_report;
+	struct sk_buff_head *queue = &tx_report->queue;
+	struct sk_buff *skb, *tmp;
+	struct rtlwifi_tx_info *tx_info;
+
+	skb_queue_walk_safe(queue, skb, tmp) {
+		tx_info = rtl_tx_skb_cb_info(skb);
+		if (chk_timeout &&
+		    time_after(tx_info->send_time + HZ, jiffies))
+			continue;
+		skb_unlink(skb, queue);
+		rtl_tx_status(hw, skb, false);
+	}
+}
+
 void rtl_scan_list_expire(struct ieee80211_hw *hw)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -2173,6 +2238,9 @@ void rtl_watchdog_wq_callback(void *data)
 
 	/* <6> scan list */
 	rtl_scan_list_expire(hw);
+
+	/* <7> check ack queue */
+	rtl_free_entries_from_ack_queue(hw, true);
 }
 
 void rtl_watch_dog_timer_callback(struct timer_list *t)
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h b/drivers/net/wireless/realtek/rtlwifi/base.h
index acc924635818..19e7477839e4 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.h
+++ b/drivers/net/wireless/realtek/rtlwifi/base.h
@@ -130,9 +130,10 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
 u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
 		       bool is_enc);
 
+void rtl_tx_ackqueue(struct ieee80211_hw *hw, struct sk_buff *skb);
 bool rtl_is_tx_report_skb(struct ieee80211_hw *hw, struct sk_buff *skb);
-void rtl_get_tx_report(struct rtl_tcb_desc *ptcb_desc, u8 *pdesc,
-		       struct ieee80211_hw *hw);
+void rtl_set_tx_report(struct rtl_tcb_desc *ptcb_desc, u8 *pdesc,
+		       struct ieee80211_hw *hw, struct rtlwifi_tx_info *info);
 void rtl_tx_report_handler(struct ieee80211_hw *hw, u8 *tmp_buf,
 			   u8 c2h_cmd_len);
 bool rtl_check_tx_report_acked(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index 57bb8f049e59..d0c509ef790e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -619,12 +619,15 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
 			rtlpriv->link_info.tidtx_inperiod[tid]++;
 
 		info = IEEE80211_SKB_CB(skb);
-		ieee80211_tx_info_clear_status(info);
 
-		info->flags |= IEEE80211_TX_STAT_ACK;
-		/*info->status.rates[0].count = 1; */
-
-		ieee80211_tx_status_irqsafe(hw, skb);
+		if (likely(!ieee80211_is_nullfunc(fc))) {
+			ieee80211_tx_info_clear_status(info);
+			info->flags |= IEEE80211_TX_STAT_ACK;
+			/*info->status.rates[0].count = 1; */
+			ieee80211_tx_status_irqsafe(hw, skb);
+		} else {
+			rtl_tx_ackqueue(hw, skb);
+		}
 
 		if ((ring->entries - skb_queue_len(&ring->queue)) <= 4) {
 			RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
index 4f7444331b07..852a2701ef55 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
@@ -662,6 +662,7 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
+	struct rtlwifi_tx_info *tx_info = rtl_tx_skb_cb_info(skb);
 	u8 *pdesc = (u8 *)pdesc_tx;
 	u16 seq_number;
 	__le16 fc = hdr->frame_control;
@@ -723,8 +724,6 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
 			SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
 		}
 
-		/* tx report */
-		rtl_get_tx_report(ptcb_desc, pdesc, hw);
 
 		SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
 
@@ -827,6 +826,8 @@ void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
 				SET_TX_DESC_HTC(pdesc, 1);
 			}
 		}
+		/* tx report */
+		rtl_set_tx_report(ptcb_desc, pdesc, hw, tx_info);
 	}
 
 	SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
index fd9b38aa08a1..deb8f9501b51 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
@@ -431,6 +431,7 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
+	struct rtlwifi_tx_info *tx_info = rtl_tx_skb_cb_info(skb);
 	u8 *pdesc = (u8 *)pdesc_tx;
 	u16 seq_number;
 	__le16 fc = hdr->frame_control;
@@ -488,8 +489,6 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
 			SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
 		}
 
-		/* tx report */
-		rtl_get_tx_report(ptcb_desc, pdesc, hw);
 
 		/* ptcb_desc->use_driver_rate = true; */
 		SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
@@ -578,6 +577,8 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
 				SET_TX_DESC_HTC(pdesc, 1);
 			}
 		}
+		/* tx report */
+		rtl_set_tx_report(ptcb_desc, pdesc, hw, tx_info);
 	}
 
 	SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
index 1e1bacf562f3..63fb80039f82 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
@@ -691,6 +691,7 @@ void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
+	struct rtlwifi_tx_info *tx_info = rtl_tx_skb_cb_info(skb);
 	u8 *pdesc = (u8 *)pdesc_tx;
 	u16 seq_number;
 	__le16 fc = hdr->frame_control;
@@ -740,8 +741,6 @@ void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
 			SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
 		}
 
-		/* tx report */
-		rtl_get_tx_report(ptcb_desc, pdesc, hw);
 
 		/* ptcb_desc->use_driver_rate = true; */
 		SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
@@ -818,6 +817,8 @@ void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
 				SET_TX_DESC_HTC(pdesc, 1);
 			}
 		}
+		/* tx report */
+		rtl_set_tx_report(ptcb_desc, pdesc, hw, tx_info);
 	}
 
 	SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 208010fcde21..1259d2b66d17 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -1010,6 +1010,21 @@ enum dm_info_query {
 	DM_INFO_SIZE,
 };
 
+struct rtlwifi_tx_info {
+	int sn;
+	unsigned long send_time;
+};
+
+static inline struct rtlwifi_tx_info *rtl_tx_skb_cb_info(struct sk_buff *skb)
+{
+	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+
+	BUILD_BUG_ON(sizeof(struct rtlwifi_tx_info) >
+		     sizeof(info->status.status_driver_data));
+
+	return (struct rtlwifi_tx_info *)(info->status.status_driver_data);
+}
+
 struct octet_string {
 	u8 *octet;
 	u16 length;
@@ -1967,6 +1982,7 @@ struct rtl_tx_report {
 	u16 last_sent_sn;
 	unsigned long last_sent_time;
 	u16 last_recv_sn;
+	struct sk_buff_head queue;
 };
 
 struct rtl_ps_ctl {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 02/14] rtlwifi: remove CONNECTION_MONITOR flag
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
  2018-05-18  9:29 ` [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-18  9:29 ` [PATCH 03/14] rtlwifi: remove duplicate rx_packet_type definition pkshih
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

To use keep-alive mechanism in mac80211 stack, since driver supports
reporting accurate nullfunc frame tx ack now.

Signed-off-by: Tzu-En Huang <tehuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 6620c6842b91..759a802ccbee 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -396,7 +396,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
 	ieee80211_hw_set(hw, SIGNAL_DBM);
 	ieee80211_hw_set(hw, RX_INCLUDES_FCS);
 	ieee80211_hw_set(hw, AMPDU_AGGREGATION);
-	ieee80211_hw_set(hw, CONNECTION_MONITOR);
 	ieee80211_hw_set(hw, MFP_CAPABLE);
 	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
 	ieee80211_hw_set(hw, SUPPORTS_AMSDU_IN_AMPDU);
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 03/14] rtlwifi: remove duplicate rx_packet_type definition
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
  2018-05-18  9:29 ` [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report pkshih
  2018-05-18  9:29 ` [PATCH 02/14] rtlwifi: remove CONNECTION_MONITOR flag pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-18  9:29 ` [PATCH 04/14] rtlwifi: rename register-based C2H command IDs to V0 pkshih
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Move duplicate definitions from def.h of ic folder to wifi.h

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h | 7 -------
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h | 8 --------
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h | 8 --------
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h | 8 --------
 drivers/net/wireless/realtek/rtlwifi/wifi.h          | 8 ++++++++
 5 files changed, 8 insertions(+), 31 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
index 0532b9852444..32492d64d685 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
@@ -137,13 +137,6 @@ enum version_8188e {
 	VERSION_UNKNOWN = 0xFF,
 };
 
-enum rx_packet_type {
-	NORMAL_RX,
-	TX_REPORT1,
-	TX_REPORT2,
-	HIS_REPORT,
-};
-
 enum rtl819x_loopback_e {
 	RTL819X_NO_LOOPBACK = 0,
 	RTL819X_MAC_LOOPBACK = 1,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h
index 60f5728b4e2d..9f7e7bb8610b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/def.h
@@ -47,14 +47,6 @@ enum version_8192e {
 	VERSION_UNKNOWN = 0xFF,
 };
 
-enum rx_packet_type {
-	NORMAL_RX,
-	TX_REPORT1,
-	TX_REPORT2,
-	HIS_REPORT,
-	C2H_PACKET,
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h
index 025ea5c0f3f6..5e5403d69220 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/def.h
@@ -38,14 +38,6 @@
 /* Currently only for RTL8723B */
 #define EXT_VENDOR_ID				(BIT(18) | BIT(19))
 
-enum rx_packet_type {
-	NORMAL_RX,
-	TX_REPORT1,
-	TX_REPORT2,
-	HIS_REPORT,
-	C2H_PACKET,
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
index dfbdf539de1a..498f716bfc73 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
@@ -332,14 +332,6 @@ enum rtl_desc_qsel {
 	QSLT_CMD = 0x13,
 };
 
-enum rx_packet_type {
-	NORMAL_RX,
-	TX_REPORT1,
-	TX_REPORT2,
-	HIS_REPORT,
-	C2H_PACKET,
-};
-
 struct phy_sts_cck_8821ae_t {
 	u8 adc_pwdb_X[4];
 	u8 sq_rpt;
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 1259d2b66d17..81ac036760fc 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -1010,6 +1010,14 @@ enum dm_info_query {
 	DM_INFO_SIZE,
 };
 
+enum rx_packet_type {
+	NORMAL_RX,
+	TX_REPORT1,
+	TX_REPORT2,
+	HIS_REPORT,
+	C2H_PACKET,
+};
+
 struct rtlwifi_tx_info {
 	int sn;
 	unsigned long send_time;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 04/14] rtlwifi: rename register-based C2H command IDs to V0
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (2 preceding siblings ...)
  2018-05-18  9:29 ` [PATCH 03/14] rtlwifi: remove duplicate rx_packet_type definition pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-18  9:29 ` [PATCH 05/14] rtlwifi: remove duplicate C2H definition pkshih
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Current chips use packet-based C2H commands whose IDs differ from old
ones, so this commit simply gives C2H_V0_ as prefix of command IDs.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 .../net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c |  6 +++---
 .../net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h | 20 ++++++++++----------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c
index ec9bcf32f0ab..788de88ab1ee 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.c
@@ -1749,13 +1749,13 @@ void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw)
 
 
 	switch (c2h_event.cmd_id) {
-	case C2H_BT_RSSI:
+	case C2H_V0_BT_RSSI:
 			break;
 
-	case C2H_BT_OP_MODE:
+	case C2H_V0_BT_OP_MODE:
 			break;
 
-	case BT_INFO:
+	case C2H_V0_BT_INFO:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			"BT info Byte[0] (ID) is 0x%x\n",
 			c2h_event.cmd_id);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h
index 3723d7476717..756868897d8b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_btc.h
@@ -130,17 +130,17 @@ enum bt_state {
 	BT_INFO_STATE_MAX = 7
 };
 
-enum rtl8723e_c2h_evt {
-	C2H_DBG = 0,
-	C2H_TSF = 1,
-	C2H_AP_RPT_RSP = 2,
+enum rtl8723e_c2h_evt_v0 {
+	C2H_V0_DBG = 0,
+	C2H_V0_TSF = 1,
+	C2H_V0_AP_RPT_RSP = 2,
 	/* The FW notify the report of the specific tx packet. */
-	C2H_CCX_TX_RPT = 3,
-	C2H_BT_RSSI = 4,
-	C2H_BT_OP_MODE = 5,
-	C2H_HW_INFO_EXCH = 10,
-	C2H_C2H_H2C_TEST = 11,
-	BT_INFO = 12,
+	C2H_V0_CCX_TX_RPT = 3,
+	C2H_V0_BT_RSSI = 4,
+	C2H_V0_BT_OP_MODE = 5,
+	C2H_V0_HW_INFO_EXCH = 10,
+	C2H_V0_C2H_H2C_TEST = 11,
+	C2H_V0_BT_INFO = 12,
 	MAX_C2HEVENT
 };
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 05/14] rtlwifi: remove duplicate C2H definition
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (3 preceding siblings ...)
  2018-05-18  9:29 ` [PATCH 04/14] rtlwifi: rename register-based C2H command IDs to V0 pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-18  9:29 ` [PATCH 06/14] rtlwifi: remove unused fw C2H command ID pkshih
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Move C2H definition to wifi.h, because the definitions of 8192ee, 8723be
and 8821ae are the same.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c | 16 ++++++++--------
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h | 11 -----------
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c | 12 ++++++------
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h | 10 ----------
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c | 12 ++++++------
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h | 14 --------------
 drivers/net/wireless/realtek/rtlwifi/wifi.h         | 19 +++++++++++++++++++
 7 files changed, 39 insertions(+), 55 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
index f9563ae301ad..25d6c32f66c3 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
@@ -892,34 +892,34 @@ void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
 
 	switch (c2h_cmd_id) {
-	case C2H_8192E_DBG:
+	case C2H_DBG:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_DBG!!\n");
 		break;
-	case C2H_8192E_TXBF:
+	case C2H_TXBF:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8192E_TXBF!!\n");
 		break;
-	case C2H_8192E_TX_REPORT:
+	case C2H_TX_REPORT:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE ,
 			 "[C2H], C2H_8723BE_TX_REPORT!\n");
 		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
-	case C2H_8192E_BT_INFO:
+	case C2H_BT_INFO:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_BT_INFO!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
 			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
 						   c2h_cmd_len);
 		break;
-	case C2H_8192E_BT_MP:
+	case C2H_BT_MP:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_BT_MP!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
 			btc_ops->btc_btmpinfo_notify(rtlpriv, tmp_buf,
 						     c2h_cmd_len);
 		break;
-	case C2H_8192E_RA_RPT:
+	case C2H_RA_RPT:
 		_rtl92ee_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
 	default:
@@ -948,8 +948,8 @@ void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
 		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
 
 	switch (c2h_cmd_id) {
-	case C2H_8192E_BT_INFO:
-	case C2H_8192E_BT_MP:
+	case C2H_BT_INFO:
+	case C2H_BT_MP:
 		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
 		break;
 	default:
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
index b770f722daa6..8325adaa9663 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
@@ -128,17 +128,6 @@ enum rtl8192e_h2c_cmd {
 	MAX_92E_H2CCMD
 };
 
-enum rtl8192e_c2h_evt {
-	C2H_8192E_DBG = 0,
-	C2H_8192E_LB = 1,
-	C2H_8192E_TXBF = 2,
-	C2H_8192E_TX_REPORT = 3,
-	C2H_8192E_BT_INFO = 9,
-	C2H_8192E_BT_MP = 11,
-	C2H_8192E_RA_RPT = 12,
-	MAX_8192E_C2HEVENT
-};
-
 #define pagenum_128(_len)	\
 	(u32)(((_len) >> 7) + ((_len) & 0x7F ? 1 : 0))
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
index 4b963fd27d64..34703b9cf5e8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
@@ -712,23 +712,23 @@ void rtl8723be_c2h_content_parsing(struct ieee80211_hw *hw,
 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
 
 	switch (c2h_cmd_id) {
-	case C2H_8723B_DBG:
+	case C2H_DBG:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_DBG!!\n");
 		break;
-	case C2H_8723B_TX_REPORT:
+	case C2H_TX_REPORT:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_TX_REPORT!\n");
 		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
-	case C2H_8723B_BT_INFO:
+	case C2H_BT_INFO:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_BT_INFO!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
 			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
 						   c2h_cmd_len);
 		break;
-	case C2H_8723B_BT_MP:
+	case C2H_BT_MP:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8723BE_BT_MP!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
@@ -761,8 +761,8 @@ void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
 		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
 
 	switch (c2h_cmd_id) {
-	case C2H_8723B_BT_INFO:
-	case C2H_8723B_BT_MP:
+	case C2H_BT_INFO:
+	case C2H_BT_MP:
 		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
 		break;
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
index 2de4edb62bca..8f49941028f4 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
@@ -100,16 +100,6 @@ enum rtl8723b_h2c_cmd {
 	MAX_8723B_H2CCMD
 };
 
-enum rtl8723b_c2h_evt {
-	C2H_8723B_DBG = 0,
-	C2H_8723B_LB = 1,
-	C2H_8723B_TXBF = 2,
-	C2H_8723B_TX_REPORT = 3,
-	C2H_8723B_BT_INFO = 9,
-	C2H_8723B_BT_MP = 11,
-	MAX_8723B_C2HEVENT
-};
-
 #define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
 
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
index f2b2c549e5b2..5c7e58fbc07e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
@@ -1926,23 +1926,23 @@ void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
 
 	switch (c2h_cmd_id) {
-	case C2H_8812_DBG:
+	case C2H_DBG:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
 		break;
-	case C2H_8812_TX_REPORT:
+	case C2H_TX_REPORT:
 		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
-	case C2H_8812_RA_RPT:
+	case C2H_RA_RPT:
 		rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
-	case C2H_8812_BT_INFO:
+	case C2H_BT_INFO:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
 			 "[C2H], C2H_8812_BT_INFO!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
 			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
 						   c2h_cmd_len);
 		break;
-	case C2H_8812_BT_MP:
+	case C2H_BT_MP:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
 			 "[C2H], C2H_8812_BT_MP!!\n");
 		if (rtlpriv->cfg->ops->get_btc_status())
@@ -1974,7 +1974,7 @@ void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
 		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
 
 	switch (c2h_cmd_id) {
-	case C2H_8812_BT_INFO:
+	case C2H_BT_INFO:
 		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
 		break;
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
index 32d46d7128f5..48c72a26c7e8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
@@ -137,20 +137,6 @@
 #define	FW_PWR_STATE_ACTIVE	((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
 #define	FW_PWR_STATE_RF_OFF	0
 
-enum rtl8812_c2h_evt {
-	C2H_8812_DBG = 0,
-	C2H_8812_LB = 1,
-	C2H_8812_TXBF = 2,
-	C2H_8812_TX_REPORT = 3,
-	C2H_8812_BT_INFO = 9,
-	C2H_8812_BT_MP = 11,
-	C2H_8812_RA_RPT = 12,
-
-	C2H_8812_FW_SWCHNL = 0x10,
-	C2H_8812_IQK_FINISH = 0x11,
-	MAX_8812_C2HEVENT
-};
-
 enum rtl8821a_h2c_cmd {
 	H2C_8821AE_RSVDPAGE = 0,
 	H2C_8821AE_MSRRPT = 1,
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 81ac036760fc..3da8e2a6084a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -158,6 +158,25 @@ enum {
 	H2C_BT_PORT_ID = 0x71,
 };
 
+enum rtl_c2h_evt_v1 {
+	C2H_DBG = 0,
+	C2H_LB = 1,
+	C2H_TXBF = 2,
+	C2H_TX_REPORT = 3,
+	C2H_BT_INFO = 9,
+	C2H_BT_MP = 11,
+	C2H_RA_RPT = 12,
+
+	C2H_FW_SWCHNL = 0x10,
+	C2H_IQK_FINISH = 0x11,
+
+	C2H_EXT_V2 = 0xFF,
+};
+
+enum rtl_c2h_evt_v2 {
+	C2H_V2_CCX_RPT = 0x0F,
+};
+
 #define GET_TX_REPORT_SN_V1(c2h)	(c2h[6])
 #define GET_TX_REPORT_ST_V1(c2h)	(c2h[0] & 0xC0)
 #define GET_TX_REPORT_RETRY_V1(c2h)	(c2h[2] & 0x3F)
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 06/14] rtlwifi: remove unused fw C2H command ID
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (4 preceding siblings ...)
  2018-05-18  9:29 ` [PATCH 05/14] rtlwifi: remove duplicate C2H definition pkshih
@ 2018-05-18  9:29 ` pkshih
  2018-05-18  9:30 ` [PATCH 07/14] rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and rtl8723ae pkshih
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:29 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

The IDs are defined by driver and map to the fw C2H IDs, but they aren't
used now result in removal.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 .../net/wireless/realtek/rtlwifi/rtl8188ee/def.h   | 25 ----------------------
 .../net/wireless/realtek/rtlwifi/rtl8192ce/def.h   | 25 ----------------------
 .../net/wireless/realtek/rtlwifi/rtl8723ae/def.h   | 25 ----------------------
 .../net/wireless/realtek/rtlwifi/rtl8821ae/def.h   | 25 ----------------------
 4 files changed, 100 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
index 32492d64d685..45c866d3ca88 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/def.h
@@ -176,31 +176,6 @@ enum interface_select_pci {
 	INTF_SEL3_RSV = 3,
 };
 
-enum hal_fw_c2h_cmd_id {
-	HAL_FW_C2H_CMD_READ_MACREG = 0,
-	HAL_FW_C2H_CMD_READ_BBREG = 1,
-	HAL_FW_C2H_CMD_READ_RFREG = 2,
-	HAL_FW_C2H_CMD_READ_EEPROM = 3,
-	HAL_FW_C2H_CMD_READ_EFUSE = 4,
-	HAL_FW_C2H_CMD_READ_CAM = 5,
-	HAL_FW_C2H_CMD_GET_BASICRATE = 6,
-	HAL_FW_C2H_CMD_GET_DATARATE = 7,
-	HAL_FW_C2H_CMD_SURVEY = 8,
-	HAL_FW_C2H_CMD_SURVEYDONE = 9,
-	HAL_FW_C2H_CMD_JOINBSS = 10,
-	HAL_FW_C2H_CMD_ADDSTA = 11,
-	HAL_FW_C2H_CMD_DELSTA = 12,
-	HAL_FW_C2H_CMD_ATIMDONE = 13,
-	HAL_FW_C2H_CMD_TX_REPORT = 14,
-	HAL_FW_C2H_CMD_CCX_REPORT = 15,
-	HAL_FW_C2H_CMD_DTM_REPORT = 16,
-	HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
-	HAL_FW_C2H_CMD_C2HLBK = 18,
-	HAL_FW_C2H_CMD_C2HDBG = 19,
-	HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
-	HAL_FW_C2H_CMD_MAX
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/def.h
index b90aaf128072..d2005d7e9ad2 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/def.h
@@ -142,31 +142,6 @@ enum interface_select_pci {
 	INTF_SEL3_RSV = 3,
 };
 
-enum hal_fw_c2h_cmd_id {
-	HAL_FW_C2H_CMD_Read_MACREG = 0,
-	HAL_FW_C2H_CMD_Read_BBREG = 1,
-	HAL_FW_C2H_CMD_Read_RFREG = 2,
-	HAL_FW_C2H_CMD_Read_EEPROM = 3,
-	HAL_FW_C2H_CMD_Read_EFUSE = 4,
-	HAL_FW_C2H_CMD_Read_CAM = 5,
-	HAL_FW_C2H_CMD_Get_BasicRate = 6,
-	HAL_FW_C2H_CMD_Get_DataRate = 7,
-	HAL_FW_C2H_CMD_Survey = 8,
-	HAL_FW_C2H_CMD_SurveyDone = 9,
-	HAL_FW_C2H_CMD_JoinBss = 10,
-	HAL_FW_C2H_CMD_AddSTA = 11,
-	HAL_FW_C2H_CMD_DelSTA = 12,
-	HAL_FW_C2H_CMD_AtimDone = 13,
-	HAL_FW_C2H_CMD_TX_Report = 14,
-	HAL_FW_C2H_CMD_CCX_Report = 15,
-	HAL_FW_C2H_CMD_DTM_Report = 16,
-	HAL_FW_C2H_CMD_TX_Rate_Statistics = 17,
-	HAL_FW_C2H_CMD_C2HLBK = 18,
-	HAL_FW_C2H_CMD_C2HDBG = 19,
-	HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
-	HAL_FW_C2H_CMD_MAX
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/def.h
index bcdf2273688e..847544817549 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/def.h
@@ -152,31 +152,6 @@ enum interface_select_pci {
 	INTF_SEL3_RSV = 3,
 };
 
-enum hal_fw_c2h_cmd_id {
-	HAL_FW_C2H_CMD_Read_MACREG = 0,
-	HAL_FW_C2H_CMD_Read_BBREG = 1,
-	HAL_FW_C2H_CMD_Read_RFREG = 2,
-	HAL_FW_C2H_CMD_Read_EEPROM = 3,
-	HAL_FW_C2H_CMD_Read_EFUSE = 4,
-	HAL_FW_C2H_CMD_Read_CAM = 5,
-	HAL_FW_C2H_CMD_Get_BasicRate = 6,
-	HAL_FW_C2H_CMD_Get_DataRate = 7,
-	HAL_FW_C2H_CMD_Survey = 8,
-	HAL_FW_C2H_CMD_SurveyDone = 9,
-	HAL_FW_C2H_CMD_JoinBss = 10,
-	HAL_FW_C2H_CMD_AddSTA = 11,
-	HAL_FW_C2H_CMD_DelSTA = 12,
-	HAL_FW_C2H_CMD_AtimDone = 13,
-	HAL_FW_C2H_CMD_TX_Report = 14,
-	HAL_FW_C2H_CMD_CCX_Report = 15,
-	HAL_FW_C2H_CMD_DTM_Report = 16,
-	HAL_FW_C2H_CMD_TX_Rate_Statistics = 17,
-	HAL_FW_C2H_CMD_C2HLBK = 18,
-	HAL_FW_C2H_CMD_C2HDBG = 19,
-	HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
-	HAL_FW_C2H_CMD_MAX
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
index 498f716bfc73..3fe3aaa5fe3c 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/def.h
@@ -296,31 +296,6 @@ enum interface_select_pci {
 	INTF_SEL3_RSV = 3,
 };
 
-enum hal_fw_c2h_cmd_id {
-	HAL_FW_C2H_CMD_READ_MACREG = 0,
-	HAL_FW_C2H_CMD_READ_BBREG = 1,
-	HAL_FW_C2H_CMD_READ_RFREG = 2,
-	HAL_FW_C2H_CMD_READ_EEPROM = 3,
-	HAL_FW_C2H_CMD_READ_EFUSE = 4,
-	HAL_FW_C2H_CMD_READ_CAM = 5,
-	HAL_FW_C2H_CMD_GET_BASICRATE = 6,
-	HAL_FW_C2H_CMD_GET_DATARATE = 7,
-	HAL_FW_C2H_CMD_SURVEY = 8,
-	HAL_FW_C2H_CMD_SURVEYDONE = 9,
-	HAL_FW_C2H_CMD_JOINBSS = 10,
-	HAL_FW_C2H_CMD_ADDSTA = 11,
-	HAL_FW_C2H_CMD_DELSTA = 12,
-	HAL_FW_C2H_CMD_ATIMDONE = 13,
-	HAL_FW_C2H_CMD_TX_REPORT = 14,
-	HAL_FW_C2H_CMD_CCX_REPORT = 15,
-	HAL_FW_C2H_CMD_DTM_REPORT = 16,
-	HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
-	HAL_FW_C2H_CMD_C2HLBK = 18,
-	HAL_FW_C2H_CMD_C2HDBG = 19,
-	HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
-	HAL_FW_C2H_CMD_MAX
-};
-
 enum rtl_desc_qsel {
 	QSLT_BK = 0x2,
 	QSLT_BE = 0x0,
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 07/14] rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and rtl8723ae
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (5 preceding siblings ...)
  2018-05-18  9:29 ` [PATCH 06/14] rtlwifi: remove unused fw C2H command ID pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 08/14] rtlwifi: Add hal_op c2h_ra_report_handler for special process pkshih
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

The caller of hal_op rx_command_packet will assert function pointer
before calling, so we can remove dummy functions safely.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c  | 2 --
 drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c | 7 -------
 drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h | 4 ----
 drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c  | 1 -
 drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c | 7 -------
 drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h | 3 ---
 6 files changed, 24 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
index 82681b96ef93..8c15ffd3568b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/sw.c
@@ -263,8 +263,6 @@ static struct rtl_hal_ops rtl8188ee_hal_ops = {
 	.get_rfreg = rtl88e_phy_query_rf_reg,
 	.set_rfreg = rtl88e_phy_set_rf_reg,
 	.get_btc_status = rtl88e_get_btc_status,
-	.rx_command_packet = rtl88ee_rx_command_packet,
-
 };
 
 static struct rtl_mod_params rtl88ee_mod_params = {
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
index 9670732b2bc6..4c1f8b08fc10 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
@@ -850,10 +850,3 @@ void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
 			       BIT(0) << (hw_queue));
 	}
 }
-
-u32 rtl88ee_rx_command_packet(struct ieee80211_hw *hw,
-			      const struct rtl_stats *status,
-			      struct sk_buff *skb)
-{
-	return 0;
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
index f902d6769aa8..127ba977206f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
@@ -790,8 +790,4 @@ void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
 			     bool firstseg, bool lastseg,
 			     struct sk_buff *skb);
-u32 rtl88ee_rx_command_packet(struct ieee80211_hw *hw,
-			      const struct rtl_stats *status,
-			      struct sk_buff *skb);
-
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c
index a545ea317323..07b82700d1de 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/sw.c
@@ -260,7 +260,6 @@ static struct rtl_hal_ops rtl8723e_hal_ops = {
 	.bt_coex_off_before_lps =
 		rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps,
 	.get_btc_status = rtl8723e_get_btc_status,
-	.rx_command_packet = rtl8723e_rx_command_packet,
 	.is_fw_header = is_fw_header,
 };
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
index 23485602a9a1..d461d0c9631f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
@@ -709,10 +709,3 @@ void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
 			       BIT(0) << (hw_queue));
 	}
 }
-
-u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw,
-			       const struct rtl_stats *status,
-			       struct sk_buff *skb)
-{
-	return 0;
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
index 985ce0b77ea5..d592b08d4ac8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
@@ -716,7 +716,4 @@ void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl8723e_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
 			      bool firstseg, bool lastseg,
 			      struct sk_buff *skb);
-u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw,
-			       const struct rtl_stats *status,
-			       struct sk_buff *skb);
 #endif
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 08/14] rtlwifi: Add hal_op c2h_ra_report_handler for special process
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (6 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 07/14] rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and rtl8723ae pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 09/14] rtlwifi: remove duplicate C2H handler pkshih
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

We're going to merge C2H handler into one, but one special case is to
handle RA_REPORT that implements in individual IC folder. So this commit
adds a hal_op for caller in common code.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c | 7 ++++---
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h | 2 ++
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c | 1 +
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c | 5 +++--
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h | 2 ++
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c | 1 +
 drivers/net/wireless/realtek/rtlwifi/wifi.h         | 2 ++
 7 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
index 25d6c32f66c3..a2d9e217bc65 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
@@ -876,8 +876,8 @@ void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
 			     (u8 *)p2p_ps_offload);
 }
 
-static void _rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
-					   u8 *cmd_buf, u8 cmd_len)
+void rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
+				   u8 *cmd_buf, u8 cmd_len)
 {
 	u8 rate = cmd_buf[0] & 0x3F;
 	bool collision_state = cmd_buf[3] & BIT(0);
@@ -889,6 +889,7 @@ void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
 				 u8 c2h_cmd_len, u8 *tmp_buf)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
 
 	switch (c2h_cmd_id) {
@@ -920,7 +921,7 @@ void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
 						     c2h_cmd_len);
 		break;
 	case C2H_RA_RPT:
-		_rtl92ee_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
+		hal_ops->c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
 	default:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
index 8325adaa9663..e5fae0a86a27 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
@@ -182,4 +182,6 @@ void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
 void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
 void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
 				 u8 c2h_cmd_len, u8 *tmp_buf);
+void rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
+				   u8 *cmd_buf, u8 cmd_len);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
index ef92a789871d..c5c26b537cd2 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
@@ -252,6 +252,7 @@ static struct rtl_hal_ops rtl8192ee_hal_ops = {
 	.get_btc_status = rtl92ee_get_btc_status,
 	.rx_command_packet = rtl92ee_rx_command_packet,
 	.c2h_content_parsing = rtl92ee_c2h_content_parsing,
+	.c2h_ra_report_handler = rtl92ee_c2h_ra_report_handler,
 };
 
 static struct rtl_mod_params rtl92ee_mod_params = {
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
index 5c7e58fbc07e..bf37c428c682 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
@@ -1907,7 +1907,7 @@ void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
 			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
 }
 
-static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
+void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
 				     u8 *cmd_buf, u8 cmd_len)
 {
 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -1923,6 +1923,7 @@ void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
 				   u8 *tmp_buf)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
 
 	switch (c2h_cmd_id) {
@@ -1933,7 +1934,7 @@ void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
 		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
 	case C2H_RA_RPT:
-		rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
+		hal_ops->c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
 		break;
 	case C2H_BT_INFO:
 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
index 48c72a26c7e8..a69448be7c26 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
@@ -322,4 +322,6 @@ void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw,
 void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
 				   u8 c2h_cmd_id, u8 c2h_cmd_len,
 				   u8 *tmp_buf);
+void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
+				     u8 *cmd_buf, u8 cmd_len);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
index 9bb3d9dfce79..4b2cb6bda4f1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
@@ -305,6 +305,7 @@ static struct rtl_hal_ops rtl8821ae_hal_ops = {
 	.get_btc_status = rtl8821ae_get_btc_status,
 	.rx_command_packet = rtl8821ae_rx_command_packet,
 	.c2h_content_parsing = rtl8821ae_c2h_content_parsing,
+	.c2h_ra_report_handler = rtl8821ae_c2h_ra_report_handler,
 	.add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
 };
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 3da8e2a6084a..392b3e84db7e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2348,6 +2348,8 @@ struct rtl_hal_ops {
 	u16 (*get_available_desc)(struct ieee80211_hw *hw, u8 q_idx);
 	void (*c2h_content_parsing)(struct ieee80211_hw *hw, u8 tag, u8 len,
 				    u8 *val);
+	void (*c2h_ra_report_handler)(struct ieee80211_hw *hw,
+				      u8 *cmd_buf, u8 cmd_len);
 };
 
 struct rtl_intf_ops {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 09/14] rtlwifi: remove duplicate C2H handler
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (7 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 08/14] rtlwifi: Add hal_op c2h_ra_report_handler for special process pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 10/14] rtlwifi: remove hal_op rx_command_packet pkshih
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Merge duplicate C2H handler and implement the handler in base.c.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c        | 72 +++++++++++++++++++++
 drivers/net/wireless/realtek/rtlwifi/base.h        |  3 +
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.c    | 75 ----------------------
 .../net/wireless/realtek/rtlwifi/rtl8192ee/fw.h    |  3 -
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c    |  2 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   |  2 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.c    | 69 --------------------
 .../net/wireless/realtek/rtlwifi/rtl8723be/fw.h    |  3 -
 .../net/wireless/realtek/rtlwifi/rtl8723be/sw.c    |  2 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   |  3 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.c    | 68 --------------------
 .../net/wireless/realtek/rtlwifi/rtl8821ae/fw.h    |  5 --
 .../net/wireless/realtek/rtlwifi/rtl8821ae/sw.c    |  2 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   |  2 +-
 14 files changed, 81 insertions(+), 230 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 759a802ccbee..0d03e98f9cb4 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -2306,6 +2306,78 @@ void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val)
 }
 EXPORT_SYMBOL(rtl_c2hcmd_enqueue);
 
+void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 cmd_id,
+			     u8 cmd_len, u8 *cmd_buf)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
+	const struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
+
+	switch (cmd_id) {
+	case C2H_DBG:
+		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_DBG!!\n");
+		break;
+	case C2H_TXBF:
+		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
+			 "[C2H], C2H_TXBF!!\n");
+		break;
+	case C2H_TX_REPORT:
+		rtl_tx_report_handler(hw, cmd_buf, cmd_len);
+		break;
+	case C2H_RA_RPT:
+		if (hal_ops->c2h_ra_report_handler)
+			hal_ops->c2h_ra_report_handler(hw, cmd_buf, cmd_len);
+		break;
+	case C2H_BT_INFO:
+		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
+			 "[C2H], C2H_BT_INFO!!\n");
+		if (rtlpriv->cfg->ops->get_btc_status())
+			btc_ops->btc_btinfo_notify(rtlpriv, cmd_buf, cmd_len);
+		break;
+	case C2H_BT_MP:
+		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
+			 "[C2H], C2H_BT_MP!!\n");
+		if (rtlpriv->cfg->ops->get_btc_status())
+			btc_ops->btc_btmpinfo_notify(rtlpriv, cmd_buf, cmd_len);
+		break;
+	default:
+		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
+			 "[C2H], Unknown packet!! cmd_id(%#X)!\n", cmd_id);
+		break;
+	}
+}
+EXPORT_SYMBOL_GPL(rtl_c2h_content_parsing);
+
+void rtl_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
+{
+	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
+	u8 *tmp_buf = NULL;
+
+	c2h_cmd_id = buffer[0];
+	c2h_cmd_seq = buffer[1];
+	c2h_cmd_len = len - 2;
+	tmp_buf = buffer + 2;
+
+	RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
+		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
+		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
+
+	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
+		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
+
+	switch (c2h_cmd_id) {
+	case C2H_BT_INFO:
+	case C2H_BT_MP:
+		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
+		break;
+	default:
+		rtl_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
+		break;
+	}
+}
+EXPORT_SYMBOL_GPL(rtl_c2h_packet_handler);
+
 void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h b/drivers/net/wireless/realtek/rtlwifi/base.h
index 19e7477839e4..3bf174e5b07e 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.h
+++ b/drivers/net/wireless/realtek/rtlwifi/base.h
@@ -162,6 +162,9 @@ void rtl_fwevt_wq_callback(void *data);
 void rtl_c2hcmd_wq_callback(void *data);
 void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec);
 void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val);
+void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
+			     u8 c2h_cmd_len, u8 *tmp_buf);
+void rtl_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
 
 u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index,
 			    enum wireless_mode wirelessmode);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
index a2d9e217bc65..84a0d0eb72e1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.c
@@ -884,78 +884,3 @@ void rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
 
 	rtl92ee_dm_dynamic_arfb_select(hw, rate, collision_state);
 }
-
-void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
-				 u8 c2h_cmd_len, u8 *tmp_buf)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
-	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
-
-	switch (c2h_cmd_id) {
-	case C2H_DBG:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_DBG!!\n");
-		break;
-	case C2H_TXBF:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8192E_TXBF!!\n");
-		break;
-	case C2H_TX_REPORT:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE ,
-			 "[C2H], C2H_8723BE_TX_REPORT!\n");
-		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
-		break;
-	case C2H_BT_INFO:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_BT_INFO!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
-						   c2h_cmd_len);
-		break;
-	case C2H_BT_MP:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_BT_MP!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btmpinfo_notify(rtlpriv, tmp_buf,
-						     c2h_cmd_len);
-		break;
-	case C2H_RA_RPT:
-		hal_ops->c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
-		break;
-	default:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], Unknown packet!! CmdId(%#X)!\n", c2h_cmd_id);
-		break;
-	}
-}
-
-void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
-	u8 *tmp_buf = NULL;
-
-	c2h_cmd_id = buffer[0];
-	c2h_cmd_seq = buffer[1];
-	c2h_cmd_len = len - 2;
-	tmp_buf = buffer + 2;
-
-	RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
-		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
-
-	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
-		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
-
-	switch (c2h_cmd_id) {
-	case C2H_BT_INFO:
-	case C2H_BT_MP:
-		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
-		break;
-	default:
-		rtl92ee_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len,
-					    tmp_buf);
-		break;
-	}
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
index e5fae0a86a27..6a2fbf20d579 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/fw.h
@@ -179,9 +179,6 @@ void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
 void rtl92ee_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
 void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
 void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
-void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
-void rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
-				 u8 c2h_cmd_len, u8 *tmp_buf);
 void rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
 				   u8 *cmd_buf, u8 cmd_len);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
index c5c26b537cd2..fd028274c593 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
@@ -251,7 +251,7 @@ static struct rtl_hal_ops rtl8192ee_hal_ops = {
 	.fill_h2c_cmd = rtl92ee_fill_h2c_cmd,
 	.get_btc_status = rtl92ee_get_btc_status,
 	.rx_command_packet = rtl92ee_rx_command_packet,
-	.c2h_content_parsing = rtl92ee_c2h_content_parsing,
+	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl92ee_c2h_ra_report_handler,
 };
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
index 852a2701ef55..e525c2bb4457 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
@@ -1085,7 +1085,7 @@ u32 rtl92ee_rx_command_packet(struct ieee80211_hw *hw,
 		result = 0;
 		break;
 	case C2H_PACKET:
-		rtl92ee_c2h_packet_handler(hw, skb->data, (u8)skb->len);
+		rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
 		result = 1;
 		break;
 	default:
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
index 34703b9cf5e8..f2441fbb92f1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.c
@@ -703,72 +703,3 @@ void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
 	rtl8723be_fill_h2c_cmd(hw, H2C_8723B_P2P_PS_OFFLOAD, 1,
 			       (u8 *)p2p_ps_offload);
 }
-
-void rtl8723be_c2h_content_parsing(struct ieee80211_hw *hw,
-				   u8 c2h_cmd_id,
-				   u8 c2h_cmd_len, u8 *tmp_buf)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
-
-	switch (c2h_cmd_id) {
-	case C2H_DBG:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_DBG!!\n");
-		break;
-	case C2H_TX_REPORT:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_TX_REPORT!\n");
-		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
-		break;
-	case C2H_BT_INFO:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_BT_INFO!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
-						   c2h_cmd_len);
-		break;
-	case C2H_BT_MP:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8723BE_BT_MP!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btmpinfo_notify(rtlpriv, tmp_buf,
-						     c2h_cmd_len);
-		break;
-	default:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], Unknown packet!! CmdId(%#X)!\n", c2h_cmd_id);
-		break;
-	}
-}
-
-void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
-	u8 *tmp_buf = NULL;
-
-	c2h_cmd_id = buffer[0];
-	c2h_cmd_seq = buffer[1];
-	c2h_cmd_len = len - 2;
-	tmp_buf = buffer + 2;
-
-	RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
-		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
-
-	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
-		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
-
-	switch (c2h_cmd_id) {
-	case C2H_BT_INFO:
-	case C2H_BT_MP:
-		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
-		break;
-
-	default:
-		rtl8723be_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len,
-					      tmp_buf);
-		break;
-	}
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
index 8f49941028f4..948d28646364 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/fw.h
@@ -143,7 +143,4 @@ void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
 void rtl8723be_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
 void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
 void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
-void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
-void rtl8723be_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
-				   u8 c2h_cmd_len, u8 *tmp_buf);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
index 6a42988aad65..9df994965c4a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
@@ -263,7 +263,7 @@ static struct rtl_hal_ops rtl8723be_hal_ops = {
 	.get_btc_status = rtl8723be_get_btc_status,
 	.rx_command_packet = rtl8723be_rx_command_packet,
 	.is_fw_header = is_fw_header,
-	.c2h_content_parsing = rtl8723be_c2h_content_parsing,
+	.c2h_content_parsing = rtl_c2h_content_parsing,
 };
 
 static struct rtl_mod_params rtl8723be_mod_params = {
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
index deb8f9501b51..0c0cece9d5f9 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
@@ -774,8 +774,7 @@ u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
 			result = 0;
 			break;
 	case C2H_PACKET:
-			rtl8723be_c2h_packet_handler(hw, skb->data,
-						     (u8)skb->len);
+			rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
 			result = 1;
 			break;
 	default:
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
index bf37c428c682..d868a034659f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
@@ -1917,71 +1917,3 @@ void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
 
 	rtl8821ae_dm_update_init_rate(hw, rate);
 }
-
-void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
-				   u8 c2h_cmd_id, u8 c2h_cmd_len,
-				   u8 *tmp_buf)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
-	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
-
-	switch (c2h_cmd_id) {
-	case C2H_DBG:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
-		break;
-	case C2H_TX_REPORT:
-		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
-		break;
-	case C2H_RA_RPT:
-		hal_ops->c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
-		break;
-	case C2H_BT_INFO:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
-			 "[C2H], C2H_8812_BT_INFO!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
-						   c2h_cmd_len);
-		break;
-	case C2H_BT_MP:
-		RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-			 "[C2H], C2H_8812_BT_MP!!\n");
-		if (rtlpriv->cfg->ops->get_btc_status())
-			btc_ops->btc_btmpinfo_notify(rtlpriv, tmp_buf,
-						     c2h_cmd_len);
-		break;
-	default:
-		break;
-	}
-}
-
-void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
-				  u8 length)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
-	u8 *tmp_buf = NULL;
-
-	c2h_cmd_id = buffer[0];
-	c2h_cmd_seq = buffer[1];
-	c2h_cmd_len = length - 2;
-	tmp_buf = buffer + 2;
-
-	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
-		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
-		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
-
-	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
-		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
-
-	switch (c2h_cmd_id) {
-	case C2H_BT_INFO:
-		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
-		break;
-
-	default:
-		rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len,
-					      tmp_buf);
-		break;
-	}
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
index a69448be7c26..99c902ff0b84 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.h
@@ -317,11 +317,6 @@ void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw, bool func_en);
 void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
 						   bool enabled);
 void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw);
-void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw,
-				  u8 *buffer, u8 length);
-void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
-				   u8 c2h_cmd_id, u8 c2h_cmd_len,
-				   u8 *tmp_buf);
 void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
 				     u8 *cmd_buf, u8 cmd_len);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
index 4b2cb6bda4f1..bcabf4dc6353 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
@@ -304,7 +304,7 @@ static struct rtl_hal_ops rtl8821ae_hal_ops = {
 	.fill_h2c_cmd = rtl8821ae_fill_h2c_cmd,
 	.get_btc_status = rtl8821ae_get_btc_status,
 	.rx_command_packet = rtl8821ae_rx_command_packet,
-	.c2h_content_parsing = rtl8821ae_c2h_content_parsing,
+	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl8821ae_c2h_ra_report_handler,
 	.add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
 };
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
index 63fb80039f82..a93d8569c186 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
@@ -1018,7 +1018,7 @@ u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
 		result = 0;
 		break;
 	case C2H_PACKET:
-		rtl8821ae_c2h_packet_handler(hw, skb->data, (u8)skb->len);
+		rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
 		result = 1;
 		RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
 			 "skb->len=%d\n\n", skb->len);
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 10/14] rtlwifi: remove hal_op rx_command_packet
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (8 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 09/14] rtlwifi: remove duplicate C2H handler pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 11/14] rtlwifi: remove hal_op c2h_content_parsing pkshih
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Because the hal_op rx_command_packet does C2H handler if rx packet type
is C2H, and the handler have been moved to base.c so we can call the
handler directly.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/pci.c         |  4 ++--
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c    |  1 -
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   | 24 --------------------
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.h   |  3 ---
 .../net/wireless/realtek/rtlwifi/rtl8723be/sw.c    |  1 -
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   | 24 --------------------
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.h   |  3 ---
 .../net/wireless/realtek/rtlwifi/rtl8821ae/sw.c    |  1 -
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   | 26 ----------------------
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.h   |  3 ---
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |  2 --
 11 files changed, 2 insertions(+), 90 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index d0c509ef790e..dd51c67c09fa 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -830,8 +830,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
 			goto new_trx_end;
 		}
 		/* handle command packet here */
-		if (rtlpriv->cfg->ops->rx_command_packet &&
-		    rtlpriv->cfg->ops->rx_command_packet(hw, &stats, skb)) {
+		if (stats.packet_report_type == C2H_PACKET) {
+			rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
 			dev_kfree_skb_any(skb);
 			goto new_trx_end;
 		}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
index fd028274c593..5b67ad748d67 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
@@ -250,7 +250,6 @@ static struct rtl_hal_ops rtl8192ee_hal_ops = {
 	.set_rfreg = rtl92ee_phy_set_rf_reg,
 	.fill_h2c_cmd = rtl92ee_fill_h2c_cmd,
 	.get_btc_status = rtl92ee_get_btc_status,
-	.rx_command_packet = rtl92ee_rx_command_packet,
 	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl92ee_c2h_ra_report_handler,
 };
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
index e525c2bb4457..14d6e3fc5767 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
@@ -1072,27 +1072,3 @@ bool rtl92ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 index)
 void rtl92ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
 {
 }
-
-u32 rtl92ee_rx_command_packet(struct ieee80211_hw *hw,
-			      const struct rtl_stats *status,
-			      struct sk_buff *skb)
-{
-	u32 result = 0;
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-
-	switch (status->packet_report_type) {
-	case NORMAL_RX:
-		result = 0;
-		break;
-	case C2H_PACKET:
-		rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
-		result = 1;
-		break;
-	default:
-		RT_TRACE(rtlpriv, COMP_RECV, DBG_TRACE,
-			 "Unknown packet type %d\n", status->packet_report_type);
-		break;
-	}
-
-	return result;
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
index 48c16fff20c6..45df3e79f490 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
@@ -762,7 +762,4 @@ void rtl92ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl92ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
 			     bool firstseg, bool lastseg,
 			     struct sk_buff *skb);
-u32 rtl92ee_rx_command_packet(struct ieee80211_hw *hw,
-			      const struct rtl_stats *status,
-			      struct sk_buff *skb);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
index 9df994965c4a..a41e67b3f38b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
@@ -261,7 +261,6 @@ static struct rtl_hal_ops rtl8723be_hal_ops = {
 	.set_rfreg = rtl8723be_phy_set_rf_reg,
 	.fill_h2c_cmd = rtl8723be_fill_h2c_cmd,
 	.get_btc_status = rtl8723be_get_btc_status,
-	.rx_command_packet = rtl8723be_rx_command_packet,
 	.is_fw_header = is_fw_header,
 	.c2h_content_parsing = rtl_c2h_content_parsing,
 };
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
index 0c0cece9d5f9..9f8dfb5af774 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
@@ -761,27 +761,3 @@ void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
 			       BIT(0) << (hw_queue));
 	}
 }
-
-u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
-				const struct rtl_stats *status,
-				struct sk_buff *skb)
-{
-	u32 result = 0;
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-
-	switch (status->packet_report_type) {
-	case NORMAL_RX:
-			result = 0;
-			break;
-	case C2H_PACKET:
-			rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
-			result = 1;
-			break;
-	default:
-			RT_TRACE(rtlpriv, COMP_RECV, DBG_TRACE,
-				 "No this packet type!!\n");
-			break;
-	}
-
-	return result;
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
index 988bf0586674..609f7ad7f787 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
@@ -632,7 +632,4 @@ void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
 			       bool firstseg, bool lastseg,
 			       struct sk_buff *skb);
-u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
-				const struct rtl_stats *status,
-				struct sk_buff *skb);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
index bcabf4dc6353..8ff8a406db52 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
@@ -303,7 +303,6 @@ static struct rtl_hal_ops rtl8821ae_hal_ops = {
 	.set_rfreg = rtl8821ae_phy_set_rf_reg,
 	.fill_h2c_cmd = rtl8821ae_fill_h2c_cmd,
 	.get_btc_status = rtl8821ae_get_btc_status,
-	.rx_command_packet = rtl8821ae_rx_command_packet,
 	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl8821ae_c2h_ra_report_handler,
 	.add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
index a93d8569c186..d7960dd5bf1a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
@@ -1005,29 +1005,3 @@ void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
 			       BIT(0) << (hw_queue));
 	}
 }
-
-u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
-				const struct rtl_stats *status,
-				struct sk_buff *skb)
-{
-	u32 result = 0;
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-
-	switch (status->packet_report_type) {
-	case NORMAL_RX:
-		result = 0;
-		break;
-	case C2H_PACKET:
-		rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
-		result = 1;
-		RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
-			 "skb->len=%d\n\n", skb->len);
-		break;
-	default:
-		RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
-			 "No this packet type!!\n");
-		break;
-	}
-
-	return result;
-}
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
index 221dd2b29d3b..4ff0968dba81 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
@@ -628,7 +628,4 @@ void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl8821ae_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
 			       bool firstseg, bool lastseg,
 			       struct sk_buff *skb);
-u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
-				const struct rtl_stats *status,
-				struct sk_buff *skb);
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 392b3e84db7e..b40d8f5bbdce 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2340,8 +2340,6 @@ struct rtl_hal_ops {
 	void (*set_default_port_id_cmd)(struct ieee80211_hw *hw);
 	bool (*get_btc_status) (void);
 	bool (*is_fw_header)(struct rtlwifi_firmware_header *hdr);
-	u32 (*rx_command_packet)(struct ieee80211_hw *hw,
-				 const struct rtl_stats *status, struct sk_buff *skb);
 	void (*add_wowlan_pattern)(struct ieee80211_hw *hw,
 				   struct rtl_wow_pattern *rtl_pattern,
 				   u8 index);
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 11/14] rtlwifi: remove hal_op c2h_content_parsing
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (9 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 10/14] rtlwifi: remove hal_op rx_command_packet pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 12/14] rtlwifi: use sk_buff to queue C2H commands pkshih
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

Similar to rx_command_packet, we can call rtl_c2h_content_parsing so the
hal_op isn't necessary.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c         | 7 +++----
 drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c | 1 -
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c | 1 -
 drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c | 1 -
 drivers/net/wireless/realtek/rtlwifi/wifi.h         | 2 --
 5 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 0d03e98f9cb4..927b7d231576 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -2346,7 +2346,6 @@ void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 cmd_id,
 		break;
 	}
 }
-EXPORT_SYMBOL_GPL(rtl_c2h_content_parsing);
 
 void rtl_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
 {
@@ -2401,9 +2400,9 @@ void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec)
 		if (!c2hcmd)
 			break;
 
-		if (rtlpriv->cfg->ops->c2h_content_parsing && exec)
-			rtlpriv->cfg->ops->c2h_content_parsing(hw,
-					c2hcmd->tag, c2hcmd->len, c2hcmd->val);
+		if (exec)
+			rtl_c2h_content_parsing(hw, c2hcmd->tag,
+						c2hcmd->len, c2hcmd->val);
 
 		/* free */
 		kfree(c2hcmd->val);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
index 5b67ad748d67..9ea62599ecbb 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
@@ -250,7 +250,6 @@ static struct rtl_hal_ops rtl8192ee_hal_ops = {
 	.set_rfreg = rtl92ee_phy_set_rf_reg,
 	.fill_h2c_cmd = rtl92ee_fill_h2c_cmd,
 	.get_btc_status = rtl92ee_get_btc_status,
-	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl92ee_c2h_ra_report_handler,
 };
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
index a41e67b3f38b..c9f7b042d9c6 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
@@ -262,7 +262,6 @@ static struct rtl_hal_ops rtl8723be_hal_ops = {
 	.fill_h2c_cmd = rtl8723be_fill_h2c_cmd,
 	.get_btc_status = rtl8723be_get_btc_status,
 	.is_fw_header = is_fw_header,
-	.c2h_content_parsing = rtl_c2h_content_parsing,
 };
 
 static struct rtl_mod_params rtl8723be_mod_params = {
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
index 8ff8a406db52..77f6401021c9 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/sw.c
@@ -303,7 +303,6 @@ static struct rtl_hal_ops rtl8821ae_hal_ops = {
 	.set_rfreg = rtl8821ae_phy_set_rf_reg,
 	.fill_h2c_cmd = rtl8821ae_fill_h2c_cmd,
 	.get_btc_status = rtl8821ae_get_btc_status,
-	.c2h_content_parsing = rtl_c2h_content_parsing,
 	.c2h_ra_report_handler = rtl8821ae_c2h_ra_report_handler,
 	.add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
 };
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index b40d8f5bbdce..930e1ec2280f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2344,8 +2344,6 @@ struct rtl_hal_ops {
 				   struct rtl_wow_pattern *rtl_pattern,
 				   u8 index);
 	u16 (*get_available_desc)(struct ieee80211_hw *hw, u8 q_idx);
-	void (*c2h_content_parsing)(struct ieee80211_hw *hw, u8 tag, u8 len,
-				    u8 *val);
 	void (*c2h_ra_report_handler)(struct ieee80211_hw *hw,
 				      u8 *cmd_buf, u8 cmd_len);
 };
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 12/14] rtlwifi: use sk_buff to queue C2H commands
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (10 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 11/14] rtlwifi: remove hal_op c2h_content_parsing pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-18  9:30 ` [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro pkshih
  2018-05-18  9:30 ` [PATCH 14/14] rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO pkshih
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

We use 'struct rtl_c2hcmd' to store C2H commands originally, and the code
is slightly complex to enqueue and dequeue and also wastes time to
allocate and memcpy data. Since C2H commands are asynchronous events,
they can be processed in work queue, so RX ISR enqueues C2H result in
removal of rtl_c2h_packet_handler().

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c | 96 +++++++----------------------
 drivers/net/wireless/realtek/rtlwifi/base.h |  5 +-
 drivers/net/wireless/realtek/rtlwifi/pci.c  |  3 +-
 drivers/net/wireless/realtek/rtlwifi/wifi.h |  2 +-
 4 files changed, 25 insertions(+), 81 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 927b7d231576..61f12f86fcd4 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -571,9 +571,9 @@ int rtl_init_core(struct ieee80211_hw *hw)
 	spin_lock_init(&rtlpriv->locks.iqk_lock);
 	/* <5> init list */
 	INIT_LIST_HEAD(&rtlpriv->entry_list);
-	INIT_LIST_HEAD(&rtlpriv->c2hcmd_list);
 	INIT_LIST_HEAD(&rtlpriv->scan_list.list);
 	skb_queue_head_init(&rtlpriv->tx_report.queue);
+	skb_queue_head_init(&rtlpriv->c2hcmd_queue);
 
 	rtlmac->link_state = MAC80211_NOLINK;
 
@@ -2262,56 +2262,36 @@ void rtl_fwevt_wq_callback(void *data)
 	rtlpriv->cfg->ops->c2h_command_handle(hw);
 }
 
-void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val)
+void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	unsigned long flags;
-	struct rtl_c2hcmd *c2hcmd;
-
-	c2hcmd = kmalloc(sizeof(*c2hcmd),
-			 in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
-
-	if (!c2hcmd)
-		goto label_err;
-
-	c2hcmd->val = kmalloc(len,
-			      in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
-
-	if (!c2hcmd->val)
-		goto label_err2;
-
-	/* fill data */
-	c2hcmd->tag = tag;
-	c2hcmd->len = len;
-	memcpy(c2hcmd->val, val, len);
 
 	/* enqueue */
 	spin_lock_irqsave(&rtlpriv->locks.c2hcmd_lock, flags);
 
-	list_add_tail(&c2hcmd->list, &rtlpriv->c2hcmd_list);
+	__skb_queue_tail(&rtlpriv->c2hcmd_queue, skb);
 
 	spin_unlock_irqrestore(&rtlpriv->locks.c2hcmd_lock, flags);
 
 	/* wake up wq */
 	queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.c2hcmd_wq, 0);
-
-	return;
-
-label_err2:
-	kfree(c2hcmd);
-
-label_err:
-	RT_TRACE(rtlpriv, COMP_CMD, DBG_WARNING,
-		 "C2H cmd enqueue fail.\n");
 }
 EXPORT_SYMBOL(rtl_c2hcmd_enqueue);
 
-void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 cmd_id,
-			     u8 cmd_len, u8 *cmd_buf)
+static void rtl_c2h_content_parsing(struct ieee80211_hw *hw,
+				    struct sk_buff *skb)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	struct rtl_hal_ops *hal_ops = rtlpriv->cfg->ops;
 	const struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
+	u8 cmd_id, cmd_seq, cmd_len;
+	u8 *cmd_buf = NULL;
+
+	cmd_id = skb->data[0];
+	cmd_seq = skb->data[1];
+	cmd_len = skb->len - 2;
+	cmd_buf = skb->data + 2;
 
 	switch (cmd_id) {
 	case C2H_DBG:
@@ -2347,67 +2327,35 @@ void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 cmd_id,
 	}
 }
 
-void rtl_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
-{
-	struct rtl_priv *rtlpriv = rtl_priv(hw);
-	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
-	u8 *tmp_buf = NULL;
-
-	c2h_cmd_id = buffer[0];
-	c2h_cmd_seq = buffer[1];
-	c2h_cmd_len = len - 2;
-	tmp_buf = buffer + 2;
-
-	RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
-		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
-
-	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
-		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
-
-	switch (c2h_cmd_id) {
-	case C2H_BT_INFO:
-	case C2H_BT_MP:
-		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
-		break;
-	default:
-		rtl_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
-		break;
-	}
-}
-EXPORT_SYMBOL_GPL(rtl_c2h_packet_handler);
-
 void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
+	struct sk_buff *skb;
 	unsigned long flags;
-	struct rtl_c2hcmd *c2hcmd;
 	int i;
 
 	for (i = 0; i < 200; i++) {
 		/* dequeue a task */
 		spin_lock_irqsave(&rtlpriv->locks.c2hcmd_lock, flags);
 
-		c2hcmd = list_first_entry_or_null(&rtlpriv->c2hcmd_list,
-						  struct rtl_c2hcmd, list);
-
-		if (c2hcmd)
-			list_del(&c2hcmd->list);
+		skb = __skb_dequeue(&rtlpriv->c2hcmd_queue);
 
 		spin_unlock_irqrestore(&rtlpriv->locks.c2hcmd_lock, flags);
 
 		/* do it */
-		if (!c2hcmd)
+		if (!skb)
 			break;
 
+		RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, "C2H rx_desc_shift=%d\n",
+			 *((u8 *)skb->cb));
+		RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_DMESG,
+			      "C2H data: ", skb->data, skb->len);
+
 		if (exec)
-			rtl_c2h_content_parsing(hw, c2hcmd->tag,
-						c2hcmd->len, c2hcmd->val);
+			rtl_c2h_content_parsing(hw, skb);
 
 		/* free */
-		kfree(c2hcmd->val);
-
-		kfree(c2hcmd);
+		dev_kfree_skb_any(skb);
 	}
 }
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/base.h b/drivers/net/wireless/realtek/rtlwifi/base.h
index 3bf174e5b07e..912f205779c3 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.h
+++ b/drivers/net/wireless/realtek/rtlwifi/base.h
@@ -161,10 +161,7 @@ void rtl_watchdog_wq_callback(void *data);
 void rtl_fwevt_wq_callback(void *data);
 void rtl_c2hcmd_wq_callback(void *data);
 void rtl_c2hcmd_launcher(struct ieee80211_hw *hw, int exec);
-void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, u8 tag, u8 len, u8 *val);
-void rtl_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
-			     u8 c2h_cmd_len, u8 *tmp_buf);
-void rtl_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
+void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, struct sk_buff *skb);
 
 u8 rtl_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index,
 			    enum wireless_mode wirelessmode);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c b/drivers/net/wireless/realtek/rtlwifi/pci.c
index dd51c67c09fa..ae13bcfb3bf0 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -831,8 +831,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
 		}
 		/* handle command packet here */
 		if (stats.packet_report_type == C2H_PACKET) {
-			rtl_c2h_packet_handler(hw, skb->data, (u8)skb->len);
-			dev_kfree_skb_any(skb);
+			rtl_c2hcmd_enqueue(hw, skb);
 			goto new_trx_end;
 		}
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 930e1ec2280f..9e620b943f8c 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -2791,7 +2791,7 @@ struct rtl_priv {
 	struct list_head entry_list;
 
 	/* c2hcmd list for kthread level access */
-	struct list_head c2hcmd_list;
+	struct sk_buff_head c2hcmd_queue;
 
 	struct rtl_debug dbg;
 	int max_fw_size;
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (11 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 12/14] rtlwifi: use sk_buff to queue C2H commands pkshih
@ 2018-05-18  9:30 ` pkshih
  2018-05-29  5:18   ` Kalle Valo
  2018-05-18  9:30 ` [PATCH 14/14] rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO pkshih
  13 siblings, 1 reply; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

The format of C2H data is ID(1 byte) + Length(1 byte) + value, and it is
more readable to use macros to access C2H data.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c | 8 ++++----
 drivers/net/wireless/realtek/rtlwifi/wifi.h | 5 +++++
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index 61f12f86fcd4..a5939ddfa9cb 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -2288,10 +2288,10 @@ static void rtl_c2h_content_parsing(struct ieee80211_hw *hw,
 	u8 cmd_id, cmd_seq, cmd_len;
 	u8 *cmd_buf = NULL;
 
-	cmd_id = skb->data[0];
-	cmd_seq = skb->data[1];
-	cmd_len = skb->len - 2;
-	cmd_buf = skb->data + 2;
+	cmd_id = GET_C2H_CMD_ID(skb->data);
+	cmd_seq = GET_C2H_SEQ(skb->data);
+	cmd_len = skb->len - C2H_DATA_OFFSET;
+	cmd_buf = GET_C2H_DATA_PTR(skb->data);
 
 	switch (cmd_id) {
 	case C2H_DBG:
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index 9e620b943f8c..0f3b98c5227f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -177,6 +177,11 @@ enum rtl_c2h_evt_v2 {
 	C2H_V2_CCX_RPT = 0x0F,
 };
 
+#define GET_C2H_CMD_ID(c2h)	({u8 *__c2h = c2h; __c2h[0]; })
+#define GET_C2H_SEQ(c2h)	({u8 *__c2h = c2h; __c2h[1]; })
+#define C2H_DATA_OFFSET		2
+#define GET_C2H_DATA_PTR(c2h)	({u8 *__c2h = c2h; &__c2h[C2H_DATA_OFFSET]; })
+
 #define GET_TX_REPORT_SN_V1(c2h)	(c2h[6])
 #define GET_TX_REPORT_ST_V1(c2h)	(c2h[0] & 0xC0)
 #define GET_TX_REPORT_RETRY_V1(c2h)	(c2h[2] & 0x3F)
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 14/14] rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO
  2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
                   ` (12 preceding siblings ...)
  2018-05-18  9:30 ` [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro pkshih
@ 2018-05-18  9:30 ` pkshih
  13 siblings, 0 replies; 25+ messages in thread
From: pkshih @ 2018-05-18  9:30 UTC (permalink / raw)
  To: kvalo; +Cc: Larry.Finger, linux-wireless

From: Ping-Ke Shih <pkshih@realtek.com>

In former patch, I enqueu all C2H commands and processed by a workqueue.
In case C2H_BT_INFO will issue a H2C command to set BT reg, and wait for
a C2H ack. But it is totally impossible that C2H workqueue waits for a
C2H command, so kernel log warn
	rtlwifi: :<0> btmpinfo wait (req_num=0) timeout

Since the C2H ack command C2H_BT_MP can be safely processed in interrupt
context, add a fast command path to deal with the command.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
---
 drivers/net/wireless/realtek/rtlwifi/base.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/drivers/net/wireless/realtek/rtlwifi/base.c b/drivers/net/wireless/realtek/rtlwifi/base.c
index a5939ddfa9cb..39c817eddd78 100644
--- a/drivers/net/wireless/realtek/rtlwifi/base.c
+++ b/drivers/net/wireless/realtek/rtlwifi/base.c
@@ -2262,11 +2262,33 @@ void rtl_fwevt_wq_callback(void *data)
 	rtlpriv->cfg->ops->c2h_command_handle(hw);
 }
 
+static void rtl_c2h_content_parsing(struct ieee80211_hw *hw,
+				    struct sk_buff *skb);
+
+static bool rtl_c2h_fast_cmd(struct ieee80211_hw *hw, struct sk_buff *skb)
+{
+	u8 cmd_id = GET_C2H_CMD_ID(skb->data);
+
+	switch (cmd_id) {
+	case C2H_BT_MP:
+		return true;
+	default:
+		break;
+	}
+
+	return false;
+}
+
 void rtl_c2hcmd_enqueue(struct ieee80211_hw *hw, struct sk_buff *skb)
 {
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
 	unsigned long flags;
 
+	if (rtl_c2h_fast_cmd(hw, skb)) {
+		rtl_c2h_content_parsing(hw, skb);
+		return;
+	}
+
 	/* enqueue */
 	spin_lock_irqsave(&rtlpriv->locks.c2hcmd_lock, flags);
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-05-18  9:30 ` [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro pkshih
@ 2018-05-29  5:18   ` Kalle Valo
  2018-05-31  2:13     ` Pkshih
  0 siblings, 1 reply; 25+ messages in thread
From: Kalle Valo @ 2018-05-29  5:18 UTC (permalink / raw)
  To: pkshih; +Cc: Larry.Finger, linux-wireless

<pkshih@realtek.com> writes:

> From: Ping-Ke Shih <pkshih@realtek.com>
>
> The format of C2H data is ID(1 byte) + Length(1 byte) + value, and it is
> more readable to use macros to access C2H data.
>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>

[...]

> --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
> +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
> @@ -177,6 +177,11 @@ enum rtl_c2h_evt_v2 {
>  	C2H_V2_CCX_RPT = 0x0F,
>  };
>  
> +#define GET_C2H_CMD_ID(c2h)	({u8 *__c2h = c2h; __c2h[0]; })
> +#define GET_C2H_SEQ(c2h)	({u8 *__c2h = c2h; __c2h[1]; })
> +#define C2H_DATA_OFFSET		2
> +#define GET_C2H_DATA_PTR(c2h)	({u8 *__c2h = c2h; &__c2h[C2H_DATA_OFFSET]; })

These macros are not really pretty, a proper static inline function
would be a much better choise. But I'm planning to apply this patch
anyway, I don't think it's a blocker but a good idea to cleanup later.

And rtlwifi really should get away with this foo[0] and foo[1] style of
buffers and switch to proper structs (foo->bar and foo->koo).

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [01/14] rtlwifi: support accurate nullfunc frame tx ack report
  2018-05-18  9:29 ` [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report pkshih
@ 2018-05-29  7:18   ` Kalle Valo
  0 siblings, 0 replies; 25+ messages in thread
From: Kalle Valo @ 2018-05-29  7:18 UTC (permalink / raw)
  To: Ping-Ke Shih; +Cc: Larry.Finger, linux-wireless

Ping-Ke Shih <pkshih@realtek.com> wrote:

> From: Tzu-En Huang <tehuang@realtek.com>
> 
> In order to realize the keep-alive mechanism in mac80211 stack, reporting
> accurate tx ack status for nullfunc frame is added in this commit.
> 
> If current frame is nullfunc frame, we ask firmware to report by filling
> TX report bit in TX descriptor. After this frame DMA done, TX interrupt is
> triggered but TX status is unknown at this moment, so enqueue this skb
> into tx_report->queue. Finally, C2H report will be received if the frame
> is transmitted successfully or retried over, and then we report to mac80211
> with IEEE80211_TX_STAT_ACK flag only if it's successful. Otherwise, if
> failure or timeout (one second), we report to mac80211 without this flag.
> 
> Signed-off-by: Tzu-En Huang <tehuang@realtek.com>
> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>

14 patches applied to wireless-drivers-next.git, thanks.

6acfbb81ab0a rtlwifi: support accurate nullfunc frame tx ack report
faa280065397 rtlwifi: remove CONNECTION_MONITOR flag
c4528686d0ea rtlwifi: remove duplicate rx_packet_type definition
249155973f52 rtlwifi: rename register-based C2H command IDs to V0
7aeb100b7d70 rtlwifi: remove duplicate C2H definition
16e78cb4a571 rtlwifi: remove unused fw C2H command ID
ff77960d62d2 rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and rtl8723ae
16cefa449c9c rtlwifi: Add hal_op c2h_ra_report_handler for special process
daf026ae5fbe rtlwifi: remove duplicate C2H handler
23ffab177b1d rtlwifi: remove hal_op rx_command_packet
b4f6ee489cff rtlwifi: remove hal_op c2h_content_parsing
9ae6ed271a60 rtlwifi: use sk_buff to queue C2H commands
9644032e3070 rtlwifi: access skb->data to get C2H data by macro
0a9f8f0a1ba9 rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO

-- 
https://patchwork.kernel.org/patch/10409171/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-05-29  5:18   ` Kalle Valo
@ 2018-05-31  2:13     ` Pkshih
  2018-06-29  7:30       ` Kalle Valo
  0 siblings, 1 reply; 25+ messages in thread
From: Pkshih @ 2018-05-31  2:13 UTC (permalink / raw)
  To: kvalo; +Cc: linux-wireless, Larry.Finger

T24gVHVlLCAyMDE4LTA1LTI5IGF0IDA4OjE4ICswMzAwLCBLYWxsZSBWYWxvIHdyb3RlOg0KPiA8
cGtzaGloQHJlYWx0ZWsuY29tPiB3cml0ZXM6DQo+wqANCj4gPiBGcm9tOiBQaW5nLUtlIFNoaWgg
PHBrc2hpaEByZWFsdGVrLmNvbT4NCj4gPg0KPiA+IFRoZSBmb3JtYXQgb2YgQzJIIGRhdGEgaXMg
SUQoMSBieXRlKSArIExlbmd0aCgxIGJ5dGUpICsgdmFsdWUsIGFuZCBpdCBpcw0KPiA+IG1vcmUg
cmVhZGFibGUgdG8gdXNlIG1hY3JvcyB0byBhY2Nlc3MgQzJIIGRhdGEuDQo+ID4NCj4gPiBTaWdu
ZWQtb2ZmLWJ5OiBQaW5nLUtlIFNoaWggPHBrc2hpaEByZWFsdGVrLmNvbT4NCj7CoA0KPiBbLi4u
XQ0KPsKgDQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dp
ZmkuaA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS93aWZp
LmgNCj4gPiBAQCAtMTc3LDYgKzE3NywxMSBAQCBlbnVtIHJ0bF9jMmhfZXZ0X3YyIHsNCj4gPsKg
wqAJQzJIX1YyX0NDWF9SUFQgPSAweDBGLA0KPiA+wqDCoH07DQo+ID7CoMKgDQo+ID4gKyNkZWZp
bmUgR0VUX0MySF9DTURfSUQoYzJoKQkoe3U4ICpfX2MyaCA9IGMyaDsgX19jMmhbMF07IH0pDQo+
ID4gKyNkZWZpbmUgR0VUX0MySF9TRVEoYzJoKQkoe3U4ICpfX2MyaCA9IGMyaDsgX19jMmhbMV07
IH0pDQo+ID4gKyNkZWZpbmUgQzJIX0RBVEFfT0ZGU0VUCQkyDQo+ID4gKyNkZWZpbmUgR0VUX0My
SF9EQVRBX1BUUihjMmgpCSh7dTggKl9fYzJoID0gYzJoOyAmX19jMmhbQzJIX0RBVEFfT0ZGU0VU
XTsgfSkNCj7CoA0KPiBUaGVzZSBtYWNyb3MgYXJlIG5vdCByZWFsbHkgcHJldHR5LCBhIHByb3Bl
ciBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uDQo+IHdvdWxkIGJlIGEgbXVjaCBiZXR0ZXIgY2hvaXNl
LiBCdXQgSSdtIHBsYW5uaW5nIHRvIGFwcGx5IHRoaXMgcGF0Y2gNCj4gYW55d2F5LCBJIGRvbid0
IHRoaW5rIGl0J3MgYSBibG9ja2VyIGJ1dCBhIGdvb2QgaWRlYSB0byBjbGVhbnVwIGxhdGVyLg0K
PsKgDQo+IEFuZCBydGx3aWZpIHJlYWxseSBzaG91bGQgZ2V0IGF3YXkgd2l0aCB0aGlzIGZvb1sw
XSBhbmQgZm9vWzFdIHN0eWxlIG9mDQo+IGJ1ZmZlcnMgYW5kIHN3aXRjaCB0byBwcm9wZXIgc3Ry
dWN0cyAoZm9vLT5iYXIgYW5kIGZvby0+a29vKS4NCg0KVGhhbmtzIGZvciB5b3VyIHJldmlldyBh
bmQgc3VnZ2VzdGlvbi4NCg0KQmVjYXVzZSBDMkggZGF0YSBpcyBsaXR0bGUgZW5kaWFuIG9yZGVy
LCB0aGUgc3RydWN0IHdpbGwgbG9vayBsaWtlDQpzdHJ1Y3QgZm9vIHsNCiNpZmRlZsKgX19MSVRU
TEVfRU5ESUFODQoJdTggYmFyOjQ7DQoJdTgga29vOjQ7DQojZWxzZQ0KCXU4IGtvbzo0Ow0KCXU4
IGJhcjo0Ow0KI2VuZGlmDQp9DQoNCklzIHRoaXMgYSBsaW51eCBjb252ZW50aW9uPw0KDQpSZWdh
cmRzDQpQSw0KDQo=

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-05-31  2:13     ` Pkshih
@ 2018-06-29  7:30       ` Kalle Valo
  2018-07-03  6:03         ` Pkshih
  0 siblings, 1 reply; 25+ messages in thread
From: Kalle Valo @ 2018-06-29  7:30 UTC (permalink / raw)
  To: Pkshih; +Cc: linux-wireless, Larry.Finger

Pkshih <pkshih@realtek.com> writes:

> On Tue, 2018-05-29 at 08:18 +0300, Kalle Valo wrote:
>> <pkshih@realtek.com> writes:
>>=C2=A0
>> > From: Ping-Ke Shih <pkshih@realtek.com>
>> >
>> > The format of C2H data is ID(1 byte) + Length(1 byte) + value, and it =
is
>> > more readable to use macros to access C2H data.
>> >
>> > Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
>>=C2=A0
>> [...]
>>=C2=A0
>> > --- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
>> > +++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
>> > @@ -177,6 +177,11 @@ enum rtl_c2h_evt_v2 {
>> >=C2=A0=C2=A0	C2H_V2_CCX_RPT =3D 0x0F,
>> >=C2=A0=C2=A0};
>> >=C2=A0=C2=A0
>> > +#define GET_C2H_CMD_ID(c2h)	({u8 *__c2h =3D c2h; __c2h[0]; })
>> > +#define GET_C2H_SEQ(c2h)	({u8 *__c2h =3D c2h; __c2h[1]; })
>> > +#define C2H_DATA_OFFSET		2
>> > +#define GET_C2H_DATA_PTR(c2h)	({u8 *__c2h =3D c2h; &__c2h[C2H_DATA_OF=
FSET]; })
>>=C2=A0
>> These macros are not really pretty, a proper static inline function
>> would be a much better choise. But I'm planning to apply this patch
>> anyway, I don't think it's a blocker but a good idea to cleanup later.
>>=C2=A0
>> And rtlwifi really should get away with this foo[0] and foo[1] style of
>> buffers and switch to proper structs (foo->bar and foo->koo).
>
> Thanks for your review and suggestion.
>
> Because C2H data is little endian order, the struct will look like
> struct foo {
> #ifdef=C2=A0__LITTLE_ENDIAN
> 	u8 bar:4;
> 	u8 koo:4;
> #else
> 	u8 koo:4;
> 	u8 bar:4;
> #endif
> }

With u8 you don't need endian check, right? I would assume that with
both little and big endian bar and koo would be in the same place.

> Is this a linux convention?

Earlier bitfields were disliked but nowadays they seem to be have become
more acceptable. But I think the preferred way still is something like
this (using u32 and 16 bit fields):

struct foo {
        __le32 koobar;
}

#define RTLWIFI_BAR_MASK GENMASK(15, 0)
#define RTLWIFI_KOO_MASK GENMASK(31, 16)

bar =3D FIELD_GET(RTLWIFI_BAR_MASK, __le32_to_cpu(foo->koobar));
koo =3D FIELD_GET(RTLWIFI_KOO_MASK, __le32_to_cpu(foo->koobar));

Of course there can be other good ways to do the same, others can chime
in about those, but this is how I would do it.

--=20
Kalle Valo

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-06-29  7:30       ` Kalle Valo
@ 2018-07-03  6:03         ` Pkshih
  2018-07-03  6:14           ` Kalle Valo
  0 siblings, 1 reply; 25+ messages in thread
From: Pkshih @ 2018-07-03  6:03 UTC (permalink / raw)
  To: kvalo; +Cc: linux-wireless, Larry.Finger

T24gRnJpLCAyMDE4LTA2LTI5IGF0IDEwOjMwICswMzAwLCBLYWxsZSBWYWxvIHdyb3RlOg0KPiBQ
a3NoaWggPHBrc2hpaEByZWFsdGVrLmNvbT4gd3JpdGVzOg0KPiANCj4gPiBPbiBUdWUsIDIwMTgt
MDUtMjkgYXQgMDg6MTggKzAzMDAsIEthbGxlIFZhbG8gd3JvdGU6DQo+ID4+IDxwa3NoaWhAcmVh
bHRlay5jb20+IHdyaXRlczoNCj4gPj7CoA0KPiA+DQo+ID4gQmVjYXVzZSBDMkggZGF0YSBpcyBs
aXR0bGUgZW5kaWFuIG9yZGVyLCB0aGUgc3RydWN0IHdpbGwgbG9vayBsaWtlDQo+ID4gc3RydWN0
IGZvbyB7DQo+ID4gI2lmZGVmwqBfX0xJVFRMRV9FTkRJQU4NCj4gPsKgCXU4IGJhcjo0Ow0KPiA+
wqAJdTgga29vOjQ7DQo+ID4gI2Vsc2UNCj4gPsKgCXU4IGtvbzo0Ow0KPiA+wqAJdTggYmFyOjQ7
DQo+ID4gI2VuZGlmDQo+ID4gfQ0KPiANCj4gV2l0aCB1OCB5b3UgZG9uJ3QgbmVlZCBlbmRpYW4g
Y2hlY2ssIHJpZ2h0PyBJIHdvdWxkIGFzc3VtZSB0aGF0IHdpdGgNCj4gYm90aCBsaXR0bGUgYW5k
IGJpZyBlbmRpYW4gYmFyIGFuZCBrb28gd291bGQgYmUgaW4gdGhlIHNhbWUgcGxhY2UuDQoNCkkg
dGhpbmsgdTggd2l0aCBiaXRmaWVsZCB3b3VsZCBiZSBkaWZmZXJlbnQgYmV0d2VlbiBsaXR0bGUg
YW5kIGJpZyBlbmRpYW4NCm1hY2hpbmVzLg0KDQo+ID4gSXMgdGhpcyBhIGxpbnV4IGNvbnZlbnRp
b24/DQo+IA0KPiBFYXJsaWVyIGJpdGZpZWxkcyB3ZXJlIGRpc2xpa2VkIGJ1dCBub3dhZGF5cyB0
aGV5IHNlZW0gdG8gYmUgaGF2ZSBiZWNvbWUNCj4gbW9yZSBhY2NlcHRhYmxlLiBCdXQgSSB0aGlu
ayB0aGUgcHJlZmVycmVkIHdheSBzdGlsbCBpcyBzb21ldGhpbmcgbGlrZQ0KPiB0aGlzICh1c2lu
ZyB1MzIgYW5kIDE2IGJpdCBmaWVsZHMpOg0KPiANCj4gc3RydWN0IGZvbyB7DQo+IMKgwqDCoMKg
wqDCoMKgwqBfX2xlMzIga29vYmFyOw0KPiB9DQo+IA0KPiAjZGVmaW5lIFJUTFdJRklfQkFSX01B
U0sgR0VOTUFTSygxNSwgMCkNCj4gI2RlZmluZSBSVExXSUZJX0tPT19NQVNLIEdFTk1BU0soMzEs
IDE2KQ0KPiANCj4gYmFyID0gRklFTERfR0VUKFJUTFdJRklfQkFSX01BU0ssIF9fbGUzMl90b19j
cHUoZm9vLT5rb29iYXIpKTsNCj4ga29vID0gRklFTERfR0VUKFJUTFdJRklfS09PX01BU0ssIF9f
bGUzMl90b19jcHUoZm9vLT5rb29iYXIpKTsNCj4gDQo+IE9mIGNvdXJzZSB0aGVyZSBjYW4gYmUg
b3RoZXIgZ29vZCB3YXlzIHRvIGRvIHRoZSBzYW1lLCBvdGhlcnMgY2FuIGNoaW1lDQo+IGluIGFi
b3V0IHRob3NlLCBidXQgdGhpcyBpcyBob3cgSSB3b3VsZCBkbyBpdC4NCj4gDQoNCkkgd2lsbCBy
ZXdyaXRlIHRoaXMgcGFydCBieSB5b3VyIHN1Z2dlc3Rpb25zLg0KVGhhbmtzDQpQSw0KDQo=

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-07-03  6:03         ` Pkshih
@ 2018-07-03  6:14           ` Kalle Valo
  2018-07-03  8:32             ` Felix Fietkau
  0 siblings, 1 reply; 25+ messages in thread
From: Kalle Valo @ 2018-07-03  6:14 UTC (permalink / raw)
  To: Pkshih; +Cc: linux-wireless, Larry.Finger

Pkshih <pkshih@realtek.com> writes:

> On Fri, 2018-06-29 at 10:30 +0300, Kalle Valo wrote:
>> Pkshih <pkshih@realtek.com> writes:
>>=20
>> > On Tue, 2018-05-29 at 08:18 +0300, Kalle Valo wrote:
>> >> <pkshih@realtek.com> writes:
>> >>=C2=A0
>> >
>> > Because C2H data is little endian order, the struct will look like
>> > struct foo {
>> > #ifdef=C2=A0__LITTLE_ENDIAN
>> >=C2=A0	u8 bar:4;
>> >=C2=A0	u8 koo:4;
>> > #else
>> >=C2=A0	u8 koo:4;
>> >=C2=A0	u8 bar:4;
>> > #endif
>> > }
>>=20
>> With u8 you don't need endian check, right? I would assume that with
>> both little and big endian bar and koo would be in the same place.
>
> I think u8 with bitfield would be different between little and big endian
> machines.

To me that does not make any sense, I have never heard about bit
endianness any of the devices I have worked on.

https://en.wikipedia.org/wiki/Endianness

--=20
Kalle Valo

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-07-03  6:14           ` Kalle Valo
@ 2018-07-03  8:32             ` Felix Fietkau
  2018-07-03 10:57               ` Kalle Valo
  0 siblings, 1 reply; 25+ messages in thread
From: Felix Fietkau @ 2018-07-03  8:32 UTC (permalink / raw)
  To: Kalle Valo, Pkshih; +Cc: linux-wireless, Larry.Finger

On 2018-07-03 08:14, Kalle Valo wrote:
> Pkshih <pkshih@realtek.com> writes:
> 
>> On Fri, 2018-06-29 at 10:30 +0300, Kalle Valo wrote:
>>> Pkshih <pkshih@realtek.com> writes:
>>> 
>>> > On Tue, 2018-05-29 at 08:18 +0300, Kalle Valo wrote:
>>> >> <pkshih@realtek.com> writes:
>>> >> 
>>> >
>>> > Because C2H data is little endian order, the struct will look like
>>> > struct foo {
>>> > #ifdef __LITTLE_ENDIAN
>>> > 	u8 bar:4;
>>> > 	u8 koo:4;
>>> > #else
>>> > 	u8 koo:4;
>>> > 	u8 bar:4;
>>> > #endif
>>> > }
>>> 
>>> With u8 you don't need endian check, right? I would assume that with
>>> both little and big endian bar and koo would be in the same place.
>>
>> I think u8 with bitfield would be different between little and big endian
>> machines.
> 
> To me that does not make any sense, I have never heard about bit
> endianness any of the devices I have worked on.
Unfortunately, the order in which these fields are laid out is different
between big and little endian, even when only dealing with u8.
That alone is a strong reason to avoid bitfields entirely for anything
shared between the host and something else.

- Felix

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-07-03  8:32             ` Felix Fietkau
@ 2018-07-03 10:57               ` Kalle Valo
  2018-07-03 11:01                 ` Felix Fietkau
  2018-07-03 15:28                 ` Larry Finger
  0 siblings, 2 replies; 25+ messages in thread
From: Kalle Valo @ 2018-07-03 10:57 UTC (permalink / raw)
  To: Felix Fietkau; +Cc: Pkshih, linux-wireless, Larry.Finger

Felix Fietkau <nbd@nbd.name> writes:

> On 2018-07-03 08:14, Kalle Valo wrote:
>> Pkshih <pkshih@realtek.com> writes:
>>=20
>>> On Fri, 2018-06-29 at 10:30 +0300, Kalle Valo wrote:
>>>> Pkshih <pkshih@realtek.com> writes:
>>>>=20
>>>> > On Tue, 2018-05-29 at 08:18 +0300, Kalle Valo wrote:
>>>> >> <pkshih@realtek.com> writes:
>>>> >>=C2=A0
>>>> >
>>>> > Because C2H data is little endian order, the struct will look like
>>>> > struct foo {
>>>> > #ifdef=C2=A0__LITTLE_ENDIAN
>>>> >=C2=A0	u8 bar:4;
>>>> >=C2=A0	u8 koo:4;
>>>> > #else
>>>> >=C2=A0	u8 koo:4;
>>>> >=C2=A0	u8 bar:4;
>>>> > #endif
>>>> > }
>>>>=20
>>>> With u8 you don't need endian check, right? I would assume that with
>>>> both little and big endian bar and koo would be in the same place.
>>>
>>> I think u8 with bitfield would be different between little and big endi=
an
>>> machines.
>>=20
>> To me that does not make any sense, I have never heard about bit
>> endianness any of the devices I have worked on.
>
> Unfortunately, the order in which these fields are laid out is different
> between big and little endian, even when only dealing with u8.

Oh, didn't know that. Can you give some examples about endian problems
with u8 bitfields? Still not getting it. Not that it matters, just
curious.

> That alone is a strong reason to avoid bitfields entirely for anything
> shared between the host and something else.

Very good to know, thanks.

--=20
Kalle Valo

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-07-03 10:57               ` Kalle Valo
@ 2018-07-03 11:01                 ` Felix Fietkau
  2018-07-03 15:28                 ` Larry Finger
  1 sibling, 0 replies; 25+ messages in thread
From: Felix Fietkau @ 2018-07-03 11:01 UTC (permalink / raw)
  To: Kalle Valo; +Cc: Pkshih, linux-wireless, Larry.Finger

On 2018-07-03 12:57, Kalle Valo wrote:
>>> To me that does not make any sense, I have never heard about bit
>>> endianness any of the devices I have worked on.
>>
>> Unfortunately, the order in which these fields are laid out is different
>> between big and little endian, even when only dealing with u8.
> 
> Oh, didn't know that. Can you give some examples about endian problems
> with u8 bitfields? Still not getting it. Not that it matters, just
> curious.
On a quick google search, I found this:
http://mjfrazer.org/mjfrazer/bitfields/

- Felix

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro
  2018-07-03 10:57               ` Kalle Valo
  2018-07-03 11:01                 ` Felix Fietkau
@ 2018-07-03 15:28                 ` Larry Finger
  1 sibling, 0 replies; 25+ messages in thread
From: Larry Finger @ 2018-07-03 15:28 UTC (permalink / raw)
  To: Kalle Valo, Felix Fietkau; +Cc: Pkshih, linux-wireless

On 07/03/2018 05:57 AM, Kalle Valo wrote:
> Felix Fietkau <nbd@nbd.name> writes:
> 
>> On 2018-07-03 08:14, Kalle Valo wrote:
>>> Pkshih <pkshih@realtek.com> writes:
>>>
>>>> On Fri, 2018-06-29 at 10:30 +0300, Kalle Valo wrote:
>>>>> Pkshih <pkshih@realtek.com> writes:
>>>>>
>>>>>> On Tue, 2018-05-29 at 08:18 +0300, Kalle Valo wrote:
>>>>>>> <pkshih@realtek.com> writes:
>>>>>>>   
>>>>>>
>>>>>> Because C2H data is little endian order, the struct will look like
>>>>>> struct foo {
>>>>>> #ifdef __LITTLE_ENDIAN
>>>>>>   	u8 bar:4;
>>>>>>   	u8 koo:4;
>>>>>> #else
>>>>>>   	u8 koo:4;
>>>>>>   	u8 bar:4;
>>>>>> #endif
>>>>>> }
>>>>>
>>>>> With u8 you don't need endian check, right? I would assume that with
>>>>> both little and big endian bar and koo would be in the same place.
>>>>
>>>> I think u8 with bitfield would be different between little and big endian
>>>> machines.
>>>
>>> To me that does not make any sense, I have never heard about bit
>>> endianness any of the devices I have worked on.
>>
>> Unfortunately, the order in which these fields are laid out is different
>> between big and little endian, even when only dealing with u8.
> 
> Oh, didn't know that. Can you give some examples about endian problems
> with u8 bitfields? Still not getting it. Not that it matters, just
> curious.
> 
>> That alone is a strong reason to avoid bitfields entirely for anything
>> shared between the host and something else.
> 
> Very good to know, thanks.

Kalle,

By now, I think you understand that not only the byte order is different between 
BE and LE, but the bit order within a byte is different as well. In the normal 
situation where only byte-sized quantities are involved, then there need not be 
any concern. If you need to mask part of the byte, the mask itself will be in 
the correct endianess.

To me, the main advantage of using using bitfield notation is that the compiler 
does the work of generating the masks needed to extract a portion of the byte. I 
consider that to be slightly less likely to have errors that relying on the 
programmer to generate the mask. A secondary benefit is that the bitfield 
notation is self documenting.

Larry

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2018-07-03 15:28 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-05-18  9:29 [PATCH 00/14] rtlwifi: remove duplicate C2H handlers pkshih
2018-05-18  9:29 ` [PATCH 01/14] rtlwifi: support accurate nullfunc frame tx ack report pkshih
2018-05-29  7:18   ` [01/14] " Kalle Valo
2018-05-18  9:29 ` [PATCH 02/14] rtlwifi: remove CONNECTION_MONITOR flag pkshih
2018-05-18  9:29 ` [PATCH 03/14] rtlwifi: remove duplicate rx_packet_type definition pkshih
2018-05-18  9:29 ` [PATCH 04/14] rtlwifi: rename register-based C2H command IDs to V0 pkshih
2018-05-18  9:29 ` [PATCH 05/14] rtlwifi: remove duplicate C2H definition pkshih
2018-05-18  9:29 ` [PATCH 06/14] rtlwifi: remove unused fw C2H command ID pkshih
2018-05-18  9:30 ` [PATCH 07/14] rtlwifi: remove dummy hal_op rx_command_packet from rtl8188ee and rtl8723ae pkshih
2018-05-18  9:30 ` [PATCH 08/14] rtlwifi: Add hal_op c2h_ra_report_handler for special process pkshih
2018-05-18  9:30 ` [PATCH 09/14] rtlwifi: remove duplicate C2H handler pkshih
2018-05-18  9:30 ` [PATCH 10/14] rtlwifi: remove hal_op rx_command_packet pkshih
2018-05-18  9:30 ` [PATCH 11/14] rtlwifi: remove hal_op c2h_content_parsing pkshih
2018-05-18  9:30 ` [PATCH 12/14] rtlwifi: use sk_buff to queue C2H commands pkshih
2018-05-18  9:30 ` [PATCH 13/14] rtlwifi: access skb->data to get C2H data by macro pkshih
2018-05-29  5:18   ` Kalle Valo
2018-05-31  2:13     ` Pkshih
2018-06-29  7:30       ` Kalle Valo
2018-07-03  6:03         ` Pkshih
2018-07-03  6:14           ` Kalle Valo
2018-07-03  8:32             ` Felix Fietkau
2018-07-03 10:57               ` Kalle Valo
2018-07-03 11:01                 ` Felix Fietkau
2018-07-03 15:28                 ` Larry Finger
2018-05-18  9:30 ` [PATCH 14/14] rtlwifi: fix btmpinfo timeout while processing C2H_BT_INFO pkshih

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.