* [PATCH 1/2] ath10k: Fix spelling mistake in comments. @ 2014-05-07 21:50 greearb 2014-05-07 21:50 ` [PATCH 2/2] ath10k: support get/set antenna configurations greearb 2014-05-16 13:47 ` [PATCH 1/2] ath10k: Fix spelling mistake in comments Kalle Valo 0 siblings, 2 replies; 4+ messages in thread From: greearb @ 2014-05-07 21:50 UTC (permalink / raw) To: ath10k; +Cc: Ben Greear, linux-wireless From: Ben Greear <greearb@candelatech.com> Simple typo fix. Signed-off-by: Ben Greear <greearb@candelatech.com> --- drivers/net/wireless/ath/ath10k/wmi.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h index fa31b23..71a4470 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.h +++ b/drivers/net/wireless/ath/ath10k/wmi.h @@ -2340,9 +2340,9 @@ struct wmi_pdev_param_map { #define WMI_PDEV_PARAM_UNSUPPORTED 0 enum wmi_pdev_param { - /* TX chian mask */ + /* TX chain mask */ WMI_PDEV_PARAM_TX_CHAIN_MASK = 0x1, - /* RX chian mask */ + /* RX chain mask */ WMI_PDEV_PARAM_RX_CHAIN_MASK, /* TX power limit for 2G Radio */ WMI_PDEV_PARAM_TXPOWER_LIMIT2G, -- 1.7.11.7 _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] ath10k: support get/set antenna configurations. 2014-05-07 21:50 [PATCH 1/2] ath10k: Fix spelling mistake in comments greearb @ 2014-05-07 21:50 ` greearb 2014-05-08 5:43 ` Michal Kazior 2014-05-16 13:47 ` [PATCH 1/2] ath10k: Fix spelling mistake in comments Kalle Valo 1 sibling, 1 reply; 4+ messages in thread From: greearb @ 2014-05-07 21:50 UTC (permalink / raw) To: ath10k; +Cc: Ben Greear, linux-wireless From: Ben Greear <greearb@candelatech.com> Tested with CT firmware, but should work on standard firmware as well. Verified that target's tx/rx chain register is set appropriately, and that the tx rate goes down as number of chains decrease, but I did not actually try to verify antenna ceased to transmit when disabled. Signed-off-by: Ben Greear <greearb@candelatech.com> --- drivers/net/wireless/ath/ath10k/core.h | 5 +++ drivers/net/wireless/ath/ath10k/mac.c | 64 ++++++++++++++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/wmi.c | 5 +++ 3 files changed, 74 insertions(+) diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h index 7050c47..f7eb8050 100644 --- a/drivers/net/wireless/ath/ath10k/core.h +++ b/drivers/net/wireless/ath/ath10k/core.h @@ -472,6 +472,11 @@ struct ath10k { u32 dfs_block_radar_events; int install_key_rv; /* Store error code from key-install */ + unsigned char supp_tx_chainmask; + unsigned char supp_rx_chainmask; + unsigned char cfg_tx_chainmask; + unsigned char cfg_rx_chainmask; + struct wmi_pdev_set_wmm_params_arg wmm_params; struct completion install_key_done; diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index dcb147d..cc85bd9 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c @@ -2483,6 +2483,61 @@ void ath10k_halt(struct ath10k *ar) spin_unlock_bh(&ar->data_lock); } +static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) +{ + struct ath10k *ar = hw->priv; + + if (ar->cfg_tx_chainmask) { + *tx_ant = ar->cfg_tx_chainmask; + *rx_ant = ar->cfg_rx_chainmask; + } else { + *tx_ant = ar->supp_tx_chainmask; + *rx_ant = ar->supp_rx_chainmask; + } + return 0; +} + +static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) +{ + int ret; + + ar->cfg_tx_chainmask = tx_ant; + ar->cfg_rx_chainmask = rx_ant; + + if (ar->state != ATH10K_STATE_ON) + return 0; + + ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, + tx_ant); + if (ret) { + ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n", + ret, tx_ant); + return ret; + } + + ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, + rx_ant); + if (ret) { + ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n", + ret, rx_ant); + return ret; + } + + return ret; +} + +static int ath10k_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) +{ + struct ath10k *ar = hw->priv; + int ret; + + mutex_lock(&ar->conf_mutex); + ret = __ath10k_set_antenna(ar, tx_ant, rx_ant); + mutex_unlock(&ar->conf_mutex); + return ret; +} + + static int ath10k_start(struct ieee80211_hw *hw) { struct ath10k *ar = hw->priv; @@ -2530,6 +2585,10 @@ static int ath10k_start(struct ieee80211_hw *hw) if (ret) ath10k_warn("failed to enable dynamic BW: %d\n", ret); + if (ar->cfg_tx_chainmask) + __ath10k_set_antenna(ar, ar->cfg_tx_chainmask, + ar->cfg_rx_chainmask); + /* * By default FW set ARP frames ac to voice (6). In that case ARP * exchange is not working properly for UAPSD enabled AP. ARP requests @@ -4437,6 +4496,8 @@ static const struct ieee80211_ops ath10k_ops = { .set_frag_threshold = ath10k_set_frag_threshold, .flush = ath10k_flush, .tx_last_beacon = ath10k_tx_last_beacon, + .set_antenna = ath10k_set_antenna, + .get_antenna = ath10k_get_antenna, .restart_complete = ath10k_restart_complete, .get_survey = ath10k_get_survey, .set_bitrate_mask = ath10k_set_bitrate_mask, @@ -4818,6 +4879,9 @@ int ath10k_mac_register(struct ath10k *ar) BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP); + ar->hw->wiphy->available_antennas_rx = ar->supp_rx_chainmask; + ar->hw->wiphy->available_antennas_tx = ar->supp_tx_chainmask; + if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features)) ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) | diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index 82a827e..d82b740 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c @@ -2601,6 +2601,8 @@ static int ath10k_wmi_main_cmd_init(struct ath10k *ar) config.ast_skid_limit = __cpu_to_le32(TARGET_AST_SKID_LIMIT); config.tx_chain_mask = __cpu_to_le32(TARGET_TX_CHAIN_MASK); config.rx_chain_mask = __cpu_to_le32(TARGET_RX_CHAIN_MASK); + ar->supp_tx_chainmask = TARGET_TX_CHAIN_MASK; + ar->supp_rx_chainmask = TARGET_RX_CHAIN_MASK; config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); config.rx_timeout_pri_be = __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI); @@ -2721,6 +2723,9 @@ static int ath10k_wmi_10x_cmd_init(struct ath10k *ar) config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); + /* TODO: Have to deal with 2x2 chips if/when the come out. */ + ar->supp_tx_chainmask = TARGET_10X_TX_CHAIN_MASK; + ar->supp_rx_chainmask = TARGET_10X_RX_CHAIN_MASK; config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); -- 1.7.11.7 _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] ath10k: support get/set antenna configurations. 2014-05-07 21:50 ` [PATCH 2/2] ath10k: support get/set antenna configurations greearb @ 2014-05-08 5:43 ` Michal Kazior 0 siblings, 0 replies; 4+ messages in thread From: Michal Kazior @ 2014-05-08 5:43 UTC (permalink / raw) To: Ben Greear; +Cc: linux-wireless, ath10k@lists.infradead.org On 7 May 2014 23:50, <greearb@candelatech.com> wrote: > From: Ben Greear <greearb@candelatech.com> > > Tested with CT firmware, but should work on standard > firmware as well. > > Verified that target's tx/rx chain register is set appropriately, > and that the tx rate goes down as number of chains > decrease, but I did not actually try to verify antenna > ceased to transmit when disabled. > > Signed-off-by: Ben Greear <greearb@candelatech.com> > --- > drivers/net/wireless/ath/ath10k/core.h | 5 +++ > drivers/net/wireless/ath/ath10k/mac.c | 64 ++++++++++++++++++++++++++++++++++ > drivers/net/wireless/ath/ath10k/wmi.c | 5 +++ > 3 files changed, 74 insertions(+) > > diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h > index 7050c47..f7eb8050 100644 > --- a/drivers/net/wireless/ath/ath10k/core.h > +++ b/drivers/net/wireless/ath/ath10k/core.h > @@ -472,6 +472,11 @@ struct ath10k { > u32 dfs_block_radar_events; > int install_key_rv; /* Store error code from key-install */ > > + unsigned char supp_tx_chainmask; > + unsigned char supp_rx_chainmask; > + unsigned char cfg_tx_chainmask; > + unsigned char cfg_rx_chainmask; It's probably a good idea to note these are protected by conf_mutex. > + > struct wmi_pdev_set_wmm_params_arg wmm_params; > struct completion install_key_done; > > diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c > index dcb147d..cc85bd9 100644 > --- a/drivers/net/wireless/ath/ath10k/mac.c > +++ b/drivers/net/wireless/ath/ath10k/mac.c > @@ -2483,6 +2483,61 @@ void ath10k_halt(struct ath10k *ar) > spin_unlock_bh(&ar->data_lock); > } > > +static int ath10k_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) > +{ > + struct ath10k *ar = hw->priv; > + > + if (ar->cfg_tx_chainmask) { > + *tx_ant = ar->cfg_tx_chainmask; > + *rx_ant = ar->cfg_rx_chainmask; > + } else { > + *tx_ant = ar->supp_tx_chainmask; > + *rx_ant = ar->supp_rx_chainmask; > + } Shouldn't this be protected by conf_mutex? > + return 0; > +} > + > +static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant) > +{ > + int ret; > + +lockdep_assert_held(&ar->conf_mutex); > + ar->cfg_tx_chainmask = tx_ant; > + ar->cfg_rx_chainmask = rx_ant; > + > + if (ar->state != ATH10K_STATE_ON) This won't update set antenna during hw restart. You should accept ATH10K_STATE_RESTARTED here too. > + return 0; > + > + ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->tx_chain_mask, > + tx_ant); > + if (ret) { > + ath10k_warn("failed to set tx-chainmask: %d, req 0x%x\n", > + ret, tx_ant); > + return ret; > + } > + > + ret = ath10k_wmi_pdev_set_param(ar, ar->wmi.pdev_param->rx_chain_mask, > + rx_ant); > + if (ret) { > + ath10k_warn("failed to set rx-chainmask: %d, req 0x%x\n", > + ret, rx_ant); > + return ret; > + } > + > + return ret; return 0 is probably fine here too. Michał _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] ath10k: Fix spelling mistake in comments. 2014-05-07 21:50 [PATCH 1/2] ath10k: Fix spelling mistake in comments greearb 2014-05-07 21:50 ` [PATCH 2/2] ath10k: support get/set antenna configurations greearb @ 2014-05-16 13:47 ` Kalle Valo 1 sibling, 0 replies; 4+ messages in thread From: Kalle Valo @ 2014-05-16 13:47 UTC (permalink / raw) To: greearb; +Cc: linux-wireless, ath10k greearb@candelatech.com writes: > From: Ben Greear <greearb@candelatech.com> > > Simple typo fix. > > Signed-off-by: Ben Greear <greearb@candelatech.com> Thanks, patch 1 applied with a cosmetic change to the title. Patch 2 dropped as there's a new version in the queue. -- Kalle Valo _______________________________________________ ath10k mailing list ath10k@lists.infradead.org http://lists.infradead.org/mailman/listinfo/ath10k ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-05-16 13:47 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-05-07 21:50 [PATCH 1/2] ath10k: Fix spelling mistake in comments greearb 2014-05-07 21:50 ` [PATCH 2/2] ath10k: support get/set antenna configurations greearb 2014-05-08 5:43 ` Michal Kazior 2014-05-16 13:47 ` [PATCH 1/2] ath10k: Fix spelling mistake in comments Kalle Valo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox