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>
This commit is contained in:
Bartlomiej Zolnierkiewicz 2008-04-18 00:46:34 +02:00
parent 26d799b729
commit ffd4f6f0ee
5 changed files with 55 additions and 16 deletions

View File

@ -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"
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

View File

@ -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"

View File

@ -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)
#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 */

View File

@ -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

View File

@ -0,0 +1,46 @@
#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");