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