ide: legacy PCI bus order probing fixes

IDE PCI host drivers should register themselves with IDE core only when
IDE driver is built-in, otherwise (IDE driver is modular and thus IDE PCI
host drivers are also modular) the code has no effect and just complicates
the probing.

Fix it by adding new config option CONFIG_IDEPCI_PCIBUS (defined only when
needed and invisible to the user) and covering by #ifdef/#endif the code
in question.  It turned out that "ide=reverse" was silently accepted but did
nothing in case when IDE driver was modular, this is fixed now.
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 5cbf79cd
...@@ -371,6 +371,9 @@ config IDEPCI_SHARE_IRQ ...@@ -371,6 +371,9 @@ config IDEPCI_SHARE_IRQ
It is safe to say Y to this question, in most cases. It is safe to say Y to this question, in most cases.
If unsure, say N. If unsure, say N.
config IDEPCI_PCIBUS_ORDER
def_bool PCI && BLK_DEV_IDE=y && BLK_DEV_IDEPCI
config BLK_DEV_OFFBOARD config BLK_DEV_OFFBOARD
bool "Boot off-board chipsets first support" bool "Boot off-board chipsets first support"
depends on PCI && BLK_DEV_IDEPCI depends on PCI && BLK_DEV_IDEPCI
......
...@@ -172,7 +172,7 @@ static int system_bus_speed; /* holds what we think is VESA/PCI bus speed */ ...@@ -172,7 +172,7 @@ static int system_bus_speed; /* holds what we think is VESA/PCI bus speed */
DECLARE_MUTEX(ide_cfg_sem); DECLARE_MUTEX(ide_cfg_sem);
__cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock);
#ifdef CONFIG_BLK_DEV_IDEPCI #ifdef CONFIG_IDEPCI_PCIBUS_ORDER
static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */
#endif #endif
...@@ -1333,13 +1333,13 @@ static int __init ide_setup(char *s) ...@@ -1333,13 +1333,13 @@ static int __init ide_setup(char *s)
return 1; return 1;
} }
#ifdef CONFIG_BLK_DEV_IDEPCI #ifdef CONFIG_IDEPCI_PCIBUS_ORDER
if (!strcmp(s, "ide=reverse")) { if (!strcmp(s, "ide=reverse")) {
ide_scan_direction = 1; ide_scan_direction = 1;
printk(" : Enabled support for IDE inverse scan order.\n"); printk(" : Enabled support for IDE inverse scan order.\n");
return 1; return 1;
} }
#endif /* CONFIG_BLK_DEV_IDEPCI */ #endif
#ifdef CONFIG_BLK_DEV_IDEACPI #ifdef CONFIG_BLK_DEV_IDEACPI
if (!strcmp(s, "ide=noacpi")) { if (!strcmp(s, "ide=noacpi")) {
...@@ -1599,9 +1599,9 @@ extern void __init h8300_ide_init(void); ...@@ -1599,9 +1599,9 @@ extern void __init h8300_ide_init(void);
*/ */
static void __init probe_for_hwifs (void) static void __init probe_for_hwifs (void)
{ {
#ifdef CONFIG_BLK_DEV_IDEPCI #ifdef CONFIG_IDEPCI_PCIBUS_ORDER
ide_scan_pcibus(ide_scan_direction); ide_scan_pcibus(ide_scan_direction);
#endif /* CONFIG_BLK_DEV_IDEPCI */ #endif
#ifdef CONFIG_ETRAX_IDE #ifdef CONFIG_ETRAX_IDE
{ {
......
...@@ -772,6 +772,7 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2, ...@@ -772,6 +772,7 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
EXPORT_SYMBOL_GPL(ide_setup_pci_devices); EXPORT_SYMBOL_GPL(ide_setup_pci_devices);
#ifdef CONFIG_IDEPCI_PCIBUS_ORDER
/* /*
* Module interfaces * Module interfaces
*/ */
...@@ -878,3 +879,4 @@ void __init ide_scan_pcibus (int scan_direction) ...@@ -878,3 +879,4 @@ void __init ide_scan_pcibus (int scan_direction)
__pci_register_driver(d, d->driver.owner, d->driver.mod_name); __pci_register_driver(d, d->driver.owner, d->driver.mod_name);
} }
} }
#endif
...@@ -1205,9 +1205,14 @@ void ide_init_disk(struct gendisk *, ide_drive_t *); ...@@ -1205,9 +1205,14 @@ void ide_init_disk(struct gendisk *, ide_drive_t *);
extern int ideprobe_init(void); extern int ideprobe_init(void);
#ifdef CONFIG_IDEPCI_PCIBUS_ORDER
extern void ide_scan_pcibus(int scan_direction) __init; extern void ide_scan_pcibus(int scan_direction) __init;
extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner, const char *mod_name); extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner, const char *mod_name);
#define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE, KBUILD_MODNAME) #define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE, KBUILD_MODNAME)
#else
#define ide_pci_register_driver(d) pci_register_driver(d)
#endif
void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *); void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d); extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment