Re: [PATCH v2 1/1] PCI: loongson: skip scanning unavailable child device

From: Liu Peibao
Date: Fri Nov 04 2022 - 06:43:41 EST


On 11/4/22 4:43 PM, Christophe JAILLET wrote:
> Le 04/11/2022 à 08:27, Liu Peibao a écrit :
>>   +#ifdef CONFIG_OF
>> +    /* Don't access devices in masklist */
>> +    if (pci_is_root_bus(bus)) {
>> +        struct list_head *list;
>> +        struct mask_entry *entry;
>> +
>> +        list_for_each(list, &priv->masklist) {
>> +            entry = list_entry(list, struct mask_entry, entry);
>
> Hi,
>
> list_for_each_entry() is slighly less verbose.
>

OK, I will update the patch with list_for_each_entry().

>> +            if (devfn == entry->devfn)
>> +                return NULL;
>> +        }
>> +    }
>> +#endif
>> +
>>       /* CFG0 can only access standard space */
>>       if (where < PCI_CFG_SPACE_SIZE && priv->cfg0_base)
>>           return cfg0_map(priv, bus, devfn, where);
>> @@ -206,6 +230,36 @@ static void __iomem *pci_loongson_map_bus(struct pci_bus *bus,
>>   }
>>     #ifdef CONFIG_OF
>> +static int setup_masklist(struct loongson_pci *priv)
>> +{
>> +    struct device *dev = &priv->pdev->dev;
>> +    struct device_node *dn, *parent = dev->of_node;
>> +    struct mask_entry *entry;
>> +    int devfn;
>> +
>> +    INIT_LIST_HEAD(&priv->masklist);
>> +
>> +    for_each_child_of_node(parent, dn) {
>> +        /*
>> +         * if device is not available, add this to masklist
>> +         * to avoid scanning it.
>> +         */
>> +        if (!of_device_is_available(dn)) {
>> +            devfn = of_pci_get_devfn(dn);
>> +            if (devfn < 0)
>> +                continue;
>> +
>> +            entry = devm_kzalloc(dev, sizeof(entry), GFP_KERNEL);
>
> sizeof(*entry)?
>

That really is a bug, thanks!

BR,
Peibao

>> +            if (!entry)
>> +                return -ENOMEM;
>> +