Commit 6a0b3e79 authored by Martin Dalecki's avatar Martin Dalecki Committed by Linus Torvalds

[PATCH] 2.5.8-pre3 IDE 32

- Don't provide symbolic links in /proc/ide - they are redundant data.

- Try to use a more reasonable default capacity value in ata_capacity().

- Fix ata_put() ata_get() usage in ide_check_media_change().

- Small readability fixes to the option parsing code.

- Apply Vojtech Pavliks /proc PIIX output fix.

- Replace all occurrences of ide_wait_taskfile() with ide_raw_taskfile().  One
   duplicated code path fewer.
parent 78cb05eb
...@@ -386,23 +386,22 @@ static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *dr ...@@ -386,23 +386,22 @@ static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *dr
{ {
MOD_INC_USE_COUNT; MOD_INC_USE_COUNT;
if (drive->removable && drive->usage == 1) { if (drive->removable && drive->usage == 1) {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
check_disk_change(inode->i_rdev); check_disk_change(inode->i_rdev);
taskfile.command = WIN_DOORLOCK; memset(&args, 0, sizeof(args));
args.taskfile.command = WIN_DOORLOCK;
ide_cmd_type_parser(&args);
/* /*
* Ignore the return code from door_lock, * Ignore the return code from door_lock, since the open() has
* since the open() has already succeeded, * already succeeded, and the door_lock is irrelevant at this
* and the door_lock is irrelevant at this point. * point.
*/ */
if (drive->doorlocking &&
ide_wait_taskfile(drive, &taskfile, &hobfile, NULL)) if (drive->doorlocking && ide_raw_taskfile(drive, &args, NULL))
drive->doorlocking = 0; drive->doorlocking = 0;
} }
return 0; return 0;
...@@ -410,33 +409,33 @@ static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *dr ...@@ -410,33 +409,33 @@ static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *dr
static int idedisk_flushcache(ide_drive_t *drive) static int idedisk_flushcache(ide_drive_t *drive)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&args, 0, sizeof(args));
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
if (drive->id->cfs_enable_2 & 0x2400) if (drive->id->cfs_enable_2 & 0x2400)
taskfile.command = WIN_FLUSH_CACHE_EXT; args.taskfile.command = WIN_FLUSH_CACHE_EXT;
else else
taskfile.command = WIN_FLUSH_CACHE; args.taskfile.command = WIN_FLUSH_CACHE;
return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL); ide_cmd_type_parser(&args);
return ide_raw_taskfile(drive, &args, NULL);
} }
static void idedisk_release (struct inode *inode, struct file *filp, ide_drive_t *drive) static void idedisk_release (struct inode *inode, struct file *filp, ide_drive_t *drive)
{ {
if (drive->removable && !drive->usage) { if (drive->removable && !drive->usage) {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
invalidate_bdev(inode->i_bdev, 0); invalidate_bdev(inode->i_bdev, 0);
taskfile.command = WIN_DOORUNLOCK; memset(&args, 0, sizeof(args));
args.taskfile.command = WIN_DOORUNLOCK;
ide_cmd_type_parser(&args);
if (drive->doorlocking && if (drive->doorlocking &&
ide_wait_taskfile(drive, &taskfile, &hobfile, NULL)) ide_raw_taskfile(drive, &args, NULL))
drive->doorlocking = 0; drive->doorlocking = 0;
} }
if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache) if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
...@@ -601,7 +600,7 @@ static inline int idedisk_supports_host_protected_area(ide_drive_t *drive) ...@@ -601,7 +600,7 @@ static inline int idedisk_supports_host_protected_area(ide_drive_t *drive)
return flag; return flag;
} }
#endif /* CONFIG_IDEDISK_STROKE */ #endif
/* /*
* Compute drive->capacity, the full capacity of the drive * Compute drive->capacity, the full capacity of the drive
...@@ -767,45 +766,50 @@ static void idedisk_pre_reset (ide_drive_t *drive) ...@@ -767,45 +766,50 @@ static void idedisk_pre_reset (ide_drive_t *drive)
static int smart_enable(ide_drive_t *drive) static int smart_enable(ide_drive_t *drive)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr)); memset(&args, 0, sizeof(args));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr)); args.taskfile.feature = SMART_ENABLE;
taskfile.feature = SMART_ENABLE; args.taskfile.low_cylinder = SMART_LCYL_PASS;
taskfile.low_cylinder = SMART_LCYL_PASS; args.taskfile.high_cylinder = SMART_HCYL_PASS;
taskfile.high_cylinder = SMART_HCYL_PASS; args.taskfile.command = WIN_SMART;
taskfile.command = WIN_SMART; ide_cmd_type_parser(&args);
return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
return ide_raw_taskfile(drive, &args, NULL);
} }
static int get_smart_values(ide_drive_t *drive, byte *buf) static int get_smart_values(ide_drive_t *drive, u8 *buf)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr)); memset(&args, 0, sizeof(args));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr)); args.taskfile.feature = SMART_READ_VALUES;
taskfile.feature = SMART_READ_VALUES; args.taskfile.sector_count = 0x01;
taskfile.sector_count = 0x01; args.taskfile.low_cylinder = SMART_LCYL_PASS;
taskfile.low_cylinder = SMART_LCYL_PASS; args.taskfile.high_cylinder = SMART_HCYL_PASS;
taskfile.high_cylinder = SMART_HCYL_PASS; args.taskfile.command = WIN_SMART;
taskfile.command = WIN_SMART; ide_cmd_type_parser(&args);
smart_enable(drive); smart_enable(drive);
return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
return ide_raw_taskfile(drive, &args, buf);
} }
static int get_smart_thresholds(ide_drive_t *drive, byte *buf) static int get_smart_thresholds(ide_drive_t *drive, u8 *buf)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr)); memset(&args, 0, sizeof(args));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr)); args.taskfile.feature = SMART_READ_THRESHOLDS;
taskfile.feature = SMART_READ_THRESHOLDS; args.taskfile.sector_count = 0x01;
taskfile.sector_count = 0x01; args.taskfile.low_cylinder = SMART_LCYL_PASS;
taskfile.low_cylinder = SMART_LCYL_PASS; args.taskfile.high_cylinder = SMART_HCYL_PASS;
taskfile.high_cylinder = SMART_HCYL_PASS; args.taskfile.command = WIN_SMART;
taskfile.command = WIN_SMART; ide_cmd_type_parser(&args);
smart_enable(drive); smart_enable(drive);
return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
return ide_raw_taskfile(drive, &args, buf);
} }
static int proc_idedisk_read_cache static int proc_idedisk_read_cache
...@@ -947,7 +951,7 @@ static int set_multcount(ide_drive_t *drive, int arg) ...@@ -947,7 +951,7 @@ static int set_multcount(ide_drive_t *drive, int arg)
ide_init_drive_cmd (&rq); ide_init_drive_cmd (&rq);
drive->mult_req = arg; drive->mult_req = arg;
drive->special.b.set_multmode = 1; drive->special.b.set_multmode = 1;
(void) ide_do_drive_cmd (drive, &rq, ide_wait); ide_do_drive_cmd (drive, &rq, ide_wait);
return (drive->mult_count == arg) ? 0 : -EIO; return (drive->mult_count == arg) ? 0 : -EIO;
} }
...@@ -963,44 +967,46 @@ static int set_nowerr(ide_drive_t *drive, int arg) ...@@ -963,44 +967,46 @@ static int set_nowerr(ide_drive_t *drive, int arg)
static int write_cache(ide_drive_t *drive, int arg) static int write_cache(ide_drive_t *drive, int arg)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
taskfile.feature = (arg) ? SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
taskfile.command = WIN_SETFEATURES;
if (!(drive->id->cfs_enable_2 & 0x3000)) if (!(drive->id->cfs_enable_2 & 0x3000))
return 1; return 1;
ide_wait_taskfile(drive, &taskfile, &hobfile, NULL); memset(&args, 0, sizeof(args));
args.taskfile.feature = (arg) ? SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
args.taskfile.command = WIN_SETFEATURES;
ide_cmd_type_parser(&args);
ide_raw_taskfile(drive, &args, NULL);
drive->wcache = arg; drive->wcache = arg;
return 0; return 0;
} }
static int idedisk_standby(ide_drive_t *drive) static int idedisk_standby(ide_drive_t *drive)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr)); memset(&args, 0, sizeof(args));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr)); args.taskfile.command = WIN_STANDBYNOW1;
taskfile.command = WIN_STANDBYNOW1; ide_cmd_type_parser(&args);
return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
return ide_raw_taskfile(drive, &args, NULL);
} }
static int set_acoustic(ide_drive_t *drive, int arg) static int set_acoustic(ide_drive_t *drive, int arg)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
taskfile.feature = (arg)?SETFEATURES_EN_AAM:SETFEATURES_DIS_AAM; memset(&args, 0, sizeof(args));
taskfile.sector_count = arg; args.taskfile.feature = (arg)?SETFEATURES_EN_AAM:SETFEATURES_DIS_AAM;
args.taskfile.sector_count = arg;
args.taskfile.command = WIN_SETFEATURES;
ide_cmd_type_parser(&args);
ide_raw_taskfile(drive, &args, NULL);
taskfile.command = WIN_SETFEATURES;
ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
drive->acoustic = arg; drive->acoustic = arg;
return 0; return 0;
} }
......
/* /*
* linux/drivers/ide/ide-proc.c Version 1.03 January 2, 1998
*
* Copyright (C) 1997-1998 Mark Lord * Copyright (C) 1997-1998 Mark Lord
*/ *
/*
* This is the /proc/ide/ filesystem implementation. * This is the /proc/ide/ filesystem implementation.
* *
* The major reason this exists is to provide sufficient access * The major reason this exists is to provide sufficient access
...@@ -176,26 +172,26 @@ static int proc_ide_read_channel ...@@ -176,26 +172,26 @@ static int proc_ide_read_channel
PROC_IDE_READ_RETURN(page,start,off,count,eof,len); PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
} }
static int proc_ide_get_identify(ide_drive_t *drive, byte *buf) static int get_identify(ide_drive_t *drive, u8 *buf)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
struct hd_drive_hob_hdr hobfile;
memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
taskfile.sector_count = 0x01; memset(&args, 0, sizeof(args));
taskfile.command = (drive->type == ATA_DISK) ? WIN_IDENTIFY : WIN_PIDENTIFY ; args.taskfile.sector_count = 0x01;
args.taskfile.command = (drive->type == ATA_DISK) ? WIN_IDENTIFY : WIN_PIDENTIFY ;
ide_cmd_type_parser(&args);
return ide_wait_taskfile(drive, &taskfile, &hobfile, buf); return ide_raw_taskfile(drive, &args, buf);
} }
static int proc_ide_read_identify static int proc_ide_read_identify
(char *page, char **start, off_t off, int count, int *eof, void *data) (char *page, char **start, off_t off, int count, int *eof, void *data)
{ {
ide_drive_t *drive = data; ide_drive_t *drive = data;
int len = 0, i = 0; int len = 0;
int i = 0;
if (drive && !proc_ide_get_identify(drive, page)) { if (drive && !get_identify(drive, page)) {
unsigned short *val = (unsigned short *) page; unsigned short *val = (unsigned short *) page;
char *out = ((char *)val) + (SECTOR_WORDS * 4); char *out = ((char *)val) + (SECTOR_WORDS * 4);
page = out; page = out;
...@@ -204,8 +200,7 @@ static int proc_ide_read_identify ...@@ -204,8 +200,7 @@ static int proc_ide_read_identify
val += 1; val += 1;
} while (i < (SECTOR_WORDS * 2)); } while (i < (SECTOR_WORDS * 2));
len = out - page; len = out - page;
} } else
else
len = sprintf(page, "\n"); len = sprintf(page, "\n");
PROC_IDE_READ_RETURN(page,start,off,count,eof,len); PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
} }
...@@ -422,6 +417,8 @@ void ide_remove_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p) ...@@ -422,6 +417,8 @@ void ide_remove_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p)
} }
} }
/* FIXME: we should iterate over the hwifs here as everywhere else.
*/
static void create_proc_ide_drives(struct ata_channel *hwif) static void create_proc_ide_drives(struct ata_channel *hwif)
{ {
int d; int d;
...@@ -447,8 +444,6 @@ static void create_proc_ide_drives(struct ata_channel *hwif) ...@@ -447,8 +444,6 @@ static void create_proc_ide_drives(struct ata_channel *hwif)
} }
} }
sprintf(name,"ide%d/%s", (drive->name[2]-'a')/2, drive->name); sprintf(name,"ide%d/%s", (drive->name[2]-'a')/2, drive->name);
ent = proc_symlink(drive->name, proc_ide_root, name);
if (!ent) return;
} }
} }
......
...@@ -891,39 +891,6 @@ void init_taskfile_request(struct request *rq) ...@@ -891,39 +891,6 @@ void init_taskfile_request(struct request *rq)
rq->flags = REQ_DRIVE_TASKFILE; rq->flags = REQ_DRIVE_TASKFILE;
} }
/*
* This is kept for internal use only !!!
* This is an internal call and nobody in user-space has a
* reason to call this taskfile.
*
* ide_raw_taskfile is the one that user-space executes.
*/
int ide_wait_taskfile(ide_drive_t *drive, struct hd_drive_task_hdr *taskfile, struct hd_drive_hob_hdr *hobfile, byte *buf)
{
struct request rq;
struct ata_request ar;
struct ata_taskfile *args = &ar.ar_task;
ata_ar_init(drive, &ar);
memcpy(&args->taskfile, taskfile, sizeof(*taskfile));
if (hobfile)
memcpy(&args->hobfile, hobfile, sizeof(*hobfile));
init_taskfile_request(&rq);
/* This is kept for internal use only !!! */
ide_cmd_type_parser(args);
if (args->command_type != IDE_DRIVE_TASK_NO_DATA)
rq.current_nr_sectors = rq.nr_sectors = (hobfile->sector_count << 8) | taskfile->sector_count;
rq.buffer = buf;
rq.special = &ar;
return ide_do_drive_cmd(drive, &rq, ide_wait);
}
int ide_raw_taskfile(ide_drive_t *drive, struct ata_taskfile *args, byte *buf) int ide_raw_taskfile(ide_drive_t *drive, struct ata_taskfile *args, byte *buf)
{ {
struct request rq; struct request rq;
...@@ -932,6 +899,7 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ata_taskfile *args, byte *buf) ...@@ -932,6 +899,7 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ata_taskfile *args, byte *buf)
ata_ar_init(drive, &ar); ata_ar_init(drive, &ar);
init_taskfile_request(&rq); init_taskfile_request(&rq);
rq.buffer = buf; rq.buffer = buf;
memcpy(&ar.ar_task, args, sizeof(*args)); memcpy(&ar.ar_task, args, sizeof(*args));
if (args->command_type != IDE_DRIVE_TASK_NO_DATA) if (args->command_type != IDE_DRIVE_TASK_NO_DATA)
...@@ -1022,7 +990,7 @@ int ide_cmd_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, un ...@@ -1022,7 +990,7 @@ int ide_cmd_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, un
return err; return err;
} }
int ide_task_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) int ide_task_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{ {
int err = 0; int err = 0;
u8 args[7]; u8 args[7];
...@@ -1051,15 +1019,14 @@ EXPORT_SYMBOL(atapi_input_bytes); ...@@ -1051,15 +1019,14 @@ EXPORT_SYMBOL(atapi_input_bytes);
EXPORT_SYMBOL(atapi_output_bytes); EXPORT_SYMBOL(atapi_output_bytes);
EXPORT_SYMBOL(taskfile_input_data); EXPORT_SYMBOL(taskfile_input_data);
EXPORT_SYMBOL(taskfile_output_data); EXPORT_SYMBOL(taskfile_output_data);
EXPORT_SYMBOL(ata_taskfile);
EXPORT_SYMBOL(ata_taskfile);
EXPORT_SYMBOL(recal_intr); EXPORT_SYMBOL(recal_intr);
EXPORT_SYMBOL(set_geometry_intr); EXPORT_SYMBOL(set_geometry_intr);
EXPORT_SYMBOL(set_multmode_intr); EXPORT_SYMBOL(set_multmode_intr);
EXPORT_SYMBOL(task_no_data_intr); EXPORT_SYMBOL(task_no_data_intr);
EXPORT_SYMBOL(ide_wait_taskfile);
EXPORT_SYMBOL(ide_raw_taskfile); EXPORT_SYMBOL(ide_raw_taskfile);
EXPORT_SYMBOL(ide_cmd_type_parser); EXPORT_SYMBOL(ide_cmd_type_parser);
EXPORT_SYMBOL(ide_cmd_ioctl); EXPORT_SYMBOL(ide_cmd_ioctl);
EXPORT_SYMBOL(ide_task_ioctl); EXPORT_SYMBOL(ide_task_ioctl);
...@@ -396,11 +396,9 @@ ide_startstop_t ide_dmaq_intr(ide_drive_t *drive) ...@@ -396,11 +396,9 @@ ide_startstop_t ide_dmaq_intr(ide_drive_t *drive)
*/ */
static int ide_tcq_configure(ide_drive_t *drive) static int ide_tcq_configure(ide_drive_t *drive)
{ {
struct hd_drive_task_hdr taskfile; struct ata_taskfile args;
int tcq_supp = 1 << 1 | 1 << 14; int tcq_supp = 1 << 1 | 1 << 14;
memset(&taskfile, 0, sizeof(taskfile));
/* /*
* bit 14 and 1 must be set in word 83 of the device id to indicate * bit 14 and 1 must be set in word 83 of the device id to indicate
* support for dma queued protocol * support for dma queued protocol
...@@ -410,9 +408,12 @@ static int ide_tcq_configure(ide_drive_t *drive) ...@@ -410,9 +408,12 @@ static int ide_tcq_configure(ide_drive_t *drive)
return 1; return 1;
} }
taskfile.feature = SETFEATURES_EN_WCACHE; memset(&args, 0, sizeof(args));
taskfile.command = WIN_SETFEATURES; args.taskfile.feature = SETFEATURES_EN_WCACHE;
if (ide_wait_taskfile(drive, &taskfile, NULL, NULL)) { args.taskfile.command = WIN_SETFEATURES;
ide_cmd_type_parser(&args);
if (ide_raw_taskfile(drive, &args, NULL)) {
printk("%s: failed to enable write cache\n", drive->name); printk("%s: failed to enable write cache\n", drive->name);
return 1; return 1;
} }
...@@ -421,9 +422,12 @@ static int ide_tcq_configure(ide_drive_t *drive) ...@@ -421,9 +422,12 @@ static int ide_tcq_configure(ide_drive_t *drive)
* disable RELease interrupt, it's quicker to poll this after * disable RELease interrupt, it's quicker to poll this after
* having sent the command opcode * having sent the command opcode
*/ */
taskfile.feature = SETFEATURES_DIS_RI; memset(&args, 0, sizeof(args));
taskfile.command = WIN_SETFEATURES; args.taskfile.feature = SETFEATURES_DIS_RI;
if (ide_wait_taskfile(drive, &taskfile, NULL, NULL)) { args.taskfile.command = WIN_SETFEATURES;
ide_cmd_type_parser(&args);
if (ide_raw_taskfile(drive, &args, NULL)) {
printk("%s: disabling release interrupt fail\n", drive->name); printk("%s: disabling release interrupt fail\n", drive->name);
return 1; return 1;
} }
...@@ -432,9 +436,12 @@ static int ide_tcq_configure(ide_drive_t *drive) ...@@ -432,9 +436,12 @@ static int ide_tcq_configure(ide_drive_t *drive)
/* /*
* enable SERVICE interrupt * enable SERVICE interrupt
*/ */
taskfile.feature = SETFEATURES_EN_SI; memset(&args, 0, sizeof(args));
taskfile.command = WIN_SETFEATURES; args.taskfile.feature = SETFEATURES_EN_SI;
if (ide_wait_taskfile(drive, &taskfile, NULL, NULL)) { args.taskfile.command = WIN_SETFEATURES;
ide_cmd_type_parser(&args);
if (ide_raw_taskfile(drive, &args, NULL)) {
printk("%s: enabling service interrupt fail\n", drive->name); printk("%s: enabling service interrupt fail\n", drive->name);
return 1; return 1;
} }
......
...@@ -494,8 +494,11 @@ unsigned long ata_capacity(ide_drive_t *drive) ...@@ -494,8 +494,11 @@ unsigned long ata_capacity(ide_drive_t *drive)
if (ata_ops(drive) && ata_ops(drive)->capacity) if (ata_ops(drive) && ata_ops(drive)->capacity)
return ata_ops(drive)->capacity(drive); return ata_ops(drive)->capacity(drive);
/* FIXME: This magic number seems to be bogous. */ /* This used to be 0x7fffffff, but since now we use the maximal drive
return 0x7fffffff; * capacity value used by other kernel subsystems as well.
*/
return ~0UL;
} }
/* /*
...@@ -556,13 +559,12 @@ void ide_geninit(struct ata_channel *hwif) ...@@ -556,13 +559,12 @@ void ide_geninit(struct ata_channel *hwif)
} }
} }
static ide_startstop_t do_reset1 (ide_drive_t *, int); /* needed below */ static ide_startstop_t do_reset1(ide_drive_t *, int); /* needed below */
/* /*
* ATAPI_reset_pollfunc() gets invoked to poll the interface for completion every 50ms * Poll the interface for completion every 50ms during an ATAPI drive reset
* during an ATAPI drive reset operation. If the drive has not yet responded, * operation. If the drive has not yet responded, and we have not yet hit our
* and we have not yet hit our maximum waiting time, then the timer is restarted * maximum waiting time, then the timer is restarted for another 50ms.
* for another 50ms.
*/ */
static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive)
{ {
...@@ -589,10 +591,9 @@ static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) ...@@ -589,10 +591,9 @@ static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive)
} }
/* /*
* reset_pollfunc() gets invoked to poll the interface for completion every 50ms * Poll the interface for completion every 50ms during an ata reset operation.
* during an ide reset operation. If the drives have not yet responded, * If the drives have not yet responded, and we have not yet hit our maximum
* and we have not yet hit our maximum waiting time, then the timer is restarted * waiting time, then the timer is restarted for another 50ms.
* for another 50ms.
*/ */
static ide_startstop_t reset_pollfunc (ide_drive_t *drive) static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
{ {
...@@ -905,9 +906,9 @@ static void try_to_flush_leftover_data (ide_drive_t *drive) ...@@ -905,9 +906,9 @@ static void try_to_flush_leftover_data (ide_drive_t *drive)
} }
/* /*
* ide_error() takes action based on the error returned by the drive. * Take action based on the error returned by the drive.
*/ */
ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat) ide_startstop_t ide_error(ide_drive_t *drive, const char *msg, byte stat)
{ {
struct request *rq; struct request *rq;
byte err; byte err;
...@@ -968,10 +969,9 @@ ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat) ...@@ -968,10 +969,9 @@ ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat)
} }
/* /*
* Issue a simple drive command * Issue a simple drive command. The drive must be selected beforehand.
* The drive must be selected beforehand.
*/ */
void ide_cmd (ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler) void ide_cmd(ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler)
{ {
BUG_ON(HWGROUP(drive)->handler); BUG_ON(HWGROUP(drive)->handler);
ide_set_handler (drive, handler, WAIT_CMD, NULL); ide_set_handler (drive, handler, WAIT_CMD, NULL);
...@@ -983,7 +983,7 @@ void ide_cmd (ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler) ...@@ -983,7 +983,7 @@ void ide_cmd (ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler)
} }
/* /*
* drive_cmd_intr() is invoked on completion of a special DRIVE_CMD. * Invoked on completion of a special DRIVE_CMD.
*/ */
static ide_startstop_t drive_cmd_intr (ide_drive_t *drive) static ide_startstop_t drive_cmd_intr (ide_drive_t *drive)
{ {
...@@ -1009,15 +1009,15 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive) ...@@ -1009,15 +1009,15 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive)
} }
/* /*
* This routine busy-waits for the drive status to be not "busy". * Busy-wait for the drive status to be not "busy". Check then the status for
* It then checks the status for all of the "good" bits and none * all of the "good" bits and none of the "bad" bits, and if all is okay it
* of the "bad" bits, and if all is okay it returns 0. All other * returns 0. All other cases return 1 after invoking ide_error() -- caller
* cases return 1 after invoking ide_error() -- caller should just return. * should just return.
* *
* This routine should get fixed to not hog the cpu during extra long waits.. * This routine should get fixed to not hog the cpu during extra long waits..
* That could be done by busy-waiting for the first jiffy or two, and then * That could be done by busy-waiting for the first jiffy or two, and then
* setting a timer to wake up at half second intervals thereafter, * setting a timer to wake up at half second intervals thereafter, until
* until timeout is achieved, before timing out. * timeout is achieved, before timing out.
*/ */
int ide_wait_stat(ide_startstop_t *startstop, ide_drive_t *drive, byte good, byte bad, unsigned long timeout) { int ide_wait_stat(ide_startstop_t *startstop, ide_drive_t *drive, byte good, byte bad, unsigned long timeout) {
byte stat; byte stat;
...@@ -1243,8 +1243,8 @@ ide_startstop_t restart_request(ide_drive_t *drive) ...@@ -1243,8 +1243,8 @@ ide_startstop_t restart_request(ide_drive_t *drive)
} }
/* /*
* ide_stall_queue() can be used by a drive to give excess bandwidth back * This is used by a drive to give excess bandwidth back to the hwgroup by
* to the hwgroup by sleeping for timeout jiffies. * sleeping for timeout jiffies.
*/ */
void ide_stall_queue(ide_drive_t *drive, unsigned long timeout) void ide_stall_queue(ide_drive_t *drive, unsigned long timeout)
{ {
...@@ -1254,7 +1254,7 @@ void ide_stall_queue(ide_drive_t *drive, unsigned long timeout) ...@@ -1254,7 +1254,7 @@ void ide_stall_queue(ide_drive_t *drive, unsigned long timeout)
} }
/* /*
* choose_drive() selects the next drive which will be serviced. * Select the next drive which will be serviced.
*/ */
static inline ide_drive_t *choose_drive(ide_hwgroup_t *hwgroup) static inline ide_drive_t *choose_drive(ide_hwgroup_t *hwgroup)
{ {
...@@ -1482,7 +1482,7 @@ void ide_dma_timeout_retry(ide_drive_t *drive) ...@@ -1482,7 +1482,7 @@ void ide_dma_timeout_retry(ide_drive_t *drive)
hwif->dmaproc(ide_dma_timeout, drive); hwif->dmaproc(ide_dma_timeout, drive);
/* /*
* disable dma for now, but remember that we did so because of * Disable dma for now, but remember that we did so because of
* a timeout -- we'll reenable after we finish this next request * a timeout -- we'll reenable after we finish this next request
* (or rather the first chunk of it) in pio. * (or rather the first chunk of it) in pio.
*/ */
...@@ -1631,7 +1631,7 @@ void ide_timer_expiry(unsigned long data) ...@@ -1631,7 +1631,7 @@ void ide_timer_expiry(unsigned long data)
*/ */
static void unexpected_intr(int irq, ide_hwgroup_t *hwgroup) static void unexpected_intr(int irq, ide_hwgroup_t *hwgroup)
{ {
byte stat; u8 stat;
struct ata_channel *hwif = hwgroup->hwif; struct ata_channel *hwif = hwgroup->hwif;
/* /*
...@@ -2167,7 +2167,7 @@ void ide_unregister(struct ata_channel *channel) ...@@ -2167,7 +2167,7 @@ void ide_unregister(struct ata_channel *channel)
#endif #endif
/* /*
* Remove us from the kernel's knowledge * Remove us from the kernel's knowledge.
*/ */
unregister_blkdev(channel->major, channel->name); unregister_blkdev(channel->major, channel->name);
kfree(blksize_size[channel->major]); kfree(blksize_size[channel->major]);
...@@ -2249,7 +2249,7 @@ void ide_setup_ports ( hw_regs_t *hw, ...@@ -2249,7 +2249,7 @@ void ide_setup_ports ( hw_regs_t *hw,
case IDE_IRQ_OFFSET: case IDE_IRQ_OFFSET:
hw->io_ports[i] = intr; hw->io_ports[i] = intr;
break; break;
#endif /* (CONFIG_AMIGA) || (CONFIG_MAC) */ #endif
default: default:
hw->io_ports[i] = 0; hw->io_ports[i] = 0;
break; break;
...@@ -2316,7 +2316,7 @@ int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp) ...@@ -2316,7 +2316,7 @@ int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp)
} }
/* /*
* Compatability function with existing drivers. If you want * Compatability function for existing drivers. If you want
* something different, use the function above. * something different, use the function above.
*/ */
int ide_register(int arg1, int arg2, int irq) int ide_register(int arg1, int arg2, int irq)
...@@ -2327,7 +2327,7 @@ int ide_register(int arg1, int arg2, int irq) ...@@ -2327,7 +2327,7 @@ int ide_register(int arg1, int arg2, int irq)
return ide_register_hw(&hw, NULL); return ide_register_hw(&hw, NULL);
} }
void ide_add_setting (ide_drive_t *drive, const char *name, int rw, int read_ioctl, int write_ioctl, int data_type, int min, int max, int mul_factor, int div_factor, void *data, ide_procset_t *set) void ide_add_setting(ide_drive_t *drive, const char *name, int rw, int read_ioctl, int write_ioctl, int data_type, int min, int max, int mul_factor, int div_factor, void *data, ide_procset_t *set)
{ {
ide_settings_t **p = &drive->settings; ide_settings_t **p = &drive->settings;
ide_settings_t *setting = NULL; ide_settings_t *setting = NULL;
...@@ -2506,9 +2506,7 @@ static int set_pio_mode (ide_drive_t *drive, int arg) ...@@ -2506,9 +2506,7 @@ static int set_pio_mode (ide_drive_t *drive, int arg)
void ide_add_generic_settings (ide_drive_t *drive) void ide_add_generic_settings (ide_drive_t *drive)
{ {
/* /* drive setting name read/write access read ioctl write ioctl data type min max mul_factor div_factor data pointer set function */
* drive setting name read/write access read ioctl write ioctl data type min max mul_factor div_factor data pointer set function
*/
ide_add_setting(drive, "io_32bit", drive->no_io_32bit ? SETTING_READ : SETTING_RW, HDIO_GET_32BIT, HDIO_SET_32BIT, TYPE_BYTE, 0, 1 + (SUPPORT_VLB_SYNC << 1), 1, 1, &drive->io_32bit, set_io_32bit); ide_add_setting(drive, "io_32bit", drive->no_io_32bit ? SETTING_READ : SETTING_RW, HDIO_GET_32BIT, HDIO_SET_32BIT, TYPE_BYTE, 0, 1 + (SUPPORT_VLB_SYNC << 1), 1, 1, &drive->io_32bit, set_io_32bit);
ide_add_setting(drive, "keepsettings", SETTING_RW, HDIO_GET_KEEPSETTINGS, HDIO_SET_KEEPSETTINGS, TYPE_BYTE, 0, 1, 1, 1, &drive->keep_settings, NULL); ide_add_setting(drive, "keepsettings", SETTING_RW, HDIO_GET_KEEPSETTINGS, HDIO_SET_KEEPSETTINGS, TYPE_BYTE, 0, 1, 1, 1, &drive->keep_settings, NULL);
ide_add_setting(drive, "pio_mode", SETTING_WRITE, -1, HDIO_SET_PIO_MODE, TYPE_BYTE, 0, 255, 1, 1, NULL, set_pio_mode); ide_add_setting(drive, "pio_mode", SETTING_WRITE, -1, HDIO_SET_PIO_MODE, TYPE_BYTE, 0, 255, 1, 1, NULL, set_pio_mode);
...@@ -2757,8 +2755,6 @@ int ide_build_commandlist(ide_drive_t *drive) ...@@ -2757,8 +2755,6 @@ int ide_build_commandlist(ide_drive_t *drive)
break; break;
} }
/* /*
* pheew, all done, add to list * pheew, all done, add to list
*/ */
...@@ -2787,18 +2783,21 @@ int ide_build_commandlist(ide_drive_t *drive) ...@@ -2787,18 +2783,21 @@ int ide_build_commandlist(ide_drive_t *drive)
static int ide_check_media_change (kdev_t i_rdev) static int ide_check_media_change (kdev_t i_rdev)
{ {
ide_drive_t *drive; ide_drive_t *drive;
int res = 0; /* not changed */
if ((drive = get_info_ptr(i_rdev)) == NULL) drive = get_info_ptr(i_rdev);
if (!drive)
return -ENODEV; return -ENODEV;
if (ata_ops(drive)) { if (ata_ops(drive)) {
ata_get(ata_ops(drive)); ata_get(ata_ops(drive));
if (ata_ops(drive)->check_media_change) if (ata_ops(drive)->check_media_change)
return ata_ops(drive)->check_media_change(drive); res = ata_ops(drive)->check_media_change(drive);
else else
return 1; /* assume it was changed */ res = 1; /* assume it was changed */
ata_put(ata_ops(drive)); ata_put(ata_ops(drive));
} }
return 0; return res;
} }
void ide_fixstring (byte *s, const int bytecount, const int byteswap) void ide_fixstring (byte *s, const int bytecount, const int byteswap)
...@@ -2828,6 +2827,10 @@ void ide_fixstring (byte *s, const int bytecount, const int byteswap) ...@@ -2828,6 +2827,10 @@ void ide_fixstring (byte *s, const int bytecount, const int byteswap)
*p++ = '\0'; *p++ = '\0';
} }
/****************************************************************************
* FIXME: rewrite the following crap:
*/
/* /*
* stridx() returns the offset of c within s, * stridx() returns the offset of c within s,
* or -1 if c is '\0' or not found within s. * or -1 if c is '\0' or not found within s.
...@@ -2835,11 +2838,12 @@ void ide_fixstring (byte *s, const int bytecount, const int byteswap) ...@@ -2835,11 +2838,12 @@ void ide_fixstring (byte *s, const int bytecount, const int byteswap)
static int __init stridx (const char *s, char c) static int __init stridx (const char *s, char c)
{ {
char *i = strchr(s, c); char *i = strchr(s, c);
return (i && c) ? i - s : -1; return (i && c) ? i - s : -1;
} }
/* /*
* match_parm() does parsing for ide_setup(): * Parsing for ide_setup():
* *
* 1. the first char of s must be '='. * 1. the first char of s must be '='.
* 2. if the remainder matches one of the supplied keywords, * 2. if the remainder matches one of the supplied keywords,
...@@ -3000,6 +3004,7 @@ int __init ide_setup (char *s) ...@@ -3000,6 +3004,7 @@ int __init ide_setup (char *s)
printk(" : Enabled support for IDE doublers\n"); printk(" : Enabled support for IDE doublers\n");
ide_doubler = 1; ide_doubler = 1;
return 1; return 1;
} }
#endif #endif
...@@ -3007,6 +3012,7 @@ int __init ide_setup (char *s) ...@@ -3007,6 +3012,7 @@ int __init ide_setup (char *s)
if (!strcmp(s, "ide=nodma")) { if (!strcmp(s, "ide=nodma")) {
printk("IDE: Prevented DMA\n"); printk("IDE: Prevented DMA\n");
noautodma = 1; noautodma = 1;
return 1; return 1;
} }
...@@ -3014,14 +3020,15 @@ int __init ide_setup (char *s) ...@@ -3014,14 +3020,15 @@ int __init ide_setup (char *s)
if (!strcmp(s, "ide=reverse")) { if (!strcmp(s, "ide=reverse")) {
ide_scan_direction = 1; ide_scan_direction = 1;
printk(" : Enabled support for IDE inverse scan order.\n"); printk(" : Enabled support for IDE inverse scan order.\n");
return 1; return 1;
} }
#endif /* CONFIG_BLK_DEV_IDEPCI */ #endif
/* /*
* Look for drive options: "hdx=" * Look for drive options: "hdx="
*/ */
if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) { if (!strncmp(s, "hd", 2) && s[2] >= 'a' && s[2] <= max_drive) {
const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom", const char *hd_words[] = {"none", "noprobe", "nowerr", "cdrom",
"serialize", "autotune", "noautotune", "serialize", "autotune", "noautotune",
"slow", "swapdata", "bswap", "flash", "slow", "swapdata", "bswap", "flash",
...@@ -3038,7 +3045,7 @@ int __init ide_setup (char *s) ...@@ -3038,7 +3045,7 @@ int __init ide_setup (char *s)
/* /*
* Look for last lun option: "hdxlun=" * Look for last lun option: "hdxlun="
*/ */
if (s[3] == 'l' && s[4] == 'u' && s[5] == 'n') { if (!strncmp(&s[3], "lun", 3)) {
if (match_parm(&s[6], NULL, vals, 1) != 1) if (match_parm(&s[6], NULL, vals, 1) != 1)
goto bad_option; goto bad_option;
if (vals[0] >= 0 && vals[0] <= 7) { if (vals[0] >= 0 && vals[0] <= 7) {
...@@ -3095,7 +3102,7 @@ int __init ide_setup (char *s) ...@@ -3095,7 +3102,7 @@ int __init ide_setup (char *s)
#else #else
drive->scsi = 0; drive->scsi = 0;
goto bad_option; goto bad_option;
#endif /* defined(CONFIG_BLK_DEV_IDESCSI) && defined(CONFIG_SCSI) */ #endif
case 3: /* cyl,head,sect */ case 3: /* cyl,head,sect */
drive->type = ATA_DISK; drive->type = ATA_DISK;
drive->cyl = drive->bios_cyl = vals[0]; drive->cyl = drive->bios_cyl = vals[0];
...@@ -3110,12 +3117,10 @@ int __init ide_setup (char *s) ...@@ -3110,12 +3117,10 @@ int __init ide_setup (char *s)
} }
} }
if (s[0] != 'i' || s[1] != 'd' || s[2] != 'e')
goto bad_option;
/* /*
* Look for bus speed option: "idebus=" * Look for bus speed option: "idebus="
*/ */
if (s[3] == 'b' && s[4] == 'u' && s[5] == 's') { if (strncmp(s, "idebus", 6)) {
if (match_parm(&s[6], NULL, vals, 1) != 1) if (match_parm(&s[6], NULL, vals, 1) != 1)
goto bad_option; goto bad_option;
if (vals[0] >= 20 && vals[0] <= 66) { if (vals[0] >= 20 && vals[0] <= 66) {
...@@ -3124,13 +3129,14 @@ int __init ide_setup (char *s) ...@@ -3124,13 +3129,14 @@ int __init ide_setup (char *s)
printk(" -- BAD BUS SPEED! Expected value from 20 to 66"); printk(" -- BAD BUS SPEED! Expected value from 20 to 66");
goto done; goto done;
} }
/* /*
* Look for interface options: "idex=" * Look for interface options: "idex="
*/ */
if (s[3] >= '0' && s[3] <= max_hwif) { if (!strncmp(s, "ide", 3) && s[3] >= '0' && s[3] <= max_hwif) {
/* /*
* Be VERY CAREFUL changing this: note hardcoded indexes below * Be VERY CAREFUL changing this: note hardcoded indexes below
* -8,-9,-10 : are reserved for future idex calls to ease the hardcoding. * -8,-9,-10. -11 : are reserved for future idex calls to ease the hardcoding.
*/ */
const char *ide_words[] = { const char *ide_words[] = {
"noprobe", "serialize", "autotune", "noautotune", "reset", "dma", "ata66", "noprobe", "serialize", "autotune", "noautotune", "reset", "dma", "ata66",
...@@ -3138,6 +3144,7 @@ int __init ide_setup (char *s) ...@@ -3138,6 +3144,7 @@ int __init ide_setup (char *s)
"qd65xx", "ht6560b", "cmd640_vlb", "dtc2278", "umc8672", "ali14xx", "dc4030", NULL }; "qd65xx", "ht6560b", "cmd640_vlb", "dtc2278", "umc8672", "ali14xx", "dc4030", NULL };
hw = s[3] - '0'; hw = s[3] - '0';
hwif = &ide_hwifs[hw]; hwif = &ide_hwifs[hw];
i = match_parm(&s[4], ide_words, vals, 3); i = match_parm(&s[4], ide_words, vals, 3);
/* /*
...@@ -3169,7 +3176,7 @@ int __init ide_setup (char *s) ...@@ -3169,7 +3176,7 @@ int __init ide_setup (char *s)
init_ali14xx(); init_ali14xx();
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_ALI14XX */ #endif
#ifdef CONFIG_BLK_DEV_UMC8672 #ifdef CONFIG_BLK_DEV_UMC8672
case -16: /* "umc8672" */ case -16: /* "umc8672" */
{ {
...@@ -3177,7 +3184,7 @@ int __init ide_setup (char *s) ...@@ -3177,7 +3184,7 @@ int __init ide_setup (char *s)
init_umc8672(); init_umc8672();
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_UMC8672 */ #endif
#ifdef CONFIG_BLK_DEV_DTC2278 #ifdef CONFIG_BLK_DEV_DTC2278
case -15: /* "dtc2278" */ case -15: /* "dtc2278" */
{ {
...@@ -3185,7 +3192,7 @@ int __init ide_setup (char *s) ...@@ -3185,7 +3192,7 @@ int __init ide_setup (char *s)
init_dtc2278(); init_dtc2278();
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_DTC2278 */ #endif
#ifdef CONFIG_BLK_DEV_CMD640 #ifdef CONFIG_BLK_DEV_CMD640
case -14: /* "cmd640_vlb" */ case -14: /* "cmd640_vlb" */
{ {
...@@ -3193,7 +3200,7 @@ int __init ide_setup (char *s) ...@@ -3193,7 +3200,7 @@ int __init ide_setup (char *s)
cmd640_vlb = 1; cmd640_vlb = 1;
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_CMD640 */ #endif
#ifdef CONFIG_BLK_DEV_HT6560B #ifdef CONFIG_BLK_DEV_HT6560B
case -13: /* "ht6560b" */ case -13: /* "ht6560b" */
{ {
...@@ -3201,7 +3208,7 @@ int __init ide_setup (char *s) ...@@ -3201,7 +3208,7 @@ int __init ide_setup (char *s)
init_ht6560b(); init_ht6560b();
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_HT6560B */ #endif
#if CONFIG_BLK_DEV_QD65XX #if CONFIG_BLK_DEV_QD65XX
case -12: /* "qd65xx" */ case -12: /* "qd65xx" */
{ {
...@@ -3209,7 +3216,7 @@ int __init ide_setup (char *s) ...@@ -3209,7 +3216,7 @@ int __init ide_setup (char *s)
init_qd65xx(); init_qd65xx();
goto done; goto done;
} }
#endif /* CONFIG_BLK_DEV_QD65XX */ #endif
case -11: /* minus11 */ case -11: /* minus11 */
case -10: /* minus10 */ case -10: /* minus10 */
case -9: /* minus9 */ case -9: /* minus9 */
...@@ -3219,10 +3226,10 @@ int __init ide_setup (char *s) ...@@ -3219,10 +3226,10 @@ int __init ide_setup (char *s)
#ifdef CONFIG_BLK_DEV_IDEPCI #ifdef CONFIG_BLK_DEV_IDEPCI
hwif->udma_four = 1; hwif->udma_four = 1;
goto done; goto done;
#else /* !CONFIG_BLK_DEV_IDEPCI */ #else
hwif->udma_four = 0; hwif->udma_four = 0;
goto bad_hwif; goto bad_hwif;
#endif /* CONFIG_BLK_DEV_IDEPCI */ #endif
case -6: /* dma */ case -6: /* dma */
hwif->autodma = 1; hwif->autodma = 1;
goto done; goto done;
...@@ -3271,16 +3278,22 @@ int __init ide_setup (char *s) ...@@ -3271,16 +3278,22 @@ int __init ide_setup (char *s)
return 1; return 1;
} }
} }
bad_option: bad_option:
printk(" -- BAD OPTION\n"); printk(" -- BAD OPTION\n");
return 1; return 1;
bad_hwif: bad_hwif:
printk("-- NOT SUPPORTED ON ide%d", hw); printk("-- NOT SUPPORTED ON ide%d", hw);
done: done:
printk("\n"); printk("\n");
return 1; return 1;
} }
/****************************************************************************/
/* This is the default end request function as well */ /* This is the default end request function as well */
int ide_end_request(ide_drive_t *drive, int uptodate) int ide_end_request(ide_drive_t *drive, int uptodate)
{ {
......
...@@ -199,7 +199,7 @@ static int piix_get_info(char *buffer, char **addr, off_t offset, int count) ...@@ -199,7 +199,7 @@ static int piix_get_info(char *buffer, char **addr, off_t offset, int count)
if (~piix_config->flags & PIIX_VICTORY) { if (~piix_config->flags & PIIX_VICTORY) {
if ((piix_config->flags & PIIX_UDMA) >= PIIX_UDMA_66 && (u & (1 << i))) umul = 2; if ((piix_config->flags & PIIX_UDMA) >= PIIX_UDMA_66 && (u & (1 << i))) umul = 2;
if ((piix_config->flags & PIIX_UDMA) >= PIIX_UDMA_100 && (u & ((1 << i) + 12))) umul = 1; if ((piix_config->flags & PIIX_UDMA) >= PIIX_UDMA_100 && (u & (1 << (i + 12)))) umul = 1;
udma[i] = (4 - ((e >> (i << 2)) & 3)) * umul; udma[i] = (4 - ((e >> (i << 2)) & 3)) * umul;
} else udma[i] = (8 - ((e >> (i << 2)) & 7)) * 2; } else udma[i] = (8 - ((e >> (i << 2)) & 7)) * 2;
......
...@@ -858,16 +858,14 @@ extern ide_startstop_t set_geometry_intr(ide_drive_t *drive); ...@@ -858,16 +858,14 @@ extern ide_startstop_t set_geometry_intr(ide_drive_t *drive);
extern ide_startstop_t set_multmode_intr(ide_drive_t *drive); extern ide_startstop_t set_multmode_intr(ide_drive_t *drive);
extern ide_startstop_t task_no_data_intr(ide_drive_t *drive); extern ide_startstop_t task_no_data_intr(ide_drive_t *drive);
int ide_wait_taskfile (ide_drive_t *drive, struct hd_drive_task_hdr *taskfile, struct hd_drive_hob_hdr *hobfile, byte *buf);
int ide_raw_taskfile (ide_drive_t *drive, struct ata_taskfile *cmd, byte *buf);
/* This is setting up all fields in args, which depend upon the command type. /* This is setting up all fields in args, which depend upon the command type.
*/ */
extern void ide_cmd_type_parser(struct ata_taskfile *args); extern void ide_cmd_type_parser(struct ata_taskfile *args);
extern int ide_raw_taskfile(ide_drive_t *drive, struct ata_taskfile *cmd, byte *buf);
int ide_cmd_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); extern int ide_cmd_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
int ide_task_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg); extern int ide_task_ioctl(ide_drive_t *drive, struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
void ide_delay_50ms (void); void ide_delay_50ms (void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment