Hi Lorenzo,

On 12/02/19 8:37 PM, Lorenzo Pieralisi wrote:
> On Mon, Jan 07, 2019 at 12:11:44PM +0530, Kishon Vijay Abraham I wrote:
> 
> [...]
> 
>>  static int pci_epf_test_bind(struct pci_epf *epf)
>>  {
>>      int ret;
>>      struct pci_epf_test *epf_test = epf_get_drvdata(epf);
>>      struct pci_epf_header *header = epf->header;
>> +    const struct pci_epc_features *epc_features;
>> +    enum pci_barno test_reg_bar = BAR_0;
>>      struct pci_epc *epc = epf->epc;
>>      struct device *dev = &epf->dev;
>> +    bool linkup_notifier = false;
>> +    bool msix_capable = false;
>> +    bool msi_capable = true;
>>  
>>      if (WARN_ON_ONCE(!epc))
>>              return -EINVAL;
>>  
>> -    if (epc->features & EPC_FEATURE_NO_LINKUP_NOTIFIER)
>> -            epf_test->linkup_notifier = false;
>> -    else
>> -            epf_test->linkup_notifier = true;
>> -
>> -    epf_test->msix_available = epc->features & EPC_FEATURE_MSIX_AVAILABLE;
>> +    epc_features = pci_epc_get_features(epc, epf->func_no);
> 
> I think it would work out better if struct pci_epc_features was
> allocated in the caller (stack) and pci_epc_get_features() take a
> pointer parameter to it rather than the callee and the callee would just
> have to fill it out, this also removes data in the driver that is not
> really useful.
> 
> Is there any other reason behind the current design choice ?

Some drivers are used by multiple platforms each with different features. In
such cases it's cleaner to have separate epc_feature table for each platform.

I think the driver should maintain some sort of data to even populate
pci_epc_features allocated by EP function driver.

Thanks
Kishon

Reply via email to