]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: sar: tweak 6GHz SAR subbands span
authorKuan-Chung Chen <damon.chen@realtek.com>
Mon, 11 Nov 2024 06:51:30 +0000 (14:51 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Mon, 18 Nov 2024 02:10:08 +0000 (10:10 +0800)
Given that the 6GHz subband edges are not aligned, specific frequencies
can span two adjacent subbands. We considered the need for this
functionality outside of SAR and moved it to a common function.

No logic change for existing chips.

Signed-off-by: Kuan-Chung Chen <damon.chen@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241111065132.19587-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/sar.c

index e5b2968c1431f2909751a293bd803830e7202f37..f73704fc5f85e20f960350d4b305cffa6888a033 100644 (file)
@@ -203,6 +203,53 @@ static const struct ieee80211_iface_combination rtw89_iface_combs[] = {
        },
 };
 
+#define RTW89_6GHZ_SPAN_HEAD 6145
+#define RTW89_6GHZ_SPAN_IDX(center_freq) \
+       ((((int)(center_freq) - RTW89_6GHZ_SPAN_HEAD) / 5) / 2)
+
+#define RTW89_DECL_6GHZ_SPAN(center_freq, subband_l, subband_h) \
+       [RTW89_6GHZ_SPAN_IDX(center_freq)] = { \
+               .sar_subband_low = RTW89_SAR_6GHZ_ ## subband_l, \
+               .sar_subband_high = RTW89_SAR_6GHZ_ ## subband_h, \
+       }
+
+/* Since 6GHz subbands are not edge aligned, some cases span two subbands.
+ * In the following, we describe each of them with rtw89_6ghz_span.
+ */
+static const struct rtw89_6ghz_span rtw89_overlapping_6ghz[] = {
+       RTW89_DECL_6GHZ_SPAN(6145, SUBBAND_5_L, SUBBAND_5_H),
+       RTW89_DECL_6GHZ_SPAN(6165, SUBBAND_5_L, SUBBAND_5_H),
+       RTW89_DECL_6GHZ_SPAN(6185, SUBBAND_5_L, SUBBAND_5_H),
+       RTW89_DECL_6GHZ_SPAN(6505, SUBBAND_6, SUBBAND_7_L),
+       RTW89_DECL_6GHZ_SPAN(6525, SUBBAND_6, SUBBAND_7_L),
+       RTW89_DECL_6GHZ_SPAN(6545, SUBBAND_6, SUBBAND_7_L),
+       RTW89_DECL_6GHZ_SPAN(6665, SUBBAND_7_L, SUBBAND_7_H),
+       RTW89_DECL_6GHZ_SPAN(6705, SUBBAND_7_L, SUBBAND_7_H),
+       RTW89_DECL_6GHZ_SPAN(6825, SUBBAND_7_H, SUBBAND_8),
+       RTW89_DECL_6GHZ_SPAN(6865, SUBBAND_7_H, SUBBAND_8),
+       RTW89_DECL_6GHZ_SPAN(6875, SUBBAND_7_H, SUBBAND_8),
+       RTW89_DECL_6GHZ_SPAN(6885, SUBBAND_7_H, SUBBAND_8),
+};
+
+const struct rtw89_6ghz_span *
+rtw89_get_6ghz_span(struct rtw89_dev *rtwdev, u32 center_freq)
+{
+       int idx;
+
+       if (center_freq >= RTW89_6GHZ_SPAN_HEAD) {
+               idx = RTW89_6GHZ_SPAN_IDX(center_freq);
+               /* To decrease size of rtw89_overlapping_6ghz[],
+                * RTW89_6GHZ_SPAN_IDX() truncates the leading NULLs
+                * to make first span as index 0 of the table. So, if center
+                * frequency is less than the first one, it will get netative.
+                */
+               if (idx >= 0 && idx < ARRAY_SIZE(rtw89_overlapping_6ghz))
+                       return &rtw89_overlapping_6ghz[idx];
+       }
+
+       return NULL;
+}
+
 bool rtw89_ra_report_to_bitrate(struct rtw89_dev *rtwdev, u8 rpt_rate, u16 *bitrate)
 {
        struct ieee80211_rate rate;
index 5ad32eacd0d50cca560c0ab254e464a320c83fc8..f76c05513d3c40c793e68232f79d6ce6bb357149 100644 (file)
@@ -4597,6 +4597,13 @@ struct rtw89_sar_info {
        };
 };
 
