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

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

* Obsolete "hdx=cdrom" and "hdx=cyls,heads,sects" 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 6e87543a94
commit 4706a7e03a
2 changed files with 80 additions and 22 deletions

View file

@ -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 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: on the kernel "command line" using LILO. The format of such lines is:
hdx=cyls,heads,sects ide_core.chs=[interface_number.device_number]:cyls,heads,sects
or hdx=cdrom or ide_core.cdrom=[interface_number.device_number]
where hdx can be any of hda through hdh, Three values are required For example:
(cyls,heads,sects). 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 The results of successful auto-probing may override the physical geometry/irq
override the physical geometry/irq specified, though the "original" geometry specified, though the "original" geometry may be retained as the "logical"
may be retained as the "logical" geometry for partitioning purposes (fdisk). geometry for partitioning purposes (fdisk).
If the auto-probing during boot time confuses a drive (ie. the drive works 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 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 ide_core.noprobe=0.1
or or
hdc=768,16,32 ide_core.chs=1.0:768,16,32
ide_core.noprobe=1.0 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
@ -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 the probe to look harder by supplying a kernel command line parameter
via LILO, such as: via LILO, such as:
hdc=cdrom /* hdc = "master" on second interface */ ide_core.cdrom=1.0 /* "master" on second interface (hdc) */
or 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 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 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 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 "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 +223,10 @@ Other kernel parameters for ide_core are:
* "nowerr=[interface_number.device_number]" to ignore the WRERR_STAT bit * "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 Some Terminology

View file

@ -924,7 +924,7 @@ static int __init ide_setup(char *s)
drive->media = ide_cdrom; drive->media = ide_cdrom;
/* an ATAPI device ignores DRDY */ /* an ATAPI device ignores DRDY */
drive->ready_stat = 0; drive->ready_stat = 0;
goto done; goto obsolete_option;
case -5: /* nodma */ case -5: /* nodma */
drive->nodma = 1; drive->nodma = 1;
goto obsolete_option; goto obsolete_option;
@ -948,7 +948,7 @@ static int __init ide_setup(char *s)
drive->sect = drive->bios_sect = vals[2]; drive->sect = drive->bios_sect = vals[2];
drive->present = 1; drive->present = 1;
drive->forced_geom = 1; drive->forced_geom = 1;
goto done; goto obsolete_option;
default: default:
goto bad_option; goto bad_option;
} }
@ -975,9 +975,6 @@ bad_option:
obsolete_option: obsolete_option:
printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n"); printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n");
return 1; return 1;
done:
printk("\n");
return 1;
} }
EXPORT_SYMBOL(ide_lock); 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_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0);
MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device"); 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) static void ide_dev_apply_params(ide_drive_t *drive)
{ {
int i = drive->hwif->index * MAX_DRIVES + drive->select.b.unit; 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->name);
drive->bad_wstat = BAD_R_STAT; 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; static unsigned int ide_ignore_cable;