1 // SPDX-License-Identifier: GPL-2.0
3 * Wifi Band Exclusion Interface for WLAN
4 * Copyright (C) 2023 Advanced Micro Devices
8 #include <linux/acpi_amd_wbrf.h>
9 #include <linux/units.h>
10 #include <net/cfg80211.h>
11 #include "ieee80211_i.h"
13 void ieee80211_check_wbrf_support(struct ieee80211_local
*local
)
15 struct wiphy
*wiphy
= local
->hw
.wiphy
;
21 dev
= wiphy
->dev
.parent
;
25 local
->wbrf_supported
= acpi_amd_wbrf_supported_producer(dev
);
28 static void get_chan_freq_boundary(u32 center_freq
, u32 bandwidth
, u64
*start
, u64
*end
)
30 bandwidth
*= KHZ_PER_MHZ
;
31 center_freq
*= KHZ_PER_MHZ
;
33 *start
= center_freq
- bandwidth
/ 2;
34 *end
= center_freq
+ bandwidth
/ 2;
36 /* Frequency in Hz is expected */
37 *start
= *start
* HZ_PER_KHZ
;
38 *end
= *end
* HZ_PER_KHZ
;
41 static void get_ranges_from_chandef(struct cfg80211_chan_def
*chandef
,
42 struct wbrf_ranges_in_out
*ranges_in
)
44 u64 start_freq1
, end_freq1
;
45 u64 start_freq2
, end_freq2
;
48 bandwidth
= nl80211_chan_width_to_mhz(chandef
->width
);
50 get_chan_freq_boundary(chandef
->center_freq1
, bandwidth
, &start_freq1
, &end_freq1
);
52 ranges_in
->band_list
[0].start
= start_freq1
;
53 ranges_in
->band_list
[0].end
= end_freq1
;
54 ranges_in
->num_of_ranges
= 1;
56 if (chandef
->width
== NL80211_CHAN_WIDTH_80P80
) {
57 get_chan_freq_boundary(chandef
->center_freq2
, bandwidth
, &start_freq2
, &end_freq2
);
59 ranges_in
->band_list
[1].start
= start_freq2
;
60 ranges_in
->band_list
[1].end
= end_freq2
;
61 ranges_in
->num_of_ranges
++;
65 void ieee80211_add_wbrf(struct ieee80211_local
*local
, struct cfg80211_chan_def
*chandef
)
67 struct wbrf_ranges_in_out ranges_in
= {0};
70 if (!local
->wbrf_supported
)
73 dev
= local
->hw
.wiphy
->dev
.parent
;
75 get_ranges_from_chandef(chandef
, &ranges_in
);
77 acpi_amd_wbrf_add_remove(dev
, WBRF_RECORD_ADD
, &ranges_in
);
80 void ieee80211_remove_wbrf(struct ieee80211_local
*local
, struct cfg80211_chan_def
*chandef
)
82 struct wbrf_ranges_in_out ranges_in
= {0};
85 if (!local
->wbrf_supported
)
88 dev
= local
->hw
.wiphy
->dev
.parent
;
90 get_ranges_from_chandef(chandef
, &ranges_in
);
92 acpi_amd_wbrf_add_remove(dev
, WBRF_RECORD_REMOVE
, &ranges_in
);