+struct rtw89_6ghz_span {
+       enum rtw89_sar_subband sar_subband_low;
+       enum rtw89_sar_subband sar_subband_high;
+};
+
+#define RTW89_SAR_SPAN_VALID(span) ((span)->sar_subband_high)
+
 enum rtw89_tas_state {
        RTW89_TAS_STATE_DPR_OFF,
        RTW89_TAS_STATE_DPR_ON,
@@ -6908,6 +6915,8 @@ struct rtw89_sta_link *rtw89_sta_set_link(struct rtw89_sta *rtwsta,
                                          unsigned int link_id);
 void rtw89_sta_unset_link(struct rtw89_sta *rtwsta, unsigned int link_id);
 void rtw89_core_set_chip_txpwr(struct rtw89_dev *rtwdev);
+const struct rtw89_6ghz_span *
+rtw89_get_6ghz_span(struct rtw89_dev *rtwdev, u32 center_freq);
 void rtw89_get_default_chandef(struct cfg80211_chan_def *chandef);
 void rtw89_get_channel_params(const struct cfg80211_chan_def *chandef,
                              struct rtw89_chan *chan);
index bcc287771b2a35c84bb62b7a41f8ef52aeeca471..871f45a6508caf260610cf4629dd44e28001c444 100644 (file)
@@ -42,7 +42,7 @@ static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
 
        /* freq 6875 (ch 185, 20MHz) spans RTW89_SAR_6GHZ_SUBBAND_7_H
         * and RTW89_SAR_6GHZ_SUBBAND_8, so directly describe it with
-        * struct rtw89_sar_span in the following.
+        * struct rtw89_6ghz_span.
         */
 
        case 6895 ... 7115:
@@ -50,63 +50,18 @@ static enum rtw89_sar_subband rtw89_sar_get_subband(struct rtw89_dev *rtwdev,
        }
 }
 
-struct rtw89_sar_span {
-       enum rtw89_sar_subband subband_low;
-       enum rtw89_sar_subband subband_high;
-};
-
-#define RTW89_SAR_SPAN_VALID(span) ((span)->subband_high)
-
-#define RTW89_SAR_6GHZ_SPAN_HEAD 6145
-#define RTW89_SAR_6GHZ_SPAN_IDX(center_freq) \
-       ((((int)(center_freq) - RTW89_SAR_6GHZ_SPAN_HEAD) / 5) / 2)
-
-#define RTW89_DECL_SAR_6GHZ_SPAN(center_freq, subband_l, subband_h) \
-       [RTW89_SAR_6GHZ_SPAN_IDX(center_freq)] = { \
-               .subband_low = RTW89_SAR_6GHZ_ ## subband_l, \
-               .subband_high = RTW89_SAR_6GHZ_ ## subband_h, \
-       }
-
-/* Since 6GHz SAR subbands are not edge aligned, some cases span two SAR
- * subbands. In the following, we describe each of them with rtw89_sar_span.
- */
-static const struct rtw89_sar_span rtw89_sar_overlapping_6ghz[] = {
-       RTW89_DECL_SAR_6GHZ_SPAN(6145, SUBBAND_5_L, SUBBAND_5_H),
-       RTW89_DECL_SAR_6GHZ_SPAN(6165, SUBBAND_5_L, SUBBAND_5_H),
-       RTW89_DECL_SAR_6GHZ_SPAN(6185, SUBBAND_5_L, SUBBAND_5_H),
-       RTW89_DECL_SAR_6GHZ_SPAN(6505, SUBBAND_6, SUBBAND_7_L),
-       RTW89_DECL_SAR_6GHZ_SPAN(6525, SUBBAND_6, SUBBAND_7_L),
-       RTW89_DECL_SAR_6GHZ_SPAN(6545, SUBBAND_6, SUBBAND_7_L),
-       RTW89_DECL_SAR_6GHZ_SPAN(6665, SUBBAND_7_L, SUBBAND_7_H),
-       RTW89_DECL_SAR_6GHZ_SPAN(6705, SUBBAND_7_L, SUBBAND_7_H),
-       RTW89_DECL_SAR_6GHZ_SPAN(6825, SUBBAND_7_H, SUBBAND_8),
-       RTW89_DECL_SAR_6GHZ_SPAN(6865, SUBBAND_7_H, SUBBAND_8),
-       RTW89_DECL_SAR_6GHZ_SPAN(6875, SUBBAND_7_H, SUBBAND_8),
-       RTW89_DECL_SAR_6GHZ_SPAN(6885, SUBBAND_7_H, SUBBAND_8),
-};
-
 static int rtw89_query_sar_config_common(struct rtw89_dev *rtwdev,
                                         u32 center_freq, s32 *cfg)
 {
        struct rtw89_sar_cfg_common *rtwsar = &rtwdev->sar.cfg_common;
-       const struct rtw89_sar_span *span = NULL;
        enum rtw89_sar_subband subband_l, subband_h;
-       int idx;
-
-       if (center_freq >= RTW89_SAR_6GHZ_SPAN_HEAD) {
-               idx = RTW89_SAR_6GHZ_SPAN_IDX(center_freq);
-               /* To decrease size of rtw89_sar_overlapping_6ghz[],
-                * RTW89_SAR_6GHZ_SPAN_IDX() truncates the leading NULLs
-                * to make first span as index 0 of the table. So, if center
-                * frequency is less than the first one, it will get netative.
-                */
-               if (idx >= 0 && idx < ARRAY_SIZE(rtw89_sar_overlapping_6ghz))
-                       span = &rtw89_sar_overlapping_6ghz[idx];
-       }
+       const struct rtw89_6ghz_span *span;
+
+       span = rtw89_get_6ghz_span(rtwdev, center_freq);
 
        if (span && RTW89_SAR_SPAN_VALID(span)) {
-               subband_l = span->subband_low;
-               subband_h = span->subband_high;
+               subband_l = span->sar_subband_low;
+               subband_h = span->sar_subband_high;
        } else {
                subband_l = rtw89_sar_get_subband(rtwdev, center_freq);
                subband_h = subband_l;