Commit 6e87543a authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

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: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 207daeaa
Loading
Loading
Loading
Loading
+13 −13
Original line number Original line Diff line number Diff line
@@ -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
+75 −4
Original line number Original line Diff line number Diff line
@@ -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]);
}
}


/*
/*