[PATCH 2/2] ath10k: apply chainmask settings to vdev on creation.
Michal Kazior
michal.kazior at tieto.com
Tue Sep 23 01:53:42 PDT 2014
On 22 September 2014 22:54, <greearb at candelatech.com> wrote:
> From: Ben Greear <greearb at candelatech.com>
>
> It appears it takes more than just setting the
> hardware's chainmask to make things work well. Without
> this patch, a vdev would only use 1x1 rates when chainmask
> was set to 0x3.
>
> Setting the 'nss' (number of spatial streams) on the vdev
> helps the firmware's rate-control algorithm work properly.
>
> Tested on CT firmware, but probably this works (and
> is required) on normal firmware.
>
> Signed-off-by: Ben Greear <greearb at candelatech.com>
> ---
> drivers/net/wireless/ath/ath10k/mac.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
> index 4dc5a40..855c71c 100644
> --- a/drivers/net/wireless/ath/ath10k/mac.c
> +++ b/drivers/net/wireless/ath/ath10k/mac.c
> @@ -2767,6 +2767,17 @@ static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
> return ret;
> }
>
> +static u32 get_nss_from_chainmask(u16 chain_mask)
> +{
> + if ((chain_mask & 0x15) == 0x15)
> + return 4;
> + else if ((chain_mask & 0x7) == 0x7)
> + return 3;
> + else if ((chain_mask & 0x3) == 0x3)
> + return 2;
> + return 1;
> +}
So a chainmask of `BIT(0) | BIT(2) = 0x5` is nss=1?
Why not just use `hweight16()` kernel macro? Or do we want to forbid
odd chainmasks (in which case additional checks need to be added as
well)?
> +
> /*
> * TODO:
> * Figure out how to handle WMI_VDEV_SUBTYPE_P2P_DEVICE,
> @@ -2868,6 +2879,19 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
> goto err_vdev_delete;
> }
>
> + if (ar->cfg_tx_chainmask) {
> + u16 nss = get_nss_from_chainmask(ar->cfg_tx_chainmask);
> + vdev_param = ar->wmi.vdev_param->nss;
> + ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
> + nss);
> + if (ret) {
> + ath10k_warn(ar, "failed to set vdev %i chainmask 0x%x, nss %i: %d\n",
> + arvif->vdev_id, ar->cfg_tx_chainmask, nss,
> + ret);
> + goto err_vdev_delete;
> + }
> + }
> +
If this is required won't setting up peer nss (after association) be
necessary as well?
Shouldn't the vdev nss param be set in __ath10k_set_antenna() as well?
What about peer nss (assuming it's necessary to update it) in that
case?
Michał
More information about the ath10k
mailing list