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

Commit fed99b1e authored by Grant Grundler's avatar Grant Grundler Committed by Kyle McMartin
Browse files

parisc: advertise PCI devs after "assign_resources"



Alex Chiang asked me why PARISC was calling pci_bus_add_devices()
and pci_bus_assign_resources() in the opposite order from everyone else.
No reason and I couldn't see any data dependency.
Patch below applies cleanly to 2.6.30-rc2.

Later, I suspected the code worked only because no drivers would be
loaded/ready until much later in the system initialization sequence.

Tested "LBA" code on J6000 (32-bit) and A500 (64-bit SMP) with 2.6.30-rc2.
Not tested with any Dino controllers.
Not tested with PCI-PCI Bridge (TBD).

Reported-by: default avatarAlex Chiang <achiang@hp.com>
Signed-off-by: default avatarGrant Grundler <grundler@parisc-linux.org>
Signed-off-by: default avatarKyle McMartin <kyle@mcmartin.ca>
parent 7d17e276
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -1019,22 +1019,22 @@ static int __init dino_probe(struct parisc_device *dev)
	** It's not used to avoid chicken/egg problems
	** with configuration accessor functions.
	*/
	bus = pci_scan_bus_parented(&dev->dev, dino_current_bus,
				    &dino_cfg_ops, NULL);
	dino_dev->hba.hba_bus = bus = pci_scan_bus_parented(&dev->dev,
			 dino_current_bus, &dino_cfg_ops, NULL);

	if(bus) {
		pci_bus_add_devices(bus);
		/* This code *depends* on scanning being single threaded
		 * if it isn't, this global bus number count will fail
		 */
		dino_current_bus = bus->subordinate + 1;
		pci_bus_assign_resources(bus);
		pci_bus_add_devices(bus);
	} else {
		printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n",
		printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (duplicate bus number %d?)\n",
		       dev_name(&dev->dev), dino_current_bus);
		/* increment the bus number in case of duplicates */
		dino_current_bus++;
	}
	dino_dev->hba.hba_bus = bus;
	return 0;
}

+5 −5
Original line number Diff line number Diff line
@@ -1509,10 +1509,6 @@ lba_driver_probe(struct parisc_device *dev)
	lba_bus = lba_dev->hba.hba_bus =
		pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
				cfg_ops, NULL);
	if (lba_bus) {
		lba_next_bus = lba_bus->subordinate + 1;
		pci_bus_add_devices(lba_bus);
	}

	/* This is in lieu of calling pci_assign_unassigned_resources() */
	if (is_pdc_pat()) {
@@ -1533,7 +1529,6 @@ lba_driver_probe(struct parisc_device *dev)
	}
	pci_enable_bridges(lba_bus);


	/*
	** Once PCI register ops has walked the bus, access to config
	** space is restricted. Avoids master aborts on config cycles.
@@ -1543,6 +1538,11 @@ lba_driver_probe(struct parisc_device *dev)
		lba_dev->flags |= LBA_FLAG_SKIP_PROBE;
	}

	if (lba_bus) {
		lba_next_bus = lba_bus->subordinate + 1;
		pci_bus_add_devices(lba_bus);
	}

	/* Whew! Finally done! Tell services we got this one covered. */
	return 0;
}