Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4706a7e0 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

ide: add "cdrom=" and "chs=" parameters



* Add "cdrom=" and "chs=" parameters.

* Obsolete "hdx=cdrom" and "hdx=cyls,heads,sects" kernel parameters.

Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 6e87543a
Loading
Loading
Loading
Loading
+14 −17
Original line number Diff line number Diff line
@@ -82,17 +82,16 @@ Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
For really weird situations, the apparent (fdisk) geometry can also be specified
on the kernel "command line" using LILO.  The format of such lines is:

	hdx=cyls,heads,sects
or	hdx=cdrom
	ide_core.chs=[interface_number.device_number]:cyls,heads,sects
or	ide_core.cdrom=[interface_number.device_number]

where hdx can be any of hda through hdh, Three values are required
(cyls,heads,sects).  For example:
For example:

	hdc=1050,32,64  hdd=cdrom
	ide_core.chs=1.0:1050,32,64  ide_core.cdrom=1.1

either {hda,hdb} or {hdc,hdd}.  The results of successful auto-probing may
override the physical geometry/irq specified, though the "original" geometry
may be retained as the "logical" geometry for partitioning purposes (fdisk).
The results of successful auto-probing may override the physical geometry/irq
specified, though the "original" geometry may be retained as the "logical"
geometry for partitioning purposes (fdisk).

If the auto-probing during boot time confuses a drive (ie. the drive works
with hd.c but not with ide.c), then an command line option may be specified
@@ -101,7 +100,7 @@ probe/identification sequence. For example:

	ide_core.noprobe=0.1
or
	hdc=768,16,32
	ide_core.chs=1.0:768,16,32
	ide_core.noprobe=1.0

Note that when only one IDE device is attached to an interface, it should be
@@ -118,9 +117,9 @@ If for some reason your cdrom drive is *not* found at boot time, you can force
the probe to look harder by supplying a kernel command line parameter
via LILO, such as:

	hdc=cdrom	/* hdc = "master" on second interface */
	ide_core.cdrom=1.0	/* "master" on second interface (hdc) */
or
	hdd=cdrom	/* hdd = "slave" on second interface */
	ide_core.cdrom=1.1	/* "slave" on second interface (hdd) */

For example, a GW2000 system might have a hard drive on the primary
interface (/dev/hda) and an IDE cdrom drive on the secondary interface
@@ -182,12 +181,6 @@ driver using the "options=" keyword to insmod, while replacing any ',' with
Summary of ide driver parameters for kernel command line
--------------------------------------------------------

 "hdx="  is recognized for all "x" from "a" to "u", such as "hdc".

 "hdx=cdrom"		: drive is present, and is a cdrom drive

 "hdx=cyl,head,sect"	: disk drive is present, with specified geometry

 "ide=doubler"		: probe/support IDE doublers on Amiga

There may be more options than shown -- use the source, Luke!
@@ -230,6 +223,10 @@ Other kernel parameters for ide_core are:

* "nowerr=[interface_number.device_number]" to ignore the WRERR_STAT bit

* "cdrom=[interface_number.device_number]" to force device as a CD-ROM

* "chs=[interface_number.device_number]" to force device as a disk (using CHS)

================================================================================

Some Terminology
+66 −5
Original line number Diff line number Diff line
@@ -924,7 +924,7 @@ static int __init ide_setup(char *s)
				drive->media = ide_cdrom;
				/* an ATAPI device ignores DRDY */
				drive->ready_stat = 0;
				goto done;
				goto obsolete_option;
			case -5: /* nodma */
				drive->nodma = 1;
				goto obsolete_option;
@@ -948,7 +948,7 @@ static int __init ide_setup(char *s)
				drive->sect	= drive->bios_sect = vals[2];
				drive->present	= 1;
				drive->forced_geom = 1;
				goto done;
				goto obsolete_option;
			default:
				goto bad_option;
		}
@@ -975,9 +975,6 @@ static int __init ide_setup(char *s)
obsolete_option:
	printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n");
	return 1;
done:
	printk("\n");
	return 1;
}

EXPORT_SYMBOL(ide_lock);
@@ -1167,6 +1164,51 @@ 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 unsigned int ide_cdroms;

module_param_call(cdrom, ide_set_dev_param_mask, NULL, &ide_cdroms, 0);
MODULE_PARM_DESC(cdrom, "force device as a CD-ROM");

struct chs_geom {
	unsigned int	cyl;
	u8		head;
	u8		sect;
};

static unsigned int ide_disks;
static struct chs_geom ide_disks_chs[MAX_HWIFS * MAX_DRIVES];

static int ide_set_disk_chs(const char *str, struct kernel_param *kp)
{
	int a, b, c = 0, h = 0, s = 0, i, j = 1;

	if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 &&
	    sscanf(str, "%d.%d:%d", &a, &b, &j) != 3)
		return -EINVAL;

	i = a * MAX_DRIVES + b;

	if (i >= MAX_HWIFS * MAX_DRIVES || j < 0 || j > 1)
		return -EINVAL;

	if (c > INT_MAX || h > 255 || s > 255)
		return -EINVAL;

	if (j)
		ide_disks |= (1 << i);
	else
		ide_disks &= (1 << i);

	ide_disks_chs[i].cyl  = c;
	ide_disks_chs[i].head = h;
	ide_disks_chs[i].sect = s;

	return 0;
}

module_param_call(chs, ide_set_disk_chs, NULL, NULL, 0);
MODULE_PARM_DESC(chs, "force device as a disk (using CHS)");

static void ide_dev_apply_params(ide_drive_t *drive)
{
	int i = drive->hwif->index * MAX_DRIVES + drive->select.b.unit;
@@ -1189,6 +1231,25 @@ static void ide_dev_apply_params(ide_drive_t *drive)
				 drive->name);
		drive->bad_wstat = BAD_R_STAT;
	}
	if (ide_cdroms & (1 << i)) {
		printk(KERN_INFO "ide: forcing %s as a CD-ROM\n", drive->name);
		drive->present = 1;
		drive->media = ide_cdrom;
		/* an ATAPI device ignores DRDY */
		drive->ready_stat = 0;
	}
	if (ide_disks & (1 << i)) {
		drive->cyl  = drive->bios_cyl  = ide_disks_chs[i].cyl;
		drive->head = drive->bios_head = ide_disks_chs[i].head;
		drive->sect = drive->bios_sect = ide_disks_chs[i].sect;
		drive->forced_geom = 1;
		printk(KERN_INFO "ide: forcing %s as a disk (%d/%d/%d)\n",
				 drive->name,
				 drive->cyl, drive->head, drive->sect);
		drive->present = 1;
		drive->media = ide_disk;
		drive->ready_stat = READY_STAT;
	}
}

static unsigned int ide_ignore_cable;