* [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
@ 2010-06-07 6:58 Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 2/3] mac80211: Add " Bruno Randolf
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Bruno Randolf @ 2010-06-07 6:58 UTC (permalink / raw)
To: linville; +Cc: ath5k-devel, linux-wireless
Allow setting TX and RX antenna configuration via nl80211.
The antenna configuration is defined as a bitmap of allowed antennas to use for
either receiving or transmitting. Separate bitmaps are used for RX and TX to
allow using different antennas for receiving and transmitting. The bitmap is 8
bit, each bit representing one antenna.
If multiple receive antennas are selected, the driver may use diversity or
multiple 802.11 rx chains, according to the chipset capabilities.
If multiple transmit antennas are selected, the driver has to send on all
selected antennas, making this mode of operation only possible on 802.11n
chipsets with multiple tx chains. If the transmit antenna bitmap is set to the
special value zero (0) the driver should select the TX antenna based on the
antenna which was used for receiving (TX antenna follows RX diversity).
Drivers should reject configurations they cannot support.
While covering the standard modes "fixed antenna A", "fixed antenna B",
"diversity" this API allows for a more flexible antenna configuration, as
follows:
Send on antenna 1, receive on antenna 2 (or vice versa):
This can be used to have a low gain antenna for TX in order to keep within the
regulatory constraints and a high gain antenna for RX in order to receive
weaker signals ("speak softly, but listen harder"). This can be useful for
legal long-shot outdoor links. Another usage of this is: Having a low noise
preamp on antenna A and a power amplifier on the other antenna. This way
transmit noise is mostly kept out of the low noise receive channel. (This would
be bitmaps: tx 0b01 rx 0b10).
Another simiar setup would be: Use RX diversity on both antennas, but always
send on antenna A. Again that would allow us to benefit from a higher gain RX
antenna, while staying within the legal limits. (This would be tx 0 rx 0b11).
And finally there can be special experimental setups in research and
development where more than 2 antennas are available. It's good to keep the API
flexible.
Signed-off-by: Bruno Randolf <br1@einfach.org>
---
include/linux/nl80211.h | 22 +++++++++
include/net/cfg80211.h | 3 +
net/wireless/nl80211.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 141 insertions(+), 0 deletions(-)
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index 64fb32b..ace33de 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -341,6 +341,9 @@
* of any other interfaces, and other interfaces will again take
* precedence when they are used.
*
+ * @NL80211_CMD_SET_ANTENNA: Set a bitmap of antennas to use.
+ * @NL80211_CMD_GET_ANTENNA: Get antenna configuration from driver.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
@@ -441,6 +444,9 @@ enum nl80211_commands {
NL80211_CMD_SET_CHANNEL,
+ NL80211_CMD_SET_ANTENNA,
+ NL80211_CMD_GET_ANTENNA,
+
/* add new commands above here */
/* used to define NL80211_CMD_MAX below */
@@ -725,6 +731,19 @@ enum nl80211_commands {
* @NL80211_ATTR_AP_ISOLATE: (AP mode) Do not forward traffic between stations
* connected to this BSS.
*
+ * @NL80211_ATTR_ANTENNA_TX: Bitmap of allowed antennas to use for transmitting.
+ * Each bit represents one antenna, starting with antenna 1 at the first
+ * bit. If the bitmap is zero (0), the TX antenna follows RX diversity.
+ * If multiple antennas are selected all selected antennas have to be used
+ * for transmitting (801.11n multiple tx chains).
+ * Drivers may reject configurations they cannot support.
+ *
+ * @NL80211_ATTR_ANTENNA_RX: Bitmap of allowed antennas to use for receiving.
+ * Each bit represents one antenna, starting with antenna 1 at the first
+ * bit. If multiple antennas are selected in the bitmap, the driver should
+ * use diversity or 802.11n multiple rx chains between these antennas.
+ * Drivers may reject configurations they cannot support.
+ *
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
*/
@@ -882,6 +901,9 @@ enum nl80211_attrs {
NL80211_ATTR_AP_ISOLATE,
+ NL80211_ATTR_ANTENNA_TX,
+ NL80211_ATTR_ANTENNA_RX,
+
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 0c3c214..f65bd6b 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -1177,6 +1177,9 @@ struct cfg80211_ops {
int (*set_cqm_rssi_config)(struct wiphy *wiphy,
struct net_device *dev,
s32 rssi_thold, u32 rssi_hyst);
+
+ int (*set_antenna)(struct wiphy *wiphy, u8 tx_ant, u8 rx_ant);
+ int (*get_antenna)(struct wiphy *wiphy, u8 *tx_ant, u8 *rx_ant);
};
/*
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 90ab3c8..82f2785 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -153,6 +153,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
[NL80211_ATTR_CQM] = { .type = NLA_NESTED, },
[NL80211_ATTR_LOCAL_STATE_CHANGE] = { .type = NLA_FLAG },
[NL80211_ATTR_AP_ISOLATE] = { .type = NLA_U8 },
+ [NL80211_ATTR_ANTENNA_TX] = { .type = NLA_U8 },
+ [NL80211_ATTR_ANTENNA_RX] = { .type = NLA_U8 },
};
/* policy for the attributes */
@@ -590,6 +592,8 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
NLA_PUT_U32(msg, i, NL80211_CMD_SET_WIPHY_NETNS);
}
CMD(set_channel, SET_CHANNEL);
+ CMD(set_antenna, SET_ANTENNA);
+ CMD(get_antenna, GET_ANTENNA);
#undef CMD
@@ -4968,6 +4972,106 @@ out:
return err;
}
+static int nl80211_set_antenna(struct sk_buff *skb, struct genl_info *info)
+{
+ struct cfg80211_registered_device *rdev;
+ int res;
+ u8 rx_ant = 0, tx_ant = 0;
+
+ if (!info->attrs[NL80211_ATTR_WIPHY] ||
+ !info->attrs[NL80211_ATTR_ANTENNA_TX] ||
+ !info->attrs[NL80211_ATTR_ANTENNA_RX]) {
+ return -EINVAL;
+ }
+
+ tx_ant = nla_get_u8(info->attrs[NL80211_ATTR_ANTENNA_TX]);
+ rx_ant = nla_get_u8(info->attrs[NL80211_ATTR_ANTENNA_RX]);
+
+ rtnl_lock();
+
+ rdev = cfg80211_get_dev_from_info(info);
+ if (IS_ERR(rdev)) {
+ res = -ENODEV;
+ goto unlock_rtnl;
+ }
+
+ if (!rdev->ops->set_antenna) {
+ res = -EOPNOTSUPP;
+ goto unlock_rdev;
+ }
+
+ res = rdev->ops->set_antenna(&rdev->wiphy, tx_ant, rx_ant);
+
+ unlock_rdev:
+ cfg80211_unlock_rdev(rdev);
+
+ unlock_rtnl:
+ rtnl_unlock();
+ return res;
+}
+
+static int nl80211_get_antenna(struct sk_buff *skb, struct genl_info *info)
+{
+ struct cfg80211_registered_device *rdev;
+ struct sk_buff *msg;
+ void *hdr;
+ int res;
+ u8 tx_ant, rx_ant;
+
+ if (!info->attrs[NL80211_ATTR_WIPHY])
+ return -EINVAL;
+
+ rtnl_lock();
+
+ rdev = cfg80211_get_dev_from_info(info);
+ if (IS_ERR(rdev)) {
+ res = -ENODEV;
+ goto unlock_rtnl;
+ }
+
+ if (!rdev->ops->get_antenna) {
+ res = -EOPNOTSUPP;
+ goto unlock_rdev;
+ }
+
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+ if (!msg) {
+ res = -ENOMEM;
+ goto unlock_rdev;
+ }
+
+ hdr = nl80211hdr_put(msg, info->snd_pid, info->snd_seq, 0,
+ NL80211_CMD_GET_ANTENNA);
+ if (!hdr) {
+ res = -ENOMEM;
+ goto free_msg;
+ }
+
+ res = rdev->ops->get_antenna(&rdev->wiphy, &tx_ant, &rx_ant);
+ if (res)
+ goto free_msg;
+
+ NLA_PUT_U8(msg, NL80211_ATTR_ANTENNA_TX, tx_ant);
+ NLA_PUT_U8(msg, NL80211_ATTR_ANTENNA_RX, rx_ant);
+
+ genlmsg_end(msg, hdr);
+ res = genlmsg_reply(msg, info);
+ goto unlock_rdev;
+
+ nla_put_failure:
+ res = -ENOBUFS;
+
+ free_msg:
+ nlmsg_free(msg);
+
+ unlock_rdev:
+ cfg80211_unlock_rdev(rdev);
+
+ unlock_rtnl:
+ rtnl_unlock();
+ return res;
+}
+
static struct genl_ops nl80211_ops[] = {
{
.cmd = NL80211_CMD_GET_WIPHY,
@@ -5284,6 +5388,18 @@ static struct genl_ops nl80211_ops[] = {
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
},
+ {
+ .cmd = NL80211_CMD_SET_ANTENNA,
+ .doit = nl80211_set_antenna,
+ .policy = nl80211_policy,
+ .flags = GENL_ADMIN_PERM,
+ },
+ {
+ .cmd = NL80211_CMD_GET_ANTENNA,
+ .doit = nl80211_get_antenna,
+ .policy = nl80211_policy,
+ /* can be retrieved by unprivileged users */
+ },
};
static struct genl_multicast_group nl80211_mlme_mcgrp = {
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/3] mac80211: Add antenna configuration
2010-06-07 6:58 [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration Bruno Randolf
@ 2010-06-07 6:59 ` Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 3/3] ath5k: Add support for " Bruno Randolf
` (2 subsequent siblings)
3 siblings, 0 replies; 9+ messages in thread
From: Bruno Randolf @ 2010-06-07 6:59 UTC (permalink / raw)
To: linville; +Cc: ath5k-devel, linux-wireless
Allow antenna configuration by calling driver's function for it.
Signed-off-by: Bruno Randolf <br1@einfach.org>
---
include/net/mac80211.h | 2 ++
net/mac80211/cfg.c | 16 ++++++++++++++
net/mac80211/driver-ops.h | 23 ++++++++++++++++++++
net/mac80211/driver-trace.h | 50 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index e3c1d47..e0688a9 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1732,6 +1732,8 @@ struct ieee80211_ops {
void (*flush)(struct ieee80211_hw *hw, bool drop);
void (*channel_switch)(struct ieee80211_hw *hw,
struct ieee80211_channel_switch *ch_switch);
+ int (*set_antenna)(struct ieee80211_hw *hw, u8 tx_ant, u8 rx_ant);
+ int (*get_antenna)(struct ieee80211_hw *hw, u8 *tx_ant, u8 *rx_ant);
};
/**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 952845e..2e4d947 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1560,6 +1560,20 @@ static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev,
buf, len, cookie);
}
+static int ieee80211_set_antenna(struct wiphy *wiphy, u8 tx_ant, u8 rx_ant)
+{
+ struct ieee80211_local *local = wiphy_priv(wiphy);
+
+ return drv_set_antenna(local, tx_ant, rx_ant);
+}
+
+static int ieee80211_get_antenna(struct wiphy *wiphy, u8 *tx_ant, u8 *rx_ant)
+{
+ struct ieee80211_local *local = wiphy_priv(wiphy);
+
+ return drv_get_antenna(local, tx_ant, rx_ant);
+}
+
struct cfg80211_ops mac80211_config_ops = {
.add_virtual_intf = ieee80211_add_iface,
.del_virtual_intf = ieee80211_del_iface,
@@ -1611,4 +1625,6 @@ struct cfg80211_ops mac80211_config_ops = {
.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
.action = ieee80211_action,
.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
+ .set_antenna = ieee80211_set_antenna,
+ .get_antenna = ieee80211_get_antenna,
};
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index d1139e4..edb4b4e 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -393,4 +393,27 @@ static inline void drv_channel_switch(struct ieee80211_local *local,
trace_drv_channel_switch(local, ch_switch);
}
+
+static inline int drv_set_antenna(struct ieee80211_local *local,
+ u8 tx_ant, u8 rx_ant)
+{
+ int ret = -EOPNOTSUPP;
+ might_sleep();
+ if (local->ops->set_antenna)
+ ret = local->ops->set_antenna(&local->hw, tx_ant, rx_ant);
+ trace_drv_set_antenna(local, tx_ant, rx_ant, ret);
+ return ret;
+}
+
+static inline int drv_get_antenna(struct ieee80211_local *local,
+ u8 *tx_ant, u8 *rx_ant)
+{
+ int ret = -EOPNOTSUPP;
+ might_sleep();
+ if (local->ops->get_antenna)
+ ret = local->ops->get_antenna(&local->hw, tx_ant, rx_ant);
+ trace_drv_get_antenna(local, *tx_ant, *rx_ant, ret);
+ return ret;
+}
+
#endif /* __MAC80211_DRIVER_OPS */
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h
index 6b90630..31bf664 100644
--- a/net/mac80211/driver-trace.h
+++ b/net/mac80211/driver-trace.h
@@ -827,6 +827,56 @@ TRACE_EVENT(drv_channel_switch,
)
);
+TRACE_EVENT(drv_set_antenna,
+ TP_PROTO(struct ieee80211_local *local, u8 tx_ant, u8 rx_ant, int ret),
+
+ TP_ARGS(local, tx_ant, rx_ant, ret),
+
+ TP_STRUCT__entry(
+ LOCAL_ENTRY
+ __field(u8, tx_ant)
+ __field(u8, rx_ant)
+ __field(int, ret)
+ ),
+
+ TP_fast_assign(
+ LOCAL_ASSIGN;
+ __entry->tx_ant = tx_ant;
+ __entry->rx_ant = rx_ant;
+ __entry->ret = ret;
+ ),
+
+ TP_printk(
+ LOCAL_PR_FMT " tx_ant:%d rx_ant:%d ret:%d",
+ LOCAL_PR_ARG, __entry->tx_ant, __entry->rx_ant, __entry->ret
+ )
+);
+
+TRACE_EVENT(drv_get_antenna,
+ TP_PROTO(struct ieee80211_local *local, u8 tx_ant, u8 rx_ant, int ret),
+
+ TP_ARGS(local, tx_ant, rx_ant, ret),
+
+ TP_STRUCT__entry(
+ LOCAL_ENTRY
+ __field(u8, tx_ant)
+ __field(u8, rx_ant)
+ __field(int, ret)
+ ),
+
+ TP_fast_assign(
+ LOCAL_ASSIGN;
+ __entry->tx_ant = tx_ant;
+ __entry->rx_ant = rx_ant;
+ __entry->ret = ret;
+ ),
+
+ TP_printk(
+ LOCAL_PR_FMT " tx_ant:%d rx_ant:%d ret:%d",
+ LOCAL_PR_ARG, __entry->tx_ant, __entry->rx_ant, __entry->ret
+ )
+);
+
/*
* Tracing for API calls that drivers call.
*/
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 3/3] ath5k: Add support for antenna configuration
2010-06-07 6:58 [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 2/3] mac80211: Add " Bruno Randolf
@ 2010-06-07 6:59 ` Bruno Randolf
2010-06-07 9:03 ` [PATCH v3 1/3] cfg80211: Add nl80211 " Johannes Berg
2010-06-07 9:05 ` Johannes Berg
3 siblings, 0 replies; 9+ messages in thread
From: Bruno Randolf @ 2010-06-07 6:59 UTC (permalink / raw)
To: linville; +Cc: ath5k-devel, linux-wireless
Support setting the antenna configuration via cfg/mac80211. At the moment only
allow the simple pre-defined configurations we already have (fixed antenna A/B
or diversity), but more advanced settings are possible to implement.
Signed-off-by: Bruno Randolf <br1@einfach.org>
---
drivers/net/wireless/ath/ath5k/base.c | 34 +++++++++++++++++++++++++++++++++
1 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 9d37c1a..12ba9a1 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -256,6 +256,8 @@ static void ath5k_sw_scan_start(struct ieee80211_hw *hw);
static void ath5k_sw_scan_complete(struct ieee80211_hw *hw);
static void ath5k_set_coverage_class(struct ieee80211_hw *hw,
u8 coverage_class);
+static int ath5k_set_antenna(struct ieee80211_hw *hw, u8 tx_ant, u8 rx_ant);
+static int ath5k_get_antenna(struct ieee80211_hw *hw, u8 *tx_ant, u8 *rx_ant);
static const struct ieee80211_ops ath5k_hw_ops = {
.tx = ath5k_tx,
@@ -277,6 +279,8 @@ static const struct ieee80211_ops ath5k_hw_ops = {
.sw_scan_start = ath5k_sw_scan_start,
.sw_scan_complete = ath5k_sw_scan_complete,
.set_coverage_class = ath5k_set_coverage_class,
+ .set_antenna = ath5k_set_antenna,
+ .get_antenna = ath5k_get_antenna,
};
/*
@@ -3482,3 +3486,33 @@ static void ath5k_set_coverage_class(struct ieee80211_hw *hw, u8 coverage_class)
ath5k_hw_set_coverage_class(sc->ah, coverage_class);
mutex_unlock(&sc->lock);
}
+
+static int ath5k_set_antenna(struct ieee80211_hw *hw, u8 tx_ant, u8 rx_ant)
+{
+ struct ath5k_softc *sc = hw->priv;
+
+ if (tx_ant == 1 && rx_ant == 1)
+ ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_FIXED_A);
+ else if (tx_ant == 2 && rx_ant == 2)
+ ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_FIXED_B);
+ else if (tx_ant == 0 && rx_ant == 3)
+ ath5k_hw_set_antenna_mode(sc->ah, AR5K_ANTMODE_DEFAULT);
+ else
+ return -EINVAL;
+ return 0;
+}
+
+static int ath5k_get_antenna(struct ieee80211_hw *hw, u8 *tx_ant, u8 *rx_ant)
+{
+ struct ath5k_softc *sc = hw->priv;
+
+ switch (sc->ah->ah_ant_mode) {
+ case AR5K_ANTMODE_FIXED_A:
+ *tx_ant = 1; *rx_ant = 1; break;
+ case AR5K_ANTMODE_FIXED_B:
+ *tx_ant = 2; *rx_ant = 2; break;
+ case AR5K_ANTMODE_DEFAULT:
+ *tx_ant = 0; *rx_ant = 3; break;
+ }
+ return 0;
+}
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-07 6:58 [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 2/3] mac80211: Add " Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 3/3] ath5k: Add support for " Bruno Randolf
@ 2010-06-07 9:03 ` Johannes Berg
2010-06-08 1:19 ` Bruno Randolf
2010-06-07 9:05 ` Johannes Berg
3 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2010-06-07 9:03 UTC (permalink / raw)
To: Bruno Randolf; +Cc: linville, ath5k-devel, linux-wireless
On Mon, 2010-06-07 at 15:58 +0900, Bruno Randolf wrote:
> +static int nl80211_get_antenna(struct sk_buff *skb, struct genl_info *info)
> +{
> + struct cfg80211_registered_device *rdev;
> + struct sk_buff *msg;
> + void *hdr;
> + int res;
> + u8 tx_ant, rx_ant;
You should probably set them both to 0 here,
> + res = rdev->ops->get_antenna(&rdev->wiphy, &tx_ant, &rx_ant);
> + if (res)
> + goto free_msg;
and complain about the driver if they still are after this.
johannes
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-07 6:58 [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration Bruno Randolf
` (2 preceding siblings ...)
2010-06-07 9:03 ` [PATCH v3 1/3] cfg80211: Add nl80211 " Johannes Berg
@ 2010-06-07 9:05 ` Johannes Berg
2010-06-08 1:10 ` Bruno Randolf
3 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2010-06-07 9:05 UTC (permalink / raw)
To: Bruno Randolf; +Cc: linville, ath5k-devel, linux-wireless
On Mon, 2010-06-07 at 15:58 +0900, Bruno Randolf wrote:
> + * @NL80211_CMD_GET_ANTENNA: Get antenna configuration from driver.
Since we already have runtime configuration and capability information
as part of the wiphy information printout, remind me again what was
wrong with adding antenna information there as well rather than having a
separate command to retrieve it?
As far as differentiating that information is concerned, you can easily
implement an iw "get antenna" command by just partially printing the
wiphy information, for example, no?
johannes
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-07 9:05 ` Johannes Berg
@ 2010-06-08 1:10 ` Bruno Randolf
2010-06-08 9:05 ` Johannes Berg
0 siblings, 1 reply; 9+ messages in thread
From: Bruno Randolf @ 2010-06-08 1:10 UTC (permalink / raw)
To: Johannes Berg; +Cc: linville, linux-wireless
On Monday 07 June 2010 18:05:14 you wrote:
> On Mon, 2010-06-07 at 15:58 +0900, Bruno Randolf wrote:
> > + * @NL80211_CMD_GET_ANTENNA: Get antenna configuration from driver.
>
> Since we already have runtime configuration and capability information
> as part of the wiphy information printout, remind me again what was
> wrong with adding antenna information there as well rather than having a
> separate command to retrieve it?
>
> As far as differentiating that information is concerned, you can easily
> implement an iw "get antenna" command by just partially printing the
> wiphy information, for example, no?
i don't particularly care about where the antenna information is printed
exactly, so anything will be fine with me.
but when i look at the wiphy info, it shows mostly capability information,
like the list of supported frequencies, list of bitrates, supported interface
modes, supported commands. the only exception is coverage class, which is the
only runtime configuration as far as i can see. therefore i thought it doesnt
fit there well.
maybe another command for getting runtime configuration like channel(s), fixed
bitrates, essid, bssid, RTS/CTS, fraqmentation, txpower, power management,
antenna settings, etc... would make sense? allthough in this list antenna is
probably the only one which is per phy and not per interface...
i can leave the 'antenna get' command out until this is clarified.
bruno
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-07 9:03 ` [PATCH v3 1/3] cfg80211: Add nl80211 " Johannes Berg
@ 2010-06-08 1:19 ` Bruno Randolf
2010-06-08 7:27 ` Johannes Berg
0 siblings, 1 reply; 9+ messages in thread
From: Bruno Randolf @ 2010-06-08 1:19 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
On Monday 07 June 2010 18:03:28 you wrote:
> On Mon, 2010-06-07 at 15:58 +0900, Bruno Randolf wrote:
> > +static int nl80211_get_antenna(struct sk_buff *skb, struct genl_info
> > *info) +{
> > + struct cfg80211_registered_device *rdev;
> > + struct sk_buff *msg;
> > + void *hdr;
> > + int res;
> > + u8 tx_ant, rx_ant;
>
> You should probably set them both to 0 here,
ok.
> > + res = rdev->ops->get_antenna(&rdev->wiphy, &tx_ant, &rx_ant);
> > + if (res)
> > + goto free_msg;
>
> and complain about the driver if they still are after this.
would that be a WARN_ON?
thanks,
bruno
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-08 1:19 ` Bruno Randolf
@ 2010-06-08 7:27 ` Johannes Berg
0 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2010-06-08 7:27 UTC (permalink / raw)
To: Bruno Randolf; +Cc: linux-wireless
On Tue, 2010-06-08 at 10:19 +0900, Bruno Randolf wrote:
> > > + res = rdev->ops->get_antenna(&rdev->wiphy, &tx_ant, &rx_ant);
> > > + if (res)
> > > + goto free_msg;
> >
> > and complain about the driver if they still are after this.
>
> would that be a WARN_ON?
Yeah I suppose so.
johannes
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration
2010-06-08 1:10 ` Bruno Randolf
@ 2010-06-08 9:05 ` Johannes Berg
0 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2010-06-08 9:05 UTC (permalink / raw)
To: Bruno Randolf; +Cc: linville, linux-wireless
On Tue, 2010-06-08 at 10:10 +0900, Bruno Randolf wrote:
> i don't particularly care about where the antenna information is printed
> exactly, so anything will be fine with me.
>
> but when i look at the wiphy info, it shows mostly capability information,
> like the list of supported frequencies, list of bitrates, supported interface
> modes, supported commands. the only exception is coverage class, which is the
> only runtime configuration as far as i can see. therefore i thought it doesnt
> fit there well.
>
> maybe another command for getting runtime configuration like channel(s), fixed
> bitrates, essid, bssid, RTS/CTS, fraqmentation, txpower, power management,
> antenna settings, etc... would make sense? allthough in this list antenna is
> probably the only one which is per phy and not per interface...
Right so there isn't much runtime stuff in the list now. I don't see
anything inherently bad in adding more though, since userspace can
selectively look at the attributes, and it's not like it's a huge amount
of data?
johannes
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-06-08 9:05 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-07 6:58 [PATCH v3 1/3] cfg80211: Add nl80211 antenna configuration Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 2/3] mac80211: Add " Bruno Randolf
2010-06-07 6:59 ` [PATCH v3 3/3] ath5k: Add support for " Bruno Randolf
2010-06-07 9:03 ` [PATCH v3 1/3] cfg80211: Add nl80211 " Johannes Berg
2010-06-08 1:19 ` Bruno Randolf
2010-06-08 7:27 ` Johannes Berg
2010-06-07 9:05 ` Johannes Berg
2010-06-08 1:10 ` Bruno Randolf
2010-06-08 9:05 ` Johannes Berg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).