Due to the way that debugging is used in the mac80211 subsystem this message ends up being noisier than it needs to be. As the statement is only useful at a first stage of triage for BIOS bugs, just drop it. Cc: Jun Ma <Jun.Ma2@amd.com> Suggested-by: Kalle Valo <kvalo@kernel.org> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Tested-by: Kalle Valo <kvalo@kernel.org> Link: https://msgid.link/20240117030525.539-1-mario.limonciello@amd.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>
94 lines
2.2 KiB
C
94 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Wifi Band Exclusion Interface for WLAN
|
|
* Copyright (C) 2023 Advanced Micro Devices
|
|
*
|
|
*/
|
|
|
|
#include <linux/acpi_amd_wbrf.h>
|
|
#include <linux/units.h>
|
|
#include <net/cfg80211.h>
|
|
#include "ieee80211_i.h"
|
|
|
|
void ieee80211_check_wbrf_support(struct ieee80211_local *local)
|
|
{
|
|
struct wiphy *wiphy = local->hw.wiphy;
|
|
struct device *dev;
|
|
|
|
if (!wiphy)
|
|
return;
|
|
|
|
dev = wiphy->dev.parent;
|
|
if (!dev)
|
|
return;
|
|
|
|
local->wbrf_supported = acpi_amd_wbrf_supported_producer(dev);
|
|
}
|
|
|
|
static void get_chan_freq_boundary(u32 center_freq, u32 bandwidth, u64 *start, u64 *end)
|
|
{
|
|
bandwidth *= KHZ_PER_MHZ;
|
|
center_freq *= KHZ_PER_MHZ;
|
|
|
|
*start = center_freq - bandwidth / 2;
|
|
*end = center_freq + bandwidth / 2;
|
|
|
|
/* Frequency in Hz is expected */
|
|
*start = *start * HZ_PER_KHZ;
|
|
*end = *end * HZ_PER_KHZ;
|
|
}
|
|
|
|
static void get_ranges_from_chandef(struct cfg80211_chan_def *chandef,
|
|
struct wbrf_ranges_in_out *ranges_in)
|
|
{
|
|
u64 start_freq1, end_freq1;
|
|
u64 start_freq2, end_freq2;
|
|
int bandwidth;
|
|
|
|
bandwidth = nl80211_chan_width_to_mhz(chandef->width);
|
|
|
|
get_chan_freq_boundary(chandef->center_freq1, bandwidth, &start_freq1, &end_freq1);
|
|
|
|
ranges_in->band_list[0].start = start_freq1;
|
|
ranges_in->band_list[0].end = end_freq1;
|
|
ranges_in->num_of_ranges = 1;
|
|
|
|
if (chandef->width == NL80211_CHAN_WIDTH_80P80) {
|
|
get_chan_freq_boundary(chandef->center_freq2, bandwidth, &start_freq2, &end_freq2);
|
|
|
|
ranges_in->band_list[1].start = start_freq2;
|
|
ranges_in->band_list[1].end = end_freq2;
|
|
ranges_in->num_of_ranges++;
|
|
}
|
|
}
|
|
|
|
void ieee80211_add_wbrf(struct ieee80211_local *local, struct cfg80211_chan_def *chandef)
|
|
{
|
|
struct wbrf_ranges_in_out ranges_in = {0};
|
|
struct device *dev;
|
|
|
|
if (!local->wbrf_supported)
|
|
return;
|
|
|
|
dev = local->hw.wiphy->dev.parent;
|
|
|
|
get_ranges_from_chandef(chandef, &ranges_in);
|
|
|
|
acpi_amd_wbrf_add_remove(dev, WBRF_RECORD_ADD, &ranges_in);
|
|
}
|
|
|
|
void ieee80211_remove_wbrf(struct ieee80211_local *local, struct cfg80211_chan_def *chandef)
|
|
{
|
|
struct wbrf_ranges_in_out ranges_in = {0};
|
|
struct device *dev;
|
|
|
|
if (!local->wbrf_supported)
|
|
return;
|
|
|
|
dev = local->hw.wiphy->dev.parent;
|
|
|
|
get_ranges_from_chandef(chandef, &ranges_in);
|
|
|
|
acpi_amd_wbrf_add_remove(dev, WBRF_RECORD_REMOVE, &ranges_in);
|
|
}
|