[PATCH] ath10k: support get/set antenna configurations.

Kalle Valo kvalo at qca.qualcomm.com
Tue May 13 11:10:51 PDT 2014


Avery Pennarun <apenwarr at gmail.com> writes:

> From: Ben Greear <greearb at candelatech.com>
>
> Tested with CT firmware, but should work on standard
> firmware as well.

I think this is unnecessary as it works with the standard firmware,
right?

> 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 at candelatech.com>
> Tested-by: Avery Pennarun <apenwarr at gmail.com>

I'm no lawyer, but I think that when person A resends person B's patch
then person A should add Signed-off-by line as well. And then that would
make Tested-by line moot as well.

> --- a/drivers/net/wireless/ath/ath10k/core.h
> +++ b/drivers/net/wireless/ath/ath10k/core.h
> @@ -440,6 +440,12 @@ struct ath10k {
>  	bool radar_enabled;
>  	int num_started_vdevs;
>  
> +	/* Protected by conf-mutex */
> +	unsigned char supp_tx_chainmask;
> +	unsigned char supp_rx_chainmask;
> +	unsigned char cfg_tx_chainmask;
> +	unsigned char cfg_rx_chainmask;

char is a bit odd here, as we are not storing characters here. Would u8
be better?

> +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) &&
> +	    (ar->state != ATH10K_STATE_RESTARTED))
> +		return 0;

Should we return an error value instead? Aren't we otherwise cheating by
claiming that the command was succesful?

> +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;
> +}
> +
> +

One empty line is enough here.

> --- a/drivers/net/wireless/ath/ath10k/wmi.c
> +++ b/drivers/net/wireless/ath/ath10k/wmi.c
> @@ -2558,6 +2558,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);
> @@ -2652,6 +2654,9 @@ static int ath10k_wmi_10x_cmd_init(struct ath10k *ar)
>  	config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
>  	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);

This initialisation looks out of place as we these variables have
nothing to do with the actual WMI_INIT_CMDID command. And besides, they
would get overwritten every time we start the firmware. Is that on
purpose?

I think we should find more approriate place, for example
ath10k_mac_register() would be one to look at.

-- 
Kalle Valo



More information about the ath10k mailing list