Re: [PATCH v3 ath-current 1/2] wifi: ath11k: add usecase firmware handling based on device compatible

Miaoqing Pan <[email protected]>
Newsgroups org.infradead.lists.ath11k,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-wireless
Message-ID <[email protected]>

On 1/19/2026 11:56 PM, Jonas Gorski wrote:
> Hi,
> 
> On Mon, Jan 19, 2026 at 3:04 PM Miaoqing Pan
> <[email protected]> wrote:
>>
>> For M.2 WLAN chips, there is no suitable DTS node to specify the
>> firmware-name property. In addition, assigning firmware for the
>> M.2 PCIe interface causes chips that do not use usecase specific
>> firmware to fail. Therefore, abandoning the approach of specifying
>> firmware in DTS. As an alternative, propose a static lookup table
>> mapping device compatible to firmware names. Currently, only WCN6855
>> HW2.1 requires this.
>>
>> However, support for the firmware-name property is retained to keep
>> the ABI backwards compatible.
>>
>> For details on usecase specific firmware, see:
>> https://lore.kernel.org/all/[email protected]/.
>>
>> Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-04685-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1
>>
>> Fixes: edbbc647c4f3 ("wifi: ath11k: support usercase-specific firmware overrides")
>> Signed-off-by: Miaoqing Pan <[email protected]>
>> ---
>>   drivers/net/wireless/ath/ath11k/core.c | 36 ++++++++++++++++++++++++++
>>   drivers/net/wireless/ath/ath11k/core.h |  4 +++
>>   2 files changed, 40 insertions(+)
>>
>> diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c
>> index de84906d1b27..1cf7f4e601c3 100644
>> --- a/drivers/net/wireless/ath/ath11k/core.c
>> +++ b/drivers/net/wireless/ath/ath11k/core.c
>> @@ -1044,6 +1044,42 @@ static const struct dmi_system_id ath11k_pm_quirk_table[] = {
>>          {}
>>   };
>>
>> +static const struct __ath11k_core_usecase_firmware_table {
>> +       u32 hw_rev;
>> +       const char *compatible;
>> +       const char *firmware_name;
>> +} ath11k_core_usecase_firmware_table[] = {
>> +       { ATH11K_HW_WCN6855_HW21, "qcom,lemans-evk", "nfa765"},
>> +       { ATH11K_HW_WCN6855_HW21, "qcom,monaco-evk", "nfa765"},
>> +       { ATH11K_HW_WCN6855_HW21, "qcom,hamoa-iot-evk", "nfa765"},
>> +       { /* Sentinel */ }
>> +};
>> +
>> +const char *ath11k_core_get_usecase_firmware(struct ath11k_base *ab)
>> +{
>> +       struct device_node *root __free(device_node) = of_find_node_by_path("/");
>> +       const struct __ath11k_core_usecase_firmware_table *entry = NULL;
>> +       int i, count = of_property_count_strings(root, "compatible");
>> +       const char *compatible = NULL;
>> +
>> +       for (i = 0; i < count; i++) {
>> +               if (of_property_read_string_index(root, "compatible", i,
>> +                                                 &compatible) < 0)
>> +                       continue;
>> +
>> +               entry = ath11k_core_usecase_firmware_table;
>> +               while (entry->compatible) {
>> +                       if (ab->hw_rev == entry->hw_rev &&
>> +                           !strcmp(entry->compatible, compatible))
> 
> You should be able to replace most of this code by using
> of_machine_is_compatible(entry->compatible) instead.
> 

Thanks, will update.

>> +                               return entry->firmware_name;
>> +                       entry++;
>> +               }
>> +       }
>> +
>> +       return NULL;
>> +}
>> +EXPORT_SYMBOL(ath11k_core_get_usecase_firmware);
>> +
>>   void ath11k_fw_stats_pdevs_free(struct list_head *head)
>>   {
> 
> Best regards,
> Jonas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.