Merge branch 'pci/endpoint'
[linux-2.6-microblaze.git] / drivers / pci / endpoint / pci-epc-core.c
index dcd4e66..da3fc07 100644 (file)
@@ -87,7 +87,7 @@ EXPORT_SYMBOL_GPL(pci_epc_get);
  * @epc_features: pci_epc_features structure that holds the reserved bar bitmap
  *
  * Invoke to get the first unreserved BAR that can be used by the endpoint
- * function. For any incorrect value in reserved_bar return '0'.
+ * function.
  */
 enum pci_barno
 pci_epc_get_first_free_bar(const struct pci_epc_features *epc_features)
@@ -102,32 +102,27 @@ EXPORT_SYMBOL_GPL(pci_epc_get_first_free_bar);
  * @bar: the starting BAR number from where unreserved BAR should be searched
  *
  * Invoke to get the next unreserved BAR starting from @bar that can be used
- * for endpoint function. For any incorrect value in reserved_bar return '0'.
+ * for endpoint function.
  */
 enum pci_barno pci_epc_get_next_free_bar(const struct pci_epc_features
                                         *epc_features, enum pci_barno bar)
 {
-       unsigned long free_bar;
+       int i;
 
        if (!epc_features)
                return BAR_0;
 
        /* If 'bar - 1' is a 64-bit BAR, move to the next BAR */
-       if ((epc_features->bar_fixed_64bit << 1) & 1 << bar)
+       if (bar > 0 && epc_features->bar[bar - 1].only_64bit)
                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;
-
-       free_bar = find_next_zero_bit(&free_bar, 6, bar);
-       if (free_bar > 5)
-               return NO_BAR;
+       for (i = bar; i < PCI_STD_NUM_BARS; i++) {
+               /* If the BAR is not reserved, return it. */
+               if (epc_features->bar[i].type != BAR_RESERVED)
+                       return i;
+       }
 
-       return free_bar;
+       return NO_BAR;
 }
 EXPORT_SYMBOL_GPL(pci_epc_get_next_free_bar);