@@ -93,12 +93,20 @@ EXPORT_SYMBOL_GPL(pci_epc_get);
unsigned int pci_epc_get_first_free_bar(const struct pci_epc_features
*epc_features)
{
- int free_bar;
+ unsigned long free_bar;
if (!epc_features)
return 0;
- free_bar = ffz(epc_features->reserved_bar);
+ /* Find if the reserved BAR is also a 64-bit BAR */
+ free_bar = epc_features->reserved_bar & epc_features->bar_fixed_64bit;
+
+ /* Set the adjacent bit if the reserved BAR is also a 64-bit BAR */
+ free_bar <<= 1;
+ free_bar |= epc_features->reserved_bar;
+
+ /* Now find the free BAR */
+ free_bar = ffz(free_bar);
if (free_bar > 5)
return 0;