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: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 26d799b7
...@@ -222,8 +222,6 @@ Summary of ide driver parameters for kernel command line ...@@ -222,8 +222,6 @@ Summary of ide driver parameters for kernel command line
both the respective primary and secondary channel both the respective primary and secondary channel
to take effect. to take effect.
"idex=four" : four drives on idex and ide(x^1) share same ports
"idex=reset" : reset interface after probe "idex=reset" : reset interface after probe
"idex=ata66" : informs the interface that it has an 80c cable "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,6 +248,9 @@ Also for legacy CMD640 host driver (cmd640) you need to use "probe_vlb"
kernel paremeter to enable probing for VLB version of the chipset (PCI ones kernel paremeter to enable probing for VLB version of the chipset (PCI ones
are detected automatically). are detected automatically).
You also need to use "probe" kernel parameter for ide-4drives driver
(support for IDE generic chipset with four drives on one port).
================================================================================ ================================================================================
Some Terminology Some Terminology
......
...@@ -1035,8 +1035,8 @@ config BLK_DEV_4DRIVES ...@@ -1035,8 +1035,8 @@ config BLK_DEV_4DRIVES
Certain older chipsets, including the Tekram 690CD, use a single set Certain older chipsets, including the Tekram 690CD, use a single set
of I/O ports at 0x1f0 to control up to four drives, instead of the of I/O ports at 0x1f0 to control up to four drives, instead of the
customary two drives per port. Support for this can be enabled at customary two drives per port. Support for this can be enabled at
runtime using the "ide0=four" kernel boot parameter if you say Y runtime using the "ide-4drives.probe" kernel boot parameter if you
here. say Y here.
config BLK_DEV_ALI14XX config BLK_DEV_ALI14XX
tristate "ALI M14xx support" tristate "ALI M14xx support"
......
...@@ -976,6 +976,7 @@ extern int probe_dtc2278; ...@@ -976,6 +976,7 @@ extern int probe_dtc2278;
extern int probe_ht6560b; extern int probe_ht6560b;
extern int probe_qd65xx; extern int probe_qd65xx;
extern int cmd640_vlb; extern int cmd640_vlb;
extern int probe_4drives;
static int __initdata is_chipset_set; static int __initdata is_chipset_set;
...@@ -1187,19 +1188,9 @@ static int __init ide_setup(char *s) ...@@ -1187,19 +1188,9 @@ static int __init ide_setup(char *s)
#endif #endif
#ifdef CONFIG_BLK_DEV_4DRIVES #ifdef CONFIG_BLK_DEV_4DRIVES
case -11: /* "four" drives on one set of ports */ case -11: /* "four" drives on one set of ports */
{ probe_4drives = 1;
ide_hwif_t *mate = &ide_hwifs[hw^1];
mate->drives[0].select.all ^= 0x20;
mate->drives[1].select.all ^= 0x20;
hwif->chipset = mate->chipset = ide_4drives;
mate->irq = hwif->irq;
memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
hwif->mate = mate;
mate->mate = hwif;
hwif->serialized = mate->serialized = 1;
goto obsolete_option; goto obsolete_option;
} #endif
#endif /* CONFIG_BLK_DEV_4DRIVES */
case -10: /* minus10 */ case -10: /* minus10 */
case -9: /* minus9 */ case -9: /* minus9 */
case -8: /* minus8 */ case -8: /* minus8 */
......
...@@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o ...@@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_UMC8672) += umc8672.o
obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o obj-$(CONFIG_BLK_DEV_DTC2278) += dtc2278.o
obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o obj-$(CONFIG_BLK_DEV_HT6560B) += ht6560b.o
obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o obj-$(CONFIG_BLK_DEV_QD65XX) += qd65xx.o
obj-$(CONFIG_BLK_DEV_4DRIVES) += ide-4drives.o
obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o obj-$(CONFIG_BLK_DEV_GAYLE) += gayle.o
obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o obj-$(CONFIG_BLK_DEV_FALCON_IDE) += falconide.o
......
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/ide.h>
int probe_4drives = 0;
module_param_named(probe, probe_4drives, bool, 0);
MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port");
static int __init ide_4drives_init(void)
{
ide_hwif_t *hwif, *mate;
u8 idx[4] = { 0, 1, 0xff, 0xff };
if (probe_4drives == 0)
return -ENODEV;
hwif = &ide_hwifs[0];
mate = &ide_hwifs[1];
memcpy(mate->io_ports, hwif->io_ports, sizeof(hwif->io_ports));
mate->irq = hwif->irq;
mate->chipset = hwif->chipset = ide_4drives;
mate->drives[0].select.all ^= 0x20;
mate->drives[1].select.all ^= 0x20;
hwif->mate = mate;
mate->mate = hwif;
hwif->serialized = mate->serialized = 1;
ide_device_add(idx, NULL);
return 0;
}
module_init(ide_4drives_init);
MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
MODULE_DESCRIPTION("generic IDE chipset with 4 drives/port support");
MODULE_LICENSE("GPL");
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