diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-17 18:46:34 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-17 18:46:34 -0400 |
commit | ffd4f6f0eed0423652826f3775077d11918b4180 (patch) | |
tree | f574449a3fa0da029d42b401336adefa42bca06b | |
parent | 26d799b729003220c0f3e5d9e046e1588c011897 (diff) |
ide: add ide-4drives host driver (take 3)
CONFIG_BLK_DEV_4DRIVES deserves its own host driver:
* Add drivers/ide/legacy/ide-4drives.c and move "4drives" support there.
* Add ide-4drives.o in the link order after all other legacy host
drivers enabled by "ide0=" options (they all are mutually exclusive).
* Make ide-4drives host driver probe itself for IDE devices instead of
indirectly depending on ide_generic host driver.
* Add "probe" module parameter to ide-4drives and update documentation.
v2:
* s/paramater/parameter/ in ide.txt. (Noticed by Randy Dunlap)
v3:
* s/ide_4drives.probe/ide-4drives.probe/ in help entry.
(Noticed by Sergei Shtylyov)
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | Documentation/ide/ide.txt | 5 | ||||
-rw-r--r-- | drivers/ide/Kconfig | 4 | ||||
-rw-r--r-- | drivers/ide/ide.c | 15 | ||||
-rw-r--r-- | drivers/ide/legacy/Makefile | 1 | ||||
-rw-r--r-- | drivers/ide/legacy/ide-4drives.c | 46 |
5 files changed, 55 insertions, 16 deletions
diff --git a/Documentation/ide/ide.txt b/Documentation/ide/ide.txt index 18c02df2f78f..486c699f4aea 100644 --- a/Documentation/ide/ide.txt +++ b/Documentation/ide/ide.txt | |||
@@ -222,8 +222,6 @@ Summary of ide driver parameters for kernel command line | |||
222 | both the respective primary and secondary channel | 222 | both the respective primary and secondary channel |
223 | to take effect. | 223 | to take effect. |
224 | 224 | ||
225 | "idex=four" : four drives on idex and ide(x^1) share same ports | ||
226 | |||
227 | "idex=reset" : reset interface after probe | 225 | "idex=reset" : reset interface after probe |
228 | 226 | ||
229 | "idex=ata66" : informs the interface that it has an 80c cable | 227 | "idex=ata66" : informs the interface that it has an 80c cable |
@@ -250,6 +248,9 @@ Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb" | |||
250 | kernel paremeter to enable probing for VLB version of the chipset (PCI ones | 248 | kernel paremeter to enable probing for VLB version of the chipset (PCI ones |
251 | are detected automatically). | 249 | are detected automatically). |
252 | 250 | ||
251 | You also need to use "probe" kernel parameter for ide-4drives driver | ||
252 | (support for IDE generic chipset with four drives on one port). | ||
253 | |||
253 | ================================================================================ | 254 | ================================================================================ |
254 | 255 | ||
255 | Some Terminology | 256 | Some Terminology |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 29dd99caaf50..ec6b4a80e333 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -1035,8 +1035,8 @@ config BLK_DEV_4DRIVES | |||
1035 | Certain older chipsets, including the Tekram 690CD, use a single set | 1035 | Certain older chipsets, including the Tekram 690CD, use a single set |
1036 | of I/O ports at 0x1f0 to control up to four drives, instead of the | 1036 | of I/O ports at 0x1f0 to control up to four drives, instead of the |
1037 | customary two drives per port. Support for this can be enabled at | 1037 | customary two drives per port. Support for this can be enabled at |
1038 | runtime using the "ide0=four" kernel boot parameter if you say Y | 1038 | runtime using the "ide-4drives.probe" kernel boot parameter if you |
1039 | here. | 1039 | say Y here. |
1040 | 1040 | ||
1041 | config BLK_DEV_ALI14XX | 1041 | config BLK_DEV_ALI14XX |
1042 | tristate "ALI M14xx support" | 1042 | tristate "ALI M14xx support" |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index adecf45a0849..690b5ff4d88f 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -976,6 +976,7 @@ extern int probe_dtc2278; | |||
976 | extern int probe_ht6560b; | 976 | extern int probe_ht6560b; |
977 | extern int probe_qd65xx; | 977 | extern int probe_qd65xx; |
978 | extern int cmd640_vlb; | 978 | extern int cmd640_vlb; |
979 | extern int probe_4drives; | ||
979 | 980 | ||
980 | static int __initdata is_chipset_set; | 981 | static int __initdata is_chipset_set; |
981 | 982 | ||
@@ -1187,19 +1188,9 @@ static int __init ide_setup(char *s) | |||
1187 | #endif | 1188 | #endif |
1188 | #ifdef CONFIG_BLK_DEV_4DRIVES | 1189 | #ifdef CONFIG_BLK_DEV_4DRIVES |
1189 | case -11: /* "four" drives on one set of ports */ | 1190 | case -11: /* "four" drives on one set of ports */ |
1190 | { | 1191 | probe_4drives = 1; |
1191 | ide_hwif_t *mate = &ide_hwifs[hw^1]; | ||
1192 | mate->drives[0].select.all ^= 0x20; | ||
1193 | mate->drives[1].select.all ^= 0x20; | ||
1194 | hwif->chipset = mate->chipset = ide_4drives; | ||
1195 | mate->irq = hwif->irq; | ||
1196 | memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports)); | ||
1197 | hwif->mate = mate; | ||
1198 | mate->mate = hwif; | ||
1199 | hwif->serialized = mate->serialized = 1; | ||
1200 | goto obsolete_option; | 1192 | goto obsolete_option; |
1201 | } | 1193 | #endif |
1202 | #endif /* CONFIG_BLK_DEV_4DRIVES */ | ||
1203 | case -10: /* minus10 */ | 1194 | case -10: /* minus10 */ |
1204 | case -9: /* minus9 */ | 1195 | case -9: /* minus9 */ |
1205 | case -8: /* minus8 */ | 1196 | case -8: /* minus8 */ |
diff --git a/drivers/ide/legacy/Makefile b/drivers/ide/legacy/Makefile index 7043ec7d1e05..6939329f89e8 100644 --- a/drivers/ide/legacy/Makefile +++ b/drivers/ide/legacy/Makefile | |||
@@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o | |||
6 | obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o | 6 | obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o |
7 | obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o | 7 | obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o |
8 | obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o | 8 | obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o |
9 | obj-$(CONFIG_BLK_DEV_4DRIVES) += ide-4drives.o | ||
9 | 10 | ||
10 | obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o | 11 | obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o |
11 | obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o | 12 | obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o |
diff --git a/drivers/ide/legacy/ide-4drives.c b/drivers/ide/legacy/ide-4drives.c new file mode 100644 index 000000000000..5aa7e93cfd31 --- /dev/null +++ b/drivers/ide/legacy/ide-4drives.c | |||
@@ -0,0 +1,46 @@ | |||
1 | |||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/init.h> | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/ide.h> | ||
6 | |||
7 | int probe_4drives = 0; | ||
8 | |||
9 | module_param_named(probe, probe_4drives, bool, 0); | ||
10 | MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port"); | ||
11 | |||
12 | static int __init ide_4drives_init(void) | ||
13 | { | ||
14 | ide_hwif_t *hwif, *mate; | ||
15 | u8 idx[4] = { 0, 1, 0xff, 0xff }; | ||
16 | |||
17 | if (probe_4drives == 0) | ||
18 | return -ENODEV; | ||
19 | |||
20 | hwif = &ide_hwifs[0]; | ||
21 | mate = &ide_hwifs[1]; | ||
22 | |||
23 | memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports)); | ||
24 | |||
25 | mate->irq = hwif->irq; | ||
26 | |||
27 | mate->chipset = hwif->chipset = ide_4drives; | ||
28 | |||
29 | mate->drives[0].select.all ^= 0x20; | ||
30 | mate->drives[1].select.all ^= 0x20; | ||
31 | |||
32 | hwif->mate = mate; | ||
33 | mate->mate = hwif; | ||
34 | |||
35 | hwif->serialized = mate->serialized = 1; | ||
36 | |||
37 | ide_device_add(idx, NULL); | ||
38 | |||
39 | return 0; | ||
40 | } | ||
41 | |||
42 | module_init(ide_4drives_init); | ||
43 | |||
44 | MODULE_AUTHOR("Bartlomiej Zolnierkiewicz"); | ||
45 | MODULE_DESCRIPTION("generic IDE chipset with 4 drives/port support"); | ||
46 | MODULE_LICENSE("GPL"); | ||