mirror of
https://github.com/shenmintao/aic8800d80.git
synced 2026-09-26 17:44:16 +00:00
fix: select cfg80211 callbacks by API type
This commit is contained in:
@@ -4553,15 +4553,50 @@ void rwnx_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
|
|||||||
* have changed. The actual parameter values are available in
|
* have changed. The actual parameter values are available in
|
||||||
* struct wiphy. If returning an error, no value should be changed.
|
* struct wiphy. If returning an error, no value should be changed.
|
||||||
*/
|
*/
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0)
|
typedef int (*rwnx_set_wiphy_params_legacy_t)(struct wiphy *wiphy,
|
||||||
static int rwnx_cfg80211_set_wiphy_params(struct wiphy *wiphy, int radio_idx, u32 changed)
|
u32 changed);
|
||||||
#else
|
typedef int (*rwnx_set_wiphy_params_radio_t)(struct wiphy *wiphy,
|
||||||
static int rwnx_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
|
int radio_idx, u32 changed);
|
||||||
#endif
|
|
||||||
|
#define RWNX_CFG80211_OP_TYPE(_member) \
|
||||||
|
typeof(((struct cfg80211_ops *)0)->_member)
|
||||||
|
#define RWNX_CFG80211_OP_MATCH(_member, _type) \
|
||||||
|
__builtin_types_compatible_p(RWNX_CFG80211_OP_TYPE(_member), _type)
|
||||||
|
|
||||||
|
typedef char rwnx_set_wiphy_params_signature_must_be_supported[
|
||||||
|
(RWNX_CFG80211_OP_MATCH(set_wiphy_params,
|
||||||
|
rwnx_set_wiphy_params_legacy_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_wiphy_params,
|
||||||
|
rwnx_set_wiphy_params_radio_t)) ? 1 : -1];
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_wiphy_params_common(struct wiphy *wiphy,
|
||||||
|
u32 changed)
|
||||||
{
|
{
|
||||||
|
(void)wiphy;
|
||||||
|
(void)changed;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_wiphy_params_legacy(struct wiphy *wiphy,
|
||||||
|
u32 changed)
|
||||||
|
{
|
||||||
|
return rwnx_cfg80211_set_wiphy_params_common(wiphy, changed);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_wiphy_params_radio(struct wiphy *wiphy,
|
||||||
|
int radio_idx, u32 changed)
|
||||||
|
{
|
||||||
|
(void)radio_idx;
|
||||||
|
return rwnx_cfg80211_set_wiphy_params_common(wiphy, changed);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RWNX_CFG80211_SET_WIPHY_PARAMS_CB \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_wiphy_params, \
|
||||||
|
rwnx_set_wiphy_params_radio_t), \
|
||||||
|
rwnx_cfg80211_set_wiphy_params_radio, \
|
||||||
|
rwnx_cfg80211_set_wiphy_params_legacy)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @set_tx_power: set the transmit power according to the parameters,
|
* @set_tx_power: set the transmit power according to the parameters,
|
||||||
@@ -4570,18 +4605,25 @@ static int rwnx_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
|
|||||||
* always be %NULL unless the driver supports per-vif TX power
|
* always be %NULL unless the driver supports per-vif TX power
|
||||||
* (as advertised by the nl80211 feature flag.)
|
* (as advertised by the nl80211 feature flag.)
|
||||||
*/
|
*/
|
||||||
static int rwnx_cfg80211_set_tx_power(struct wiphy *wiphy,
|
typedef int (*rwnx_set_tx_power_no_wdev_t)(
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
struct wiphy *wiphy, enum nl80211_tx_power_setting type, int mbm);
|
||||||
struct wireless_dev *wdev,
|
typedef int (*rwnx_set_tx_power_wdev_t)(
|
||||||
#endif
|
struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0)
|
enum nl80211_tx_power_setting type, int mbm);
|
||||||
int radio_idx,
|
typedef int (*rwnx_set_tx_power_radio_t)(
|
||||||
#endif
|
struct wiphy *wiphy, struct wireless_dev *wdev, int radio_idx,
|
||||||
enum nl80211_tx_power_setting type, int mbm)
|
enum nl80211_tx_power_setting type, int mbm);
|
||||||
|
|
||||||
|
typedef char rwnx_set_tx_power_signature_must_be_supported[
|
||||||
|
(RWNX_CFG80211_OP_MATCH(set_tx_power, rwnx_set_tx_power_no_wdev_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_tx_power, rwnx_set_tx_power_wdev_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_tx_power,
|
||||||
|
rwnx_set_tx_power_radio_t)) ? 1 : -1];
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_tx_power_common(
|
||||||
|
struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||||
|
enum nl80211_tx_power_setting type, int mbm)
|
||||||
{
|
{
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
|
||||||
struct wireless_dev *wdev = NULL;
|
|
||||||
#endif
|
|
||||||
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
|
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
|
||||||
struct rwnx_vif *vif;
|
struct rwnx_vif *vif;
|
||||||
s8 pwr;
|
s8 pwr;
|
||||||
@@ -4607,31 +4649,112 @@ int radio_idx,
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rwnx_cfg80211_get_tx_power(struct wiphy *wiphy,
|
static int rwnx_cfg80211_set_tx_power_no_wdev(
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
struct wiphy *wiphy, enum nl80211_tx_power_setting type, int mbm)
|
||||||
struct wireless_dev *wdev,
|
|
||||||
#endif
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0)
|
|
||||||
int radio_idx,
|
|
||||||
#endif
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 14, 0)
|
|
||||||
unsigned int link_id,
|
|
||||||
#endif
|
|
||||||
int *mbm)
|
|
||||||
{
|
{
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0)
|
return rwnx_cfg80211_set_tx_power_common(wiphy, NULL, type, mbm);
|
||||||
struct wireless_dev *wdev = NULL;
|
|
||||||
#endif
|
|
||||||
//struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
|
|
||||||
//struct rwnx_vif *vif;
|
|
||||||
s8 pwr = 0;
|
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
*mbm = get_txpwr_max(pwr);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_tx_power_wdev(
|
||||||
|
struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||||
|
enum nl80211_tx_power_setting type, int mbm)
|
||||||
|
{
|
||||||
|
return rwnx_cfg80211_set_tx_power_common(wiphy, wdev, type, mbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_set_tx_power_radio(
|
||||||
|
struct wiphy *wiphy, struct wireless_dev *wdev, int radio_idx,
|
||||||
|
enum nl80211_tx_power_setting type, int mbm)
|
||||||
|
{
|
||||||
|
(void)radio_idx;
|
||||||
|
return rwnx_cfg80211_set_tx_power_common(wiphy, wdev, type, mbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RWNX_CFG80211_SET_TX_POWER_CB \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_tx_power, rwnx_set_tx_power_radio_t), \
|
||||||
|
rwnx_cfg80211_set_tx_power_radio, \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(set_tx_power, rwnx_set_tx_power_wdev_t), \
|
||||||
|
rwnx_cfg80211_set_tx_power_wdev, \
|
||||||
|
rwnx_cfg80211_set_tx_power_no_wdev))
|
||||||
|
|
||||||
|
typedef int (*rwnx_get_tx_power_no_wdev_t)(struct wiphy *wiphy, int *dbm);
|
||||||
|
typedef int (*rwnx_get_tx_power_wdev_t)(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev, int *dbm);
|
||||||
|
typedef int (*rwnx_get_tx_power_link_t)(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
unsigned int link_id, int *dbm);
|
||||||
|
typedef int (*rwnx_get_tx_power_radio_link_t)(
|
||||||
|
struct wiphy *wiphy, struct wireless_dev *wdev, int radio_idx,
|
||||||
|
unsigned int link_id, int *dbm);
|
||||||
|
|
||||||
|
typedef char rwnx_get_tx_power_signature_must_be_supported[
|
||||||
|
(RWNX_CFG80211_OP_MATCH(get_tx_power, rwnx_get_tx_power_no_wdev_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power, rwnx_get_tx_power_wdev_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power, rwnx_get_tx_power_link_t) ||
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power,
|
||||||
|
rwnx_get_tx_power_radio_link_t)) ? 1 : -1];
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_get_tx_power_common(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
int *dbm)
|
||||||
|
{
|
||||||
|
s8 pwr = 0;
|
||||||
|
|
||||||
|
(void)wiphy;
|
||||||
|
(void)wdev;
|
||||||
|
if (!dbm)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
*dbm = get_txpwr_max(pwr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_get_tx_power_no_wdev(struct wiphy *wiphy, int *dbm)
|
||||||
|
{
|
||||||
|
return rwnx_cfg80211_get_tx_power_common(wiphy, NULL, dbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_get_tx_power_wdev(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
int *dbm)
|
||||||
|
{
|
||||||
|
return rwnx_cfg80211_get_tx_power_common(wiphy, wdev, dbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_get_tx_power_link(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
unsigned int link_id, int *dbm)
|
||||||
|
{
|
||||||
|
(void)link_id;
|
||||||
|
return rwnx_cfg80211_get_tx_power_common(wiphy, wdev, dbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rwnx_cfg80211_get_tx_power_radio_link(
|
||||||
|
struct wiphy *wiphy, struct wireless_dev *wdev, int radio_idx,
|
||||||
|
unsigned int link_id, int *dbm)
|
||||||
|
{
|
||||||
|
(void)radio_idx;
|
||||||
|
(void)link_id;
|
||||||
|
return rwnx_cfg80211_get_tx_power_common(wiphy, wdev, dbm);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define RWNX_CFG80211_GET_TX_POWER_CB \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power, \
|
||||||
|
rwnx_get_tx_power_radio_link_t), \
|
||||||
|
rwnx_cfg80211_get_tx_power_radio_link, \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power, \
|
||||||
|
rwnx_get_tx_power_link_t), \
|
||||||
|
rwnx_cfg80211_get_tx_power_link, \
|
||||||
|
__builtin_choose_expr( \
|
||||||
|
RWNX_CFG80211_OP_MATCH(get_tx_power, \
|
||||||
|
rwnx_get_tx_power_wdev_t), \
|
||||||
|
rwnx_cfg80211_get_tx_power_wdev, \
|
||||||
|
rwnx_cfg80211_get_tx_power_no_wdev)))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @set_power_mgmt: set the power save to one of those two modes:
|
* @set_power_mgmt: set the power save to one of those two modes:
|
||||||
* Power-save off
|
* Power-save off
|
||||||
@@ -6544,10 +6667,10 @@ static struct cfg80211_ops rwnx_cfg80211_ops = {
|
|||||||
.set_monitor_channel = rwnx_cfg80211_set_monitor_channel,
|
.set_monitor_channel = rwnx_cfg80211_set_monitor_channel,
|
||||||
.probe_client = rwnx_cfg80211_probe_client,
|
.probe_client = rwnx_cfg80211_probe_client,
|
||||||
// .mgmt_frame_register = rwnx_cfg80211_mgmt_frame_register,
|
// .mgmt_frame_register = rwnx_cfg80211_mgmt_frame_register,
|
||||||
.set_wiphy_params = rwnx_cfg80211_set_wiphy_params,
|
.set_wiphy_params = RWNX_CFG80211_SET_WIPHY_PARAMS_CB,
|
||||||
.set_txq_params = rwnx_cfg80211_set_txq_params,
|
.set_txq_params = rwnx_cfg80211_set_txq_params,
|
||||||
.set_tx_power = rwnx_cfg80211_set_tx_power,
|
.set_tx_power = RWNX_CFG80211_SET_TX_POWER_CB,
|
||||||
.get_tx_power = rwnx_cfg80211_get_tx_power,
|
.get_tx_power = RWNX_CFG80211_GET_TX_POWER_CB,
|
||||||
.set_power_mgmt = rwnx_cfg80211_set_power_mgmt,
|
.set_power_mgmt = rwnx_cfg80211_set_power_mgmt,
|
||||||
.get_station = rwnx_cfg80211_get_station,
|
.get_station = rwnx_cfg80211_get_station,
|
||||||
.remain_on_channel = rwnx_cfg80211_remain_on_channel,
|
.remain_on_channel = rwnx_cfg80211_remain_on_channel,
|
||||||
|
|||||||
Reference in New Issue
Block a user