ide: add "nodma|noflush|noprobe|nowerr=" parameters
* Add "nodma|noflush|noprobe|nowerr=" parameters. * Obsolete "hdx=noprobe|none|nowerr|nodma|noflush" kernel parameters. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
207daeaabb
commit
6e87543a94
|
@ -99,10 +99,10 @@ with hd.c but not with ide.c), then an command line option may be specified
|
||||||
for each drive for which you'd like the drive to skip the hardware
|
for each drive for which you'd like the drive to skip the hardware
|
||||||
probe/identification sequence. For example:
|
probe/identification sequence. For example:
|
||||||
|
|
||||||
hdb=noprobe
|
ide_core.noprobe=0.1
|
||||||
or
|
or
|
||||||
hdc=768,16,32
|
hdc=768,16,32
|
||||||
hdc=noprobe
|
ide_core.noprobe=1.0
|
||||||
|
|
||||||
Note that when only one IDE device is attached to an interface, it should be
|
Note that when only one IDE device is attached to an interface, it should be
|
||||||
jumpered as "single" or "master", *not* "slave". Many folks have had
|
jumpered as "single" or "master", *not* "slave". Many folks have had
|
||||||
|
@ -174,9 +174,7 @@ to /etc/modprobe.conf.
|
||||||
|
|
||||||
When ide.c is used as a module, you can pass command line parameters to the
|
When ide.c is used as a module, you can pass command line parameters to the
|
||||||
driver using the "options=" keyword to insmod, while replacing any ',' with
|
driver using the "options=" keyword to insmod, while replacing any ',' with
|
||||||
';'. For example:
|
';'.
|
||||||
|
|
||||||
insmod ide.o options="hda=nodma hdb=nodma"
|
|
||||||
|
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
|
@ -186,18 +184,10 @@ Summary of ide driver parameters for kernel command line
|
||||||
|
|
||||||
"hdx=" is recognized for all "x" from "a" to "u", such as "hdc".
|
"hdx=" is recognized for all "x" from "a" to "u", such as "hdc".
|
||||||
|
|
||||||
"hdx=noprobe" : drive may be present, but do not probe for it
|
|
||||||
|
|
||||||
"hdx=none" : drive is NOT present, ignore cmos and do not probe
|
|
||||||
|
|
||||||
"hdx=nowerr" : ignore the WRERR_STAT bit on this drive
|
|
||||||
|
|
||||||
"hdx=cdrom" : drive is present, and is a cdrom drive
|
"hdx=cdrom" : drive is present, and is a cdrom drive
|
||||||
|
|
||||||
"hdx=cyl,head,sect" : disk drive is present, with specified geometry
|
"hdx=cyl,head,sect" : disk drive is present, with specified geometry
|
||||||
|
|
||||||
"hdx=nodma" : disallow DMA
|
|
||||||
|
|
||||||
"ide=doubler" : probe/support IDE doublers on Amiga
|
"ide=doubler" : probe/support IDE doublers on Amiga
|
||||||
|
|
||||||
There may be more options than shown -- use the source, Luke!
|
There may be more options than shown -- use the source, Luke!
|
||||||
|
@ -230,6 +220,16 @@ a case please report it as a bug instead) use "ignore_cable" kernel parameter:
|
||||||
* "ignore_cable=[interface_number]" module parameter (for ide_core module)
|
* "ignore_cable=[interface_number]" module parameter (for ide_core module)
|
||||||
if IDE is compiled as module
|
if IDE is compiled as module
|
||||||
|
|
||||||
|
Other kernel parameters for ide_core are:
|
||||||
|
|
||||||
|
* "nodma=[interface_number.device_number]" to disallow DMA for a device
|
||||||
|
|
||||||
|
* "noflush=[interface_number.device_number]" to disable flush requests
|
||||||
|
|
||||||
|
* "noprobe=[interface_number.device_number]" to skip probing
|
||||||
|
|
||||||
|
* "nowerr=[interface_number.device_number]" to ignore the WRERR_STAT bit
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Some Terminology
|
Some Terminology
|
||||||
|
|
|
@ -915,10 +915,10 @@ static int __init ide_setup(char *s)
|
||||||
case -1: /* "none" */
|
case -1: /* "none" */
|
||||||
case -2: /* "noprobe" */
|
case -2: /* "noprobe" */
|
||||||
drive->noprobe = 1;
|
drive->noprobe = 1;
|
||||||
goto done;
|
goto obsolete_option;
|
||||||
case -3: /* "nowerr" */
|
case -3: /* "nowerr" */
|
||||||
drive->bad_wstat = BAD_R_STAT;
|
drive->bad_wstat = BAD_R_STAT;
|
||||||
goto done;
|
goto obsolete_option;
|
||||||
case -4: /* "cdrom" */
|
case -4: /* "cdrom" */
|
||||||
drive->present = 1;
|
drive->present = 1;
|
||||||
drive->media = ide_cdrom;
|
drive->media = ide_cdrom;
|
||||||
|
@ -927,10 +927,10 @@ static int __init ide_setup(char *s)
|
||||||
goto done;
|
goto done;
|
||||||
case -5: /* nodma */
|
case -5: /* nodma */
|
||||||
drive->nodma = 1;
|
drive->nodma = 1;
|
||||||
goto done;
|
goto obsolete_option;
|
||||||
case -11: /* noflush */
|
case -11: /* noflush */
|
||||||
drive->noflush = 1;
|
drive->noflush = 1;
|
||||||
goto done;
|
goto obsolete_option;
|
||||||
case -12: /* "remap" */
|
case -12: /* "remap" */
|
||||||
drive->remap_0_to_1 = 1;
|
drive->remap_0_to_1 = 1;
|
||||||
goto obsolete_option;
|
goto obsolete_option;
|
||||||
|
@ -1125,6 +1125,72 @@ EXPORT_SYMBOL_GPL(ide_pci_clk);
|
||||||
module_param_named(pci_clock, ide_pci_clk, int, 0);
|
module_param_named(pci_clock, ide_pci_clk, int, 0);
|
||||||
MODULE_PARM_DESC(pci_clock, "PCI bus clock frequency (in MHz)");
|
MODULE_PARM_DESC(pci_clock, "PCI bus clock frequency (in MHz)");
|
||||||
|
|
||||||
|
static int ide_set_dev_param_mask(const char *s, struct kernel_param *kp)
|
||||||
|
{
|
||||||
|
int a, b, i, j = 1;
|
||||||
|
unsigned int *dev_param_mask = (unsigned int *)kp->arg;
|
||||||
|
|
||||||
|
if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 &&
|
||||||
|
sscanf(s, "%d.%d", &a, &b) != 2)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
i = a * MAX_DRIVES + b;
|
||||||
|
|
||||||
|
if (i >= MAX_HWIFS * MAX_DRIVES || j < 0 || j > 1)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (j)
|
||||||
|
*dev_param_mask |= (1 << i);
|
||||||
|
else
|
||||||
|
*dev_param_mask &= (1 << i);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int ide_nodma;
|
||||||
|
|
||||||
|
module_param_call(nodma, ide_set_dev_param_mask, NULL, &ide_nodma, 0);
|
||||||
|
MODULE_PARM_DESC(nodma, "disallow DMA for a device");
|
||||||
|
|
||||||
|
static unsigned int ide_noflush;
|
||||||
|
|
||||||
|
module_param_call(noflush, ide_set_dev_param_mask, NULL, &ide_noflush, 0);
|
||||||
|
MODULE_PARM_DESC(noflush, "disable flush requests for a device");
|
||||||
|
|
||||||
|
static unsigned int ide_noprobe;
|
||||||
|
|
||||||
|
module_param_call(noprobe, ide_set_dev_param_mask, NULL, &ide_noprobe, 0);
|
||||||
|
MODULE_PARM_DESC(noprobe, "skip probing for a device");
|
||||||
|
|
||||||
|
static unsigned int ide_nowerr;
|
||||||
|
|
||||||
|
module_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0);
|
||||||
|
MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device");
|
||||||
|
|
||||||
|
static void ide_dev_apply_params(ide_drive_t *drive)
|
||||||
|
{
|
||||||
|
int i = drive->hwif->index * MAX_DRIVES + drive->select.b.unit;
|
||||||
|
|
||||||
|
if (ide_nodma & (1 << i)) {
|
||||||
|
printk(KERN_INFO "ide: disallowing DMA for %s\n", drive->name);
|
||||||
|
drive->nodma = 1;
|
||||||
|
}
|
||||||
|
if (ide_noflush & (1 << i)) {
|
||||||
|
printk(KERN_INFO "ide: disabling flush requests for %s\n",
|
||||||
|
drive->name);
|
||||||
|
drive->noflush = 1;
|
||||||
|
}
|
||||||
|
if (ide_noprobe & (1 << i)) {
|
||||||
|
printk(KERN_INFO "ide: skipping probe for %s\n", drive->name);
|
||||||
|
drive->noprobe = 1;
|
||||||
|
}
|
||||||
|
if (ide_nowerr & (1 << i)) {
|
||||||
|
printk(KERN_INFO "ide: ignoring the WRERR_STAT bit for %s\n",
|
||||||
|
drive->name);
|
||||||
|
drive->bad_wstat = BAD_R_STAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned int ide_ignore_cable;
|
static unsigned int ide_ignore_cable;
|
||||||
|
|
||||||
static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
|
static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
|
||||||
|
@ -1150,11 +1216,16 @@ MODULE_PARM_DESC(ignore_cable, "ignore cable detection");
|
||||||
|
|
||||||
void ide_port_apply_params(ide_hwif_t *hwif)
|
void ide_port_apply_params(ide_hwif_t *hwif)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
if (ide_ignore_cable & (1 << hwif->index)) {
|
if (ide_ignore_cable & (1 << hwif->index)) {
|
||||||
printk(KERN_INFO "ide: ignoring cable detection for %s\n",
|
printk(KERN_INFO "ide: ignoring cable detection for %s\n",
|
||||||
hwif->name);
|
hwif->name);
|
||||||
hwif->cbl = ATA_CBL_PATA40_SHORT;
|
hwif->cbl = ATA_CBL_PATA40_SHORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_DRIVES; i++)
|
||||||
|
ide_dev_apply_params(&hwif->drives[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Reference in New Issue