Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 765ee51f authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

Revert "EISA: Initialize device before its resources"

This reverts commit 26abfeed.

In the eisa_probe() force_probe path, if we were unable to request slot
resources (e.g., [io 0x800-0x8ff]), we skipped the slot with "Cannot
allocate resource for EISA slot %d" before reading the EISA signature in
eisa_init_device().

Commit 26abfeed moved eisa_init_device() earlier, so we tried to read
the EISA signature before requesting the slot resources, and this caused
hangs during boot.

Link: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1251816


Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
CC: stable@vger.kernel.org	# v3.10+ a2080d0c: Revert "EISA: Log device resources in dmesg"
parent bea1b0b3
Loading
Loading
Loading
Loading
+15 −11
Original line number Diff line number Diff line
@@ -277,11 +277,13 @@ static int __init eisa_request_resources(struct eisa_root_device *root,
		}
		
		if (slot) {
			edev->res[i].name  = NULL;
			edev->res[i].start = SLOT_ADDRESS(root, slot)
					     + (i * 0x400);
			edev->res[i].end   = edev->res[i].start + 0xff;
			edev->res[i].flags = IORESOURCE_IO;
		} else {
			edev->res[i].name  = NULL;
			edev->res[i].start = SLOT_ADDRESS(root, slot)
					     + EISA_VENDOR_ID_OFFSET;
			edev->res[i].end   = edev->res[i].start + 3;
@@ -327,19 +329,20 @@ static int __init eisa_probe(struct eisa_root_device *root)
		return -ENOMEM;
	}
		
	if (eisa_init_device(root, edev, 0)) {
	if (eisa_request_resources(root, edev, 0)) {
		dev_warn(root->dev,
		         "EISA: Cannot allocate resource for mainboard\n");
		kfree(edev);
		if (!root->force_probe)
			return -ENODEV;
			return -EBUSY;
		goto force_probe;
	}

	if (eisa_request_resources(root, edev, 0)) {
		dev_warn(root->dev,
		         "EISA: Cannot allocate resource for mainboard\n");
	if (eisa_init_device(root, edev, 0)) {
		eisa_release_resources(edev);
		kfree(edev);
		if (!root->force_probe)
			return -EBUSY;
			return -ENODEV;
		goto force_probe;
	}

@@ -362,11 +365,6 @@ static int __init eisa_probe(struct eisa_root_device *root)
			continue;
		}

		if (eisa_init_device(root, edev, i)) {
			kfree(edev);
			continue;
		}

		if (eisa_request_resources(root, edev, i)) {
			dev_warn(root->dev,
			         "Cannot allocate resource for EISA slot %d\n",
@@ -375,6 +373,12 @@ static int __init eisa_probe(struct eisa_root_device *root)
			continue;
		}

		if (eisa_init_device(root, edev, i)) {
			eisa_release_resources(edev);
			kfree(edev);
			continue;
		}

		if (edev->state == (EISA_CONFIG_ENABLED | EISA_CONFIG_FORCED))
			enabled_str = " (forced enabled)";
		else if (edev->state == EISA_CONFIG_FORCED)