blob: 1d915e18bf2bfac00a651f6ab703440300715ec8 [file] [log] [blame]
From ecfbe0e44f98de44dc7a1e3d8566cf9eb9987458 Mon Sep 17 00:00:00 2001
From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
Date: Thu, 13 Jun 2024 16:48:00 +0800
Subject: [PATCH 12/13] iw: add per-radio antenna config
Add per-radio antenna config & info dump
Currently, there is no radio index or supported band bitmap in wiphy data struct
& NL80211 ATTRS.
Therefore, we just use NL80211_BANDS_XX to specify the radio we desire
to config.
Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
---
info.c | 49 +++++++++++++++++++++++++++++++++++++++++--------
phy.c | 50 ++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 81 insertions(+), 18 deletions(-)
diff --git a/info.c b/info.c
index c5e863f..ddfef67 100644
--- a/info.c
+++ b/info.c
@@ -335,6 +335,14 @@ static int print_phy_handler(struct nl_msg *msg, void *arg)
static int last_band = -1;
static bool band_had_freq = false;
bool print_name = true;
+ static const char * const bands[] = {
+ [NL80211_BAND_2GHZ] = "2G",
+ [NL80211_BAND_5GHZ] = "5G",
+ [NL80211_BAND_60GHZ] = "60G",
+ [NL80211_BAND_6GHZ] = "6G",
+ [NL80211_BAND_S1GHZ] = "S1G",
+ [NL80211_BAND_LC] = "LC",
+ };
nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
genlmsg_attrlen(gnlh, 0), NULL);
@@ -540,16 +548,41 @@ next:
}
if (tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX] &&
- tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX])
- printf("\tAvailable Antennas: TX %#x RX %#x\n",
- nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX]),
- nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX]));
+ tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX]) {
+ int i, tx_num, rx_num;
+ __u32 *avail_ants_tx, *avail_ants_rx;
+
+ tx_num = nla_len(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX]) / sizeof(__u32);
+ rx_num = nla_len(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX]) / sizeof(__u32);
+ if (tx_num == rx_num && tx_num == NUM_NL80211_BANDS) {
+ avail_ants_tx = nla_data(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX]);
+ avail_ants_rx = nla_data(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX]);
+ printf("\tAvailable Antennas:\n");
+ for (i = 0; i < tx_num; i++)
+ if (avail_ants_tx[i] && avail_ants_rx[i])
+ printf("\t\t%s band: TX %#x RX %#x\n",
+ bands[i], avail_ants_tx[i],
+ avail_ants_rx[i]);
+ }
+ }
if (tb_msg[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
- tb_msg[NL80211_ATTR_WIPHY_ANTENNA_RX])
- printf("\tConfigured Antennas: TX %#x RX %#x\n",
- nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_TX]),
- nla_get_u32(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_RX]));
+ tb_msg[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
+ int i, tx_num, rx_num;
+ __u32 *ants_tx, *ants_rx;
+
+ tx_num = nla_len(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_TX]) / sizeof(__u32);
+ rx_num = nla_len(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_RX]) / sizeof(__u32);
+ if (tx_num == rx_num && tx_num == NUM_NL80211_BANDS) {
+ ants_tx = nla_data(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_TX]);
+ ants_rx = nla_data(tb_msg[NL80211_ATTR_WIPHY_ANTENNA_RX]);
+ printf("\tConfigured Antennas:\n");
+ for (i = 0; i < tx_num; i++)
+ if (ants_tx[i] && ants_rx[i])
+ printf("\t\t%s band: TX %#x RX %#x\n",
+ bands[i], ants_tx[i], ants_rx[i]);
+ }
+ }
if (tb_msg[NL80211_ATTR_SUPPORTED_IFTYPES])
print_iftype_list("\tSupported interface modes", "\t\t",
diff --git a/phy.c b/phy.c
index f9a5b0f..594fb25 100644
--- a/phy.c
+++ b/phy.c
@@ -752,34 +752,64 @@ static int handle_antenna(struct nl80211_state *state,
{
char *end;
uint32_t tx_ant = 0, rx_ant = 0;
+ uint32_t tx_ants[NUM_NL80211_BANDS], rx_ants[NUM_NL80211_BANDS];
+ int i = 0, bands = 0xffffffff;
+
+ if (!strncmp(argv[0], "-b", 2)) {
+ bands = 0;
+ for (i = 1; i < argc; i++) {
+ if (!strncasecmp("2ghz", argv[i], 4))
+ bands |= BIT(NL80211_BAND_2GHZ);
+ else if (!strncasecmp("5ghz", argv[i], 4))
+ bands |= BIT(NL80211_BAND_5GHZ);
+ else if (!strncasecmp("6ghz", argv[i], 4))
+ bands |= BIT(NL80211_BAND_6GHZ);
+ else
+ break;
+ }
+
+ if (i == 1) {
+ printf("Missing configured bands argument.\n");
+ return 2;
+ }
+ }
- if (argc == 1 && strcmp(argv[0], "all") == 0) {
+ if (argc == 1 + i && strncmp(argv[i], "all", 3) == 0) {
tx_ant = 0xffffffff;
rx_ant = 0xffffffff;
- } else if (argc == 1) {
- tx_ant = rx_ant = strtoul(argv[0], &end, 0);
+ } else if (argc == 1 + i) {
+ tx_ant = rx_ant = strtoul(argv[i], &end, 0);
if (*end)
return 1;
- }
- else if (argc == 2) {
- tx_ant = strtoul(argv[0], &end, 0);
+ } else if (argc == 2 + i) {
+ tx_ant = strtoul(argv[i], &end, 0);
if (*end)
return 1;
- rx_ant = strtoul(argv[1], &end, 0);
+ rx_ant = strtoul(argv[i + 1], &end, 0);
if (*end)
return 1;
} else
return 1;
- NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_TX, tx_ant);
- NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_ANTENNA_RX, rx_ant);
+ memset(tx_ants, 0, sizeof(tx_ants));
+ memset(rx_ants, 0, sizeof(rx_ants));
+ for (i = 0; i < NUM_NL80211_BANDS; i++) {
+ if (!(bands & BIT(i)))
+ continue;
+
+ tx_ants[i] = tx_ant;
+ rx_ants[i] = rx_ant;
+ }
+
+ NLA_PUT(msg, NL80211_ATTR_WIPHY_ANTENNA_TX, sizeof(tx_ants), tx_ants);
+ NLA_PUT(msg, NL80211_ATTR_WIPHY_ANTENNA_RX, sizeof(rx_ants), rx_ants);
return 0;
nla_put_failure:
return -ENOBUFS;
}
-COMMAND(set, antenna, "<bitmap> | all | <tx bitmap> <rx bitmap>",
+COMMAND(set, antenna, "[-b [2GHz] [5GHz] [6GHz]] <bitmap> | all | <tx bitmap> <rx bitmap>",
NL80211_CMD_SET_WIPHY, 0, CIB_PHY, handle_antenna,
"Set a bitmap of allowed antennas to use for TX and RX.\n"
"The driver may reject antenna configurations it cannot support.");
--
2.18.0