diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-designware-ep.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-designware-ep.c | 45 | 
1 files changed, 10 insertions, 35 deletions
diff --git a/drivers/pci/controller/dwc/pcie-designware-ep.c b/drivers/pci/controller/dwc/pcie-designware-ep.c index 2bf5a35c0570..3dd2e2697294 100644 --- a/drivers/pci/controller/dwc/pcie-designware-ep.c +++ b/drivers/pci/controller/dwc/pcie-designware-ep.c @@ -40,39 +40,6 @@ void dw_pcie_ep_reset_bar(struct dw_pcie *pci, enum pci_barno bar)  	__dw_pcie_ep_reset_bar(pci, bar, 0);  } -static u8 __dw_pcie_ep_find_next_cap(struct dw_pcie *pci, u8 cap_ptr, -			      u8 cap) -{ -	u8 cap_id, next_cap_ptr; -	u16 reg; - -	if (!cap_ptr) -		return 0; - -	reg = dw_pcie_readw_dbi(pci, cap_ptr); -	cap_id = (reg & 0x00ff); - -	if (cap_id > PCI_CAP_ID_MAX) -		return 0; - -	if (cap_id == cap) -		return cap_ptr; - -	next_cap_ptr = (reg & 0xff00) >> 8; -	return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); -} - -static u8 dw_pcie_ep_find_capability(struct dw_pcie *pci, u8 cap) -{ -	u8 next_cap_ptr; -	u16 reg; - -	reg = dw_pcie_readw_dbi(pci, PCI_CAPABILITY_LIST); -	next_cap_ptr = (reg & 0x00ff); - -	return __dw_pcie_ep_find_next_cap(pci, next_cap_ptr, cap); -} -  static int dw_pcie_ep_write_header(struct pci_epc *epc, u8 func_no,  				   struct pci_epf_header *hdr)  { @@ -531,6 +498,7 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)  	int ret;  	u32 reg;  	void *addr; +	u8 hdr_type;  	unsigned int nbars;  	unsigned int offset;  	struct pci_epc *epc; @@ -595,6 +563,13 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)  	if (ep->ops->ep_init)  		ep->ops->ep_init(ep); +	hdr_type = dw_pcie_readb_dbi(pci, PCI_HEADER_TYPE); +	if (hdr_type != PCI_HEADER_TYPE_NORMAL) { +		dev_err(pci->dev, "PCIe controller is not set to EP mode (hdr_type:0x%x)!\n", +			hdr_type); +		return -EIO; +	} +  	ret = of_property_read_u8(np, "max-functions", &epc->max_functions);  	if (ret < 0)  		epc->max_functions = 1; @@ -612,9 +587,9 @@ int dw_pcie_ep_init(struct dw_pcie_ep *ep)  		dev_err(dev, "Failed to reserve memory for MSI/MSI-X\n");  		return -ENOMEM;  	} -	ep->msi_cap = dw_pcie_ep_find_capability(pci, PCI_CAP_ID_MSI); +	ep->msi_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI); -	ep->msix_cap = dw_pcie_ep_find_capability(pci, PCI_CAP_ID_MSIX); +	ep->msix_cap = dw_pcie_find_capability(pci, PCI_CAP_ID_MSIX);  	offset = dw_pcie_ep_find_ext_capability(pci, PCI_EXT_CAP_ID_REBAR);  	if (offset) {  |