@@ -130,6 +130,8 @@ static struct legacy_data legacy_data[NR_HOST];
static struct ata_host *legacy_host[NR_HOST];
static int nr_legacy_host;
+static int ignore_ports[NR_HOST];
+static int ignore_ports_count;
static int probe_all; /* Set to check all ISA port ranges */
static int ht6560a; /* HT 6560A on primary 1, second 2, both 3 */
@@ -1168,6 +1170,17 @@ static __init void probe_qdi_vlb(void)
}
}
+static bool port_ignored(int port)
+{
+ int i;
+
+ for (i = 0; i < ignore_ports_count; i++) {
+ if (port == ignore_ports[i])
+ return true;
+ }
+ return false;
+}
+
/**
* legacy_init - attach legacy interfaces
*
@@ -1212,17 +1225,22 @@ static __init int legacy_init(void)
if (winbond == 1)
winbond = 0x130; /* Default port, alt is 1B0 */
- if (primary == 0 || all)
+ if ((primary == 0 || all) && !port_ignored(0x1F0))
legacy_probe_add(0x1F0, 14, UNKNOWN, 0);
- if (secondary == 0 || all)
+ if ((secondary == 0 || all) && !port_ignored(0x170))
legacy_probe_add(0x170, 15, UNKNOWN, 0);
if (probe_all || !pci_present) {
/* ISA/VLB extra ports */
- legacy_probe_add(0x1E8, 11, UNKNOWN, 0);
- legacy_probe_add(0x168, 10, UNKNOWN, 0);
- legacy_probe_add(0x1E0, 8, UNKNOWN, 0);
- legacy_probe_add(0x160, 12, UNKNOWN, 0);
+
+ if (!port_ignored(0x1E8))
+ legacy_probe_add(0x1E8, 11, UNKNOWN, 0);
+ if (!port_ignored(0x168))
+ legacy_probe_add(0x168, 10, UNKNOWN, 0);
+ if (!port_ignored(0x1E0))
+ legacy_probe_add(0x1E0, 8, UNKNOWN, 0);
+ if (!port_ignored(0x160))
+ legacy_probe_add(0x160, 12, UNKNOWN, 0);
}
if (opti82c46x)
@@ -1272,6 +1290,7 @@ module_param(qdi, int, 0);
module_param(winbond, int, 0);
module_param(pio_mask, int, 0);
module_param(iordy_mask, int, 0);
+module_param_array(ignore_ports, int, &ignore_ports_count, 0444);
module_init(legacy_init);
module_exit(legacy_exit);
If there is no PCI bus detected in drivers/ata/pata_legacy.c, it registers all the common legacy PATA devices. This includes I/O ports (0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160) and also their associated interrupts (14,15,11,10,8,12). Unfortunately, on such systems those interrupt lines are at a premium because there is no PCI alternative. This patch allows you to disable individual port/interrupt pairs by providing a list of ports to skip allocating. modprobe pata_legacy ignore_ports=0x1e8,0x168,0x1e0,0x160 Signed-off-by: Matthew Whitehead <tedheadster@gmail.com> --- drivers/ata/pata_legacy.c | 31 +++++++++++++++++++++++++------ 1 files changed, 25 insertions(+), 6 deletions(-)