dect
/
linux-2.6
Archived
13
0
Fork 0

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:
Bartlomiej Zolnierkiewicz 2008-04-27 15:38:30 +02:00
parent 207daeaabb
commit 6e87543a94
2 changed files with 88 additions and 17 deletions

View File

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

View File

@ -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]);
} }
/* /*