wifi: rtlwifi: rtl8192de: Fix endianness issue in RX path
authorBitterblue Smith <rtl8821cerfe2@gmail.com>
Thu, 25 Apr 2024 18:13:12 +0000 (21:13 +0300)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 2 May 2024 02:38:59 +0000 (10:38 +0800)
Structs rx_desc_92d and rx_fwinfo_92d will not work for big endian
systems.

Delete rx_desc_92d because it's big and barely used, and instead use
the get_rx_desc_rxmcs and get_rx_desc_rxht functions, which work on big
endian systems too.

Fix rx_fwinfo_92d by duplicating four of its members in the correct
order.

Tested only with RTL8192DU, which will use the same code.
Tested only on a little endian system.

Cc: stable@vger.kernel.org
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/698463da-5ef1-40c7-b744-fa51ad847caf@gmail.com
drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h

index 30b262c3f6d04d04afdc962d8667a224a5a77755..cbc7b4dbea9ade5f15d2992cb3268b7d79541f79 100644 (file)
@@ -35,7 +35,7 @@ static long _rtl92de_translate_todbm(struct ieee80211_hw *hw,
 
 static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
                                       struct rtl_stats *pstats,
-                                      struct rx_desc_92d *pdesc,
+                                      __le32 *pdesc,
                                       struct rx_fwinfo_92d *p_drvinfo,
                                       bool packet_match_bssid,
                                       bool packet_toself,
@@ -50,8 +50,10 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
        u8 i, max_spatial_stream;
        u32 rssi, total_rssi = 0;
        bool is_cck_rate;
+       u8 rxmcs;
 
-       is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
+       rxmcs = get_rx_desc_rxmcs(pdesc);
+       is_cck_rate = rxmcs <= DESC_RATE11M;
        pstats->packet_matchbssid = packet_match_bssid;
        pstats->packet_toself = packet_toself;
        pstats->packet_beacon = packet_beacon;
@@ -157,8 +159,8 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
                pstats->rx_pwdb_all = pwdb_all;
                pstats->rxpower = rx_pwr_all;
                pstats->recvsignalpower = rx_pwr_all;
-               if (pdesc->rxht && pdesc->rxmcs >= DESC_RATEMCS8 &&
-                   pdesc->rxmcs <= DESC_RATEMCS15)
+               if (get_rx_desc_rxht(pdesc) && rxmcs >= DESC_RATEMCS8 &&
+                   rxmcs <= DESC_RATEMCS15)
                        max_spatial_stream = 2;
                else
                        max_spatial_stream = 1;
@@ -364,7 +366,7 @@ static void _rtl92de_process_phyinfo(struct ieee80211_hw *hw,
 static void _rtl92de_translate_rx_signal_stuff(struct ieee80211_hw *hw,
                                               struct sk_buff *skb,
                                               struct rtl_stats *pstats,
-                                              struct rx_desc_92d *pdesc,
+                                              __le32 *pdesc,
                                               struct rx_fwinfo_92d *p_drvinfo)
 {
        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -440,9 +442,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
        if (phystatus) {
                p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
                                                     stats->rx_bufshift);
-               _rtl92de_translate_rx_signal_stuff(hw,
-                                                  skb, stats,
-                                                  (struct rx_desc_92d *)pdesc,
+               _rtl92de_translate_rx_signal_stuff(hw, skb, stats, pdesc,
                                                   p_drvinfo);
        }
        /*rx_status->qual = stats->signal; */
index f189ee2d9be260993ebf41de193ee75e25e82d0a..2d4887490f00fc28d4ee5b3a3fc6c8b1ba7d4297 100644 (file)
@@ -394,10 +394,17 @@ struct rx_fwinfo_92d {
        u8 csi_target[2];
        u8 sigevm;
        u8 max_ex_pwr;
+#ifdef __LITTLE_ENDIAN
        u8 ex_intf_flag:1;
        u8 sgi_en:1;
        u8 rxsc:2;
        u8 reserve:4;
+#else
+       u8 reserve:4;
+       u8 rxsc:2;
+       u8 sgi_en:1;
+       u8 ex_intf_flag:1;
+#endif
 } __packed;
 
 struct tx_desc_92d {
@@ -502,64 +509,6 @@ struct tx_desc_92d {
        u32 reserve_pass_pcie_mm_limit[4];
 } __packed;
 
-struct rx_desc_92d {
-       u32 length:14;
-       u32 crc32:1;
-       u32 icverror:1;
-       u32 drv_infosize:4;
-       u32 security:3;
-       u32 qos:1;
-       u32 shift:2;
-       u32 phystatus:1;
-       u32 swdec:1;
-       u32 lastseg:1;
-       u32 firstseg:1;
-       u32 eor:1;
-       u32 own:1;
-
-       u32 macid:5;
-       u32 tid:4;
-       u32 hwrsvd:5;
-       u32 paggr:1;
-       u32 faggr:1;
-       u32 a1_fit:4;
-       u32 a2_fit:4;
-       u32 pam:1;
-       u32 pwr:1;
-       u32 moredata:1;
-       u32 morefrag:1;
-       u32 type:2;
-       u32 mc:1;
-       u32 bc:1;
-
-       u32 seq:12;
-       u32 frag:4;
-       u32 nextpktlen:14;
-       u32 nextind:1;
-       u32 rsvd:1;
-
-       u32 rxmcs:6;
-       u32 rxht:1;
-       u32 amsdu:1;
-       u32 splcp:1;
-       u32 bandwidth:1;
-       u32 htc:1;
-       u32 tcpchk_rpt:1;
-       u32 ipcchk_rpt:1;
-       u32 tcpchk_valid:1;
-       u32 hwpcerr:1;
-       u32 hwpcind:1;
-       u32 iv0:16;
-
-       u32 iv1;
-
-       u32 tsfl;
-
-       u32 bufferaddress;
-       u32 bufferaddress64;
-
-} __packed;
-
 void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
                          struct ieee80211_hdr *hdr, u8 *pdesc,
                          u8 *pbd_desc_tx, struct ieee80211_tx_info *info,