diff options
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r-- | drivers/ide/ide.c | 71 |
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: | |||
975 | obsolete_option: | 975 | obsolete_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; |
978 | done: | ||
979 | printk("\n"); | ||
980 | return 1; | ||
981 | } | 978 | } |
982 | 979 | ||
983 | EXPORT_SYMBOL(ide_lock); | 980 | EXPORT_SYMBOL(ide_lock); |
@@ -1167,6 +1164,51 @@ static unsigned int ide_nowerr; | |||
1167 | module_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0); | 1164 | module_param_call(nowerr, ide_set_dev_param_mask, NULL, &ide_nowerr, 0); |
1168 | MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device"); | 1165 | MODULE_PARM_DESC(nowerr, "ignore the WRERR_STAT bit for a device"); |
1169 | 1166 | ||
1167 | static unsigned int ide_cdroms; | ||
1168 | |||
1169 | module_param_call(cdrom, ide_set_dev_param_mask, NULL, &ide_cdroms, 0); | ||
1170 | MODULE_PARM_DESC(cdrom, "force device as a CD-ROM"); | ||
1171 | |||
1172 | struct chs_geom { | ||
1173 | unsigned int cyl; | ||
1174 | u8 head; | ||
1175 | u8 sect; | ||
1176 | }; | ||
1177 | |||
1178 | static unsigned int ide_disks; | ||
1179 | static struct chs_geom ide_disks_chs[MAX_HWIFS * MAX_DRIVES]; | ||
1180 | |||
1181 | static 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 | |||
1209 | module_param_call(chs, ide_set_disk_chs, NULL, NULL, 0); | ||
1210 | MODULE_PARM_DESC(chs, "force device as a disk (using CHS)"); | ||
1211 | |||
1170 | static void ide_dev_apply_params(ide_drive_t *drive) | 1212 | static 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 | ||
1194 | static unsigned int ide_ignore_cable; | 1255 | static unsigned int ide_ignore_cable; |