Re: [PATCH v2 3/3] mwifiex: add get_antenna support for cfg80211

2016-06-09 Thread Enric Balletbo Serra
2016-06-06 19:02 GMT+02:00 Javier Martinez Canillas :
> From: Shengzhen Li 
>
> Since commit de3bb771f471 ("cfg80211: add more warnings for inconsistent
> ops") the wireless core warns if a driver implements a cfg80211 callback
> but doesn't implements the inverse operation.
>
> The mwifiex driver defines a .set_antenna handler but not a .get_antenna
> so this not only makes the core to print a warning when creating a new
> wiphy but also the antenna isn't reported to user-space apps such as iw.
>
> This patch queries the antenna to the firmware so is properly reported to
> user-space. With this patch, the wireless core does not warn anymore and:
>
> $ iw phy phy0 info | grep Antennas
> Available Antennas: TX 0x3 RX 0x3
> Configured Antennas: TX 0x3 RX 0x3
>
> Signed-off-by: Shengzhen Li 
> Signed-off-by: Amitkumar Karwar 
> [javier: expand the commit message]
> Signed-off-by: Javier Martinez Canillas 
>
> ---
>
>  drivers/net/wireless/marvell/mwifiex/cfg80211.c| 16 +++
>  drivers/net/wireless/marvell/mwifiex/fw.h  |  3 ++
>  drivers/net/wireless/marvell/mwifiex/init.c|  2 +
>  drivers/net/wireless/marvell/mwifiex/main.h|  2 +
>  drivers/net/wireless/marvell/mwifiex/sta_cmd.c | 50 
> +++---
>  drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c | 10 +++--
>  6 files changed, 64 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c 
> b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> index ff3f63ed95e1..ff1eefe5087b 100644
> --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> @@ -1819,6 +1819,21 @@ mwifiex_cfg80211_set_antenna(struct wiphy *wiphy, u32 
> tx_ant, u32 rx_ant)
> HostCmd_ACT_GEN_SET, 0, &ant_cfg, true);
>  }
>
> +static int
> +mwifiex_cfg80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
> +{
> +   struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
> +   struct mwifiex_private *priv = mwifiex_get_priv(adapter,
> +   MWIFIEX_BSS_ROLE_ANY);
> +   mwifiex_send_cmd(priv, HostCmd_CMD_RF_ANTENNA,
> +HostCmd_ACT_GEN_GET, 0, NULL, true);
> +
> +   *tx_ant = priv->tx_ant;
> +   *rx_ant = priv->rx_ant;
> +
> +   return 0;
> +}
> +
>  /* cfg80211 operation handler for stop ap.
>   * Function stops BSS running at uAP interface.
>   */
> @@ -3962,6 +3977,7 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
> .change_beacon = mwifiex_cfg80211_change_beacon,
> .set_cqm_rssi_config = mwifiex_cfg80211_set_cqm_rssi_config,
> .set_antenna = mwifiex_cfg80211_set_antenna,
> +   .get_antenna = mwifiex_cfg80211_get_antenna,
> .del_station = mwifiex_cfg80211_del_station,
> .sched_scan_start = mwifiex_cfg80211_sched_scan_start,
> .sched_scan_stop = mwifiex_cfg80211_sched_scan_stop,
> diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h 
> b/drivers/net/wireless/marvell/mwifiex/fw.h
> index 8e4145abdbfa..cef72343f5b6 100644
> --- a/drivers/net/wireless/marvell/mwifiex/fw.h
> +++ b/drivers/net/wireless/marvell/mwifiex/fw.h
> @@ -462,6 +462,9 @@ enum P2P_MODES {
>  #define HostCmd_ACT_SET_RX  0x0001
>  #define HostCmd_ACT_SET_TX  0x0002
>  #define HostCmd_ACT_SET_BOTH0x0003
> +#define HostCmd_ACT_GET_RX  0x0004
> +#define HostCmd_ACT_GET_TX  0x0008
> +#define HostCmd_ACT_GET_BOTH0x000c
>
>  #define RF_ANTENNA_AUTO 0x
>
> diff --git a/drivers/net/wireless/marvell/mwifiex/init.c 
> b/drivers/net/wireless/marvell/mwifiex/init.c
> index 78c532f0d286..fbaf49056746 100644
> --- a/drivers/net/wireless/marvell/mwifiex/init.c
> +++ b/drivers/net/wireless/marvell/mwifiex/init.c
> @@ -110,6 +110,8 @@ int mwifiex_init_priv(struct mwifiex_private *priv)
> priv->tx_power_level = 0;
> priv->max_tx_power_level = 0;
> priv->min_tx_power_level = 0;
> +   priv->tx_ant = 0;
> +   priv->rx_ant = 0;
> priv->tx_rate = 0;
> priv->rxpd_htinfo = 0;
> priv->rxpd_rate = 0;
> diff --git a/drivers/net/wireless/marvell/mwifiex/main.h 
> b/drivers/net/wireless/marvell/mwifiex/main.h
> index 79c28cfb7780..2ae7ff74e1c6 100644
> --- a/drivers/net/wireless/marvell/mwifiex/main.h
> +++ b/drivers/net/wireless/marvell/mwifiex/main.h
> @@ -533,6 +533,8 @@ struct mwifiex_private {
> u16 tx_power_level;
> u8 max_tx_power_level;
> u8 min_tx_power_level;
> +   u32 tx_ant;
> +   u32 rx_ant;
> u8 tx_rate;
> u8 tx_htinfo;
> u8 rxpd_htinfo;
> diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c 
> b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> index e436574b1698..8c658495bf66 100644
> --- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
> +++ b/drivers/net/wireless/marve

[PATCH v2 3/3] mwifiex: add get_antenna support for cfg80211

2016-06-06 Thread Javier Martinez Canillas
From: Shengzhen Li 

Since commit de3bb771f471 ("cfg80211: add more warnings for inconsistent
ops") the wireless core warns if a driver implements a cfg80211 callback
but doesn't implements the inverse operation.

The mwifiex driver defines a .set_antenna handler but not a .get_antenna
so this not only makes the core to print a warning when creating a new
wiphy but also the antenna isn't reported to user-space apps such as iw.

This patch queries the antenna to the firmware so is properly reported to
user-space. With this patch, the wireless core does not warn anymore and:

$ iw phy phy0 info | grep Antennas
Available Antennas: TX 0x3 RX 0x3
Configured Antennas: TX 0x3 RX 0x3

Signed-off-by: Shengzhen Li 
Signed-off-by: Amitkumar Karwar 
[javier: expand the commit message]
Signed-off-by: Javier Martinez Canillas 

---

 drivers/net/wireless/marvell/mwifiex/cfg80211.c| 16 +++
 drivers/net/wireless/marvell/mwifiex/fw.h  |  3 ++
 drivers/net/wireless/marvell/mwifiex/init.c|  2 +
 drivers/net/wireless/marvell/mwifiex/main.h|  2 +
 drivers/net/wireless/marvell/mwifiex/sta_cmd.c | 50 +++---
 drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c | 10 +++--
 6 files changed, 64 insertions(+), 19 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c 
b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index ff3f63ed95e1..ff1eefe5087b 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -1819,6 +1819,21 @@ mwifiex_cfg80211_set_antenna(struct wiphy *wiphy, u32 
tx_ant, u32 rx_ant)
HostCmd_ACT_GEN_SET, 0, &ant_cfg, true);
 }
 
+static int
+mwifiex_cfg80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
+{
+   struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
+   struct mwifiex_private *priv = mwifiex_get_priv(adapter,
+   MWIFIEX_BSS_ROLE_ANY);
+   mwifiex_send_cmd(priv, HostCmd_CMD_RF_ANTENNA,
+HostCmd_ACT_GEN_GET, 0, NULL, true);
+
+   *tx_ant = priv->tx_ant;
+   *rx_ant = priv->rx_ant;
+
+   return 0;
+}
+
 /* cfg80211 operation handler for stop ap.
  * Function stops BSS running at uAP interface.
  */
@@ -3962,6 +3977,7 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
.change_beacon = mwifiex_cfg80211_change_beacon,
.set_cqm_rssi_config = mwifiex_cfg80211_set_cqm_rssi_config,
.set_antenna = mwifiex_cfg80211_set_antenna,
+   .get_antenna = mwifiex_cfg80211_get_antenna,
.del_station = mwifiex_cfg80211_del_station,
.sched_scan_start = mwifiex_cfg80211_sched_scan_start,
.sched_scan_stop = mwifiex_cfg80211_sched_scan_stop,
diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h 
b/drivers/net/wireless/marvell/mwifiex/fw.h
index 8e4145abdbfa..cef72343f5b6 100644
--- a/drivers/net/wireless/marvell/mwifiex/fw.h
+++ b/drivers/net/wireless/marvell/mwifiex/fw.h
@@ -462,6 +462,9 @@ enum P2P_MODES {
 #define HostCmd_ACT_SET_RX  0x0001
 #define HostCmd_ACT_SET_TX  0x0002
 #define HostCmd_ACT_SET_BOTH0x0003
+#define HostCmd_ACT_GET_RX  0x0004
+#define HostCmd_ACT_GET_TX  0x0008
+#define HostCmd_ACT_GET_BOTH0x000c
 
 #define RF_ANTENNA_AUTO 0x
 
diff --git a/drivers/net/wireless/marvell/mwifiex/init.c 
b/drivers/net/wireless/marvell/mwifiex/init.c
index 78c532f0d286..fbaf49056746 100644
--- a/drivers/net/wireless/marvell/mwifiex/init.c
+++ b/drivers/net/wireless/marvell/mwifiex/init.c
@@ -110,6 +110,8 @@ int mwifiex_init_priv(struct mwifiex_private *priv)
priv->tx_power_level = 0;
priv->max_tx_power_level = 0;
priv->min_tx_power_level = 0;
+   priv->tx_ant = 0;
+   priv->rx_ant = 0;
priv->tx_rate = 0;
priv->rxpd_htinfo = 0;
priv->rxpd_rate = 0;
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h 
b/drivers/net/wireless/marvell/mwifiex/main.h
index 79c28cfb7780..2ae7ff74e1c6 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.h
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
@@ -533,6 +533,8 @@ struct mwifiex_private {
u16 tx_power_level;
u8 max_tx_power_level;
u8 min_tx_power_level;
+   u32 tx_ant;
+   u32 rx_ant;
u8 tx_rate;
u8 tx_htinfo;
u8 rxpd_htinfo;
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c 
b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
index e436574b1698..8c658495bf66 100644
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
@@ -313,23 +313,41 @@ static int mwifiex_cmd_rf_antenna(struct mwifiex_private 
*priv,
 
cmd->command = cpu_to_le16(HostCmd_CMD_RF_ANTENNA);
 
-   if (cmd_action != HostCmd_ACT_GEN_SET)
-   return 0;
-
-   if (priv->adapter->h