aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-27 09:38:30 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-27 09:38:30 -0400
commit4706a7e03a03d6d206a93a49a0c723dd612cf8e9 (patch)
treeaa78320ae86d353d1cdbd818deb8e0ddeaf8893d /drivers/ide/ide.c
parent6e87543a94fb2a966c81a61fc91246592f9719da (diff)
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>
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r--drivers/ide/ide.c71
1 files changed, 66 insertions, 5 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index d8f40ee74ce8..a4bceeecde70 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -924,7 +924,7 @@ static int __init ide_setup(char *s)
924 drive->media = ide_cdrom; 924 drive->media = ide_cdrom;
925 /* an ATAPI device ignores DRDY */ 925 /* an ATAPI device ignores DRDY */
926 drive->ready_stat = 0; 926 drive->ready_stat = 0;
927 goto done; 927 goto obsolete_option;
928 case -5: /* nodma */ 928 case -5: /* nodma */
929 drive->nodma = 1; 929 drive->nodma = 1;
930 goto obsolete_option; 930 goto obsolete_option;
@@ -948,7 +948,7 @@ static int __init ide_setup(char *s)
948 drive->sect = drive->bios_sect = vals[2]; 948 drive->sect = drive->bios_sect = vals[2];
949 drive->present = 1; 949 drive->present = 1;
950 drive->forced_geom = 1; 950 drive->forced_geom = 1;
951 goto done; 951 goto obsolete_option;
952 default: 952 default:
953 goto bad_option; 953 goto bad_option;
954 } 954 }
@@ -975,9 +975,6 @@ bad_option:
975obsolete_option: 975obsolete_option:
976 printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n"); 976 printk(" -- OBSOLETE OPTION, WILL BE REMOVED SOON!\n");
977 return 1; 977 return 1;
978done:
979 printk("\n");
980 return 1;
981} 978}
982 979
983EXPORT_SYMBOL(ide_lock); 980EXPORT_SYMBOL(ide_lock);
@@ -1167,6 +1164,51 @@ static unsigned int ide_nowerr;
1167module_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0); 1164module_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0);
1168MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device"); 1165MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device");
1169 1166
1167static unsigned int ide_cdroms;
1168
1169module_param_call(cdrom, ide_set_dev_param_mask, NULL, &ide_cdroms, 0);
1170MODULE_PARM_DESC(cdrom, "force device as a CD-ROM");
1171
1172struct chs_geom {
1173 unsigned int cyl;
1174 u8 head;
1175 u8 sect;
1176};
1177
1178static unsigned int ide_disks;
1179static struct chs_geom ide_disks_chs[MAX_HWIFS * MAX_DRIVES];
1180
1181static int ide_set_disk_chs(const char *str, struct kernel_param *kp)
1182{
1183 int a, b, c = 0, h = 0, s = 0, i, j = 1;
1184
1185 if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 &&
1186 sscanf(str, "%d.%d:%d", &a, &b, &j) != 3)
1187 return -EINVAL;
1188
1189 i = a * MAX_DRIVES + b;
1190
1191 if (i >= MAX_HWIFS * MAX_DRIVES || j < 0 || j > 1)
1192 return -EINVAL;
1193
1194 if (c > INT_MAX || h > 255 || s > 255)
1195 return -EINVAL;
1196
1197 if (j)
1198 ide_disks |= (1 << i);
1199 else
1200 ide_disks &= (1 << i);
1201
1202 ide_disks_chs[i].cyl = c;
1203 ide_disks_chs[i].head = h;
1204 ide_disks_chs[i].sect = s;
1205
1206 return 0;
1207}
1208
1209module_param_call(chs, ide_set_disk_chs, NULL, NULL, 0);
1210MODULE_PARM_DESC(chs, "force device as a disk (using CHS)");
1211
1170static void ide_dev_apply_params(ide_drive_t *drive) 1212static void ide_dev_apply_params(ide_drive_t *drive)
1171{ 1213{
1172 int i = drive->hwif->index * MAX_DRIVES + drive->select.b.unit; 1214 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)
1189 drive->name); 1231 drive->name);
1190 drive->bad_wstat = BAD_R_STAT; 1232 drive->bad_wstat = BAD_R_STAT;
1191 } 1233 }
1234 if (ide_cdroms & (1 << i)) {
1235 printk(KERN_INFO "ide: forcing %s as a CD-ROM\n", drive->name);
1236 drive->present = 1;
1237 drive->media = ide_cdrom;
1238 /* an ATAPI device ignores DRDY */
1239 drive->ready_stat = 0;
1240 }
1241 if (ide_disks & (1 << i)) {
1242 drive->cyl = drive->bios_cyl = ide_disks_chs[i].cyl;
1243 drive->head = drive->bios_head = ide_disks_chs[i].head;
1244 drive->sect = drive->bios_sect = ide_disks_chs[i].sect;
1245 drive->forced_geom = 1;
1246 printk(KERN_INFO "ide: forcing %s as a disk (%d/%d/%d)\n",
1247 drive->name,
1248 drive->cyl, drive->head, drive->sect);
1249 drive->present = 1;
1250 drive->media = ide_disk;
1251 drive->ready_stat = READY_STAT;
1252 }
1192} 1253}
1193 1254
1194static unsigned int ide_ignore_cable; 1255static unsigned int ide_ignore_cable;