[RFC v3 03/11] ath10k: per target configurablity of various items

Erik Stromdahl erik.stromdahl at gmail.com
Thu Dec 28 04:43:10 PST 2017



On 2017-12-22 16:19, Kalle Valo wrote:
> Erik Stromdahl <erik.stromdahl at gmail.com> writes:
> 
>> Added ability to set bus type and configure the max number of
>> peers in the ath10k_hw_params struct.
>>
>> With this functionality it is possible to have a different
>> hw configuration depending on bus type for the same radio
>> chipset.
>>
>> E.g. SDIO and USB devices using the same chipset as PCIe
>> devices will potentially use different board files and perhaps
>> other configuration parameters.
>>
>> One such parameter is the max number of peers.
>> Instead of using a default value (suitable for PCIe devices)
>> derived from the WMI op version, a per target value can be
>> used instead.
>>
>> This is needed by the QCA9377 USB device in order to prevent
>> the target fw to crash after HTT RX ring cfg is issued.
>>
>> Apparently, the QCA9377 HL device does not seem to handle the
>> same amount of peers as the LL devices.
>>
>> Signed-off-by: Erik Stromdahl <erik.stromdahl at gmail.com>
> 
> I was a bit torn about this, I definitely see the need for this but on
> the other hand it creates duplicate data (for example two entries for
> QCA9377 chip). I guess this is the right approach, at least I cannot
> come up anything better.
> 
> But this patch should be split into two:
> 
> 1) add bus field to struct ath10k_hw_params
> 
> 2) add max_num_peers field to struct ath10k_hw_params
> 
> And it seems 2) is already implemented in commit 9f2992fea580 ("ath10k:
> wmi: get wmi init parameter values from hw params"), so hopefully we
> only need 1) anymore.
> 

Before commit 9f2992fea580a48135591873e5e3ac7e01444207,
TARGET_TLV_NUM_PEERS was used both in the WMI TLV init command
and as the value of *max_num_peers* in *struct ath10k* (ar->max_num_peers).

commit 9f2992fea580a48135591873e5e3ac7e01444207 does not set
*ar->max_num_peers* to the value of *ar->hw_param->num_peers*.

Is this correct?

As I see it, there is a possible mismatch between what is written
to the device in the WMI init message and the value of *ar->max_num_peers*.

Do we still need *max_num_peers* in *struct ath10k* now that we have the
*num_peers* member in *struct ath10k_hw_params*?

I am currently rewriting my HL patches and I was thinking about adding
a separate patch related to this.

>> --- a/drivers/net/wireless/ath/ath10k/core.c
>> +++ b/drivers/net/wireless/ath/ath10k/core.c
>> @@ -1663,9 +1663,19 @@ static int ath10k_init_hw_params(struct ath10k *ar)
>>   	for (i = 0; i < ARRAY_SIZE(ath10k_hw_params_list); i++) {
>>   		hw_params = &ath10k_hw_params_list[i];
>>   
>> -		if (hw_params->id == ar->target_version &&
>> -		    hw_params->dev_id == ar->dev_id)
>> -			break;
>> +		if (ar->is_high_latency) {
>> +			/* High latency devices will use different fw depending
>> +			 * on if it is a USB or SDIO device.
>> +			 */
>> +			if (hw_params->bus == ar->hif.bus &&
>> +			    hw_params->id == ar->target_version &&
>> +			    hw_params->dev_id == ar->dev_id)
>> +				break;
>> +		} else {
>> +			if (hw_params->id == ar->target_version &&
>> +			    hw_params->dev_id == ar->dev_id)
>> +				break;
>> +		}
> 
> I don't like the is_high_latency test here at all. The bus field should
> be checked with all entries, not just high latency ones. And because of
> this even most of the hw_param bus field entries were not initialised.
> 
> So only thing to do is to initialise the bus field for all the entries
> and the ugly test here can be removed. Just remember that QCA4019 uses
> AHB, I think all the rest is PCI. Or do we have AHB devices supported?

I noticed that there has been introduced a new bus type (SNOC).
Do you know which devices are SNOC devices?
Btw, what the heck is SNOC anyway?

> 
>> @@ -550,6 +557,18 @@ struct ath10k_hw_params {
>>   	 */
>>   	int vht160_mcs_rx_highest;
>>   	int vht160_mcs_tx_highest;
>> +
>> +	/* max_num_peers can be used to override the setting derived from
>> +	 * the WMI op version. If this value is non-zero, it will always
>> +	 * be used instead of the default value derived from the WMI op
>> +	 * version.
>> +	 */
>> +	int max_num_peers;
>> +
>> +	/* Specifies whether or not the device is a high latency device */
>> +	bool is_high_latency;
>> +
>> +	enum ath10k_bus bus;
>>   };
> 
> Please move the bus field between dev_id and name fields. It's so
> important that it should not be in the end.
> 



More information about the ath10k mailing list