Revert "PCI: Avoid race while enabling upstream bridges"

This reverts commit 40f11adc7cd9281227f0a6a627d966dd0a5f0cd9.

Jens found that iwlwifi firmware loading failed on a Lenovo X1 Carbon,
gen4:

iwlwifi 0000:04:00.0: Direct firmware load for iwlwifi-8000C-34.ucode failed with error -2
iwlwifi 0000:04:00.0: Direct firmware load for iwlwifi-8000C-33.ucode failed with error -2
iwlwifi 0000:04:00.0: Direct firmware load for iwlwifi-8000C-32.ucode failed with error -2
iwlwifi 0000:04:00.0: loaded firmware version 31.532993.0 op_mode iwlmvm
iwlwifi 0000:04:00.0: Detected Intel(R) Dual Band Wireless AC 8260, REV=0x208
...
iwlwifi 0000:04:00.0: Failed to load firmware chunk!
iwlwifi 0000:04:00.0: Could not load the [0] uCode section
iwlwifi 0000:04:00.0: Failed to start INIT ucode: -110
iwlwifi 0000:04:00.0: Failed to run INIT ucode: -110

He bisected it to 40f11adc7cd9 ("PCI: Avoid race while enabling upstream
bridges"). Revert that commit to fix the regression.

Link: http://lkml.kernel.org/r/4bcbcbc1-7c79-09f0-5071-bc2f53bf6574@kernel.dk
Fixes: 40f11adc7cd9 ("PCI: Avoid race while enabling upstream bridges")
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: Srinath Mannam <srinath.mannam@broadcom.com>
CC: Jens Axboe <axboe@kernel.dk>
CC: Luca Coelho <luca@coelho.fi>
CC: Johannes Berg <johannes@sipsolutions.net>
CC: Emmanuel Grumbach <emmanuel.grumbach@intel.com>

+2 -11
+2 -11
drivers/pci/pci.c
··· 52 52 static LIST_HEAD(pci_pme_list); 53 53 static DEFINE_MUTEX(pci_pme_list_mutex); 54 54 static DECLARE_DELAYED_WORK(pci_pme_work, pci_pme_list_scan); 55 - static DEFINE_MUTEX(pci_bridge_mutex); 56 55 57 56 struct pci_pme_device { 58 57 struct list_head list; ··· 1350 1351 if (bridge) 1351 1352 pci_enable_bridge(bridge); 1352 1353 1353 - /* 1354 - * Hold pci_bridge_mutex to prevent a race when enabling two 1355 - * devices below the bridge simultaneously. The race may cause a 1356 - * PCI_COMMAND_MEMORY update to be lost (see changelog). 1357 - */ 1358 - mutex_lock(&pci_bridge_mutex); 1359 1354 if (pci_is_enabled(dev)) { 1360 1355 if (!dev->is_busmaster) 1361 1356 pci_set_master(dev); 1362 - goto end; 1357 + return; 1363 1358 } 1364 1359 1365 1360 retval = pci_enable_device(dev); ··· 1361 1368 dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n", 1362 1369 retval); 1363 1370 pci_set_master(dev); 1364 - end: 1365 - mutex_unlock(&pci_bridge_mutex); 1366 1371 } 1367 1372 1368 1373 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags) ··· 1385 1394 return 0; /* already enabled */ 1386 1395 1387 1396 bridge = pci_upstream_bridge(dev); 1388 - if (bridge && !pci_is_enabled(bridge)) 1397 + if (bridge) 1389 1398 pci_enable_bridge(bridge); 1390 1399 1391 1400 /* only skip sriov related */