diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/pci.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index b0002daa50f3..6078dfc11b11 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -52,7 +52,6 @@ static void pci_pme_list_scan(struct work_struct *work); | |||
52 | static LIST_HEAD(pci_pme_list); | 52 | static LIST_HEAD(pci_pme_list); |
53 | static DEFINE_MUTEX(pci_pme_list_mutex); | 53 | static DEFINE_MUTEX(pci_pme_list_mutex); |
54 | static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan); | 54 | static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan); |
55 | static DEFINE_MUTEX(pci_bridge_mutex); | ||
56 | 55 | ||
57 | struct pci_pme_device { | 56 | struct pci_pme_device { |
58 | struct list_head list; | 57 | struct list_head list; |
@@ -1351,16 +1350,10 @@ static void pci_enable_bridge(struct pci_dev *dev) | |||
1351 | if (bridge) | 1350 | if (bridge) |
1352 | pci_enable_bridge(bridge); | 1351 | pci_enable_bridge(bridge); |
1353 | 1352 | ||
1354 | /* | ||
1355 | * Hold pci_bridge_mutex to prevent a race when enabling two | ||
1356 | * devices below the bridge simultaneously. The race may cause a | ||
1357 | * PCI_COMMAND_MEMORY update to be lost (see changelog). | ||
1358 | */ | ||
1359 | mutex_lock(&pci_bridge_mutex); | ||
1360 | if (pci_is_enabled(dev)) { | 1353 | if (pci_is_enabled(dev)) { |
1361 | if (!dev->is_busmaster) | 1354 | if (!dev->is_busmaster) |
1362 | pci_set_master(dev); | 1355 | pci_set_master(dev); |
1363 | goto end; | 1356 | return; |
1364 | } | 1357 | } |
1365 | 1358 | ||
1366 | retval = pci_enable_device(dev); | 1359 | retval = pci_enable_device(dev); |
@@ -1368,8 +1361,6 @@ static void pci_enable_bridge(struct pci_dev *dev) | |||
1368 | dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", | 1361 | dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", |
1369 | retval); | 1362 | retval); |
1370 | pci_set_master(dev); | 1363 | pci_set_master(dev); |
1371 | end: | ||
1372 | mutex_unlock(&pci_bridge_mutex); | ||
1373 | } | 1364 | } |
1374 | 1365 | ||
1375 | static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) | 1366 | static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) |
@@ -1394,7 +1385,7 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) | |||
1394 | return 0; /* already enabled */ | 1385 | return 0; /* already enabled */ |
1395 | 1386 | ||
1396 | bridge = pci_upstream_bridge(dev); | 1387 | bridge = pci_upstream_bridge(dev); |
1397 | if (bridge && !pci_is_enabled(bridge)) | 1388 | if (bridge) |
1398 | pci_enable_bridge(bridge); | 1389 | pci_enable_bridge(bridge); |
1399 | 1390 | ||
1400 | /* only skip sriov related */ | 1391 | /* only skip sriov related */ |