IDE fixes
PATCH 1/1 IDE fixes
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git/
to receive the following updates:
drivers/ide/Kconfig | 22 ++++++++++++++++++---- drivers/ide/ide-dma.c | 5 +++-- drivers/ide/ide-io.c | 5 ++++- drivers/ide/ide-iops.c | 8 ++++++-- drivers/ide/ide-probe.c | 5 +++-- drivers/ide/ide-taskfile.c | 3 +++ drivers/ide/pci/piix.c | 1 + include/linux/ide.h | 9 +-------- 8 files changed, 39 insertions(+), 19 deletions(-)
Adrian Bunk (1):
ide: unexport ide_fix_driveid
Bartlomiej Zolnierkiewicz (8):
ide/Kconfig: fix BLK_DEV_OFFBOARD dependencies
ide: check rq->cmd_type in drive_cmd_intr()
ide: clear HOB bit for REQ_TYPE_ATA_TASK requests in ide_end_drive_cmd()
ide: add missing rq.ref_count initialization to ide_diag_taskfile()
ide: fix ide_find_dma_mode() to print human-readable info
ide: add missing #ifdef/#endif CONFIG_IDE_TASK_IOCTL
ide: move ide_fixstring() documentation to ide-iops.c from ide.h
ide: fix IDE_HFLAG_NO_ATAPI_DMA handling in config_drive_for_dma()
Matti Linnanvuori (1):
ide/Kconfig: add IDEDISK_MULTI_MODE text adapted from hdparm manual page
Tejun Heo (1):
ide: do_identify() string termination fix
[email protected] (1):
piix: add support for ICH7 on Acer 5602aWLMi
drivers/ide/Kconfig +18 -4
@@ -152,9 +152,22 @@ config BLK_DEV_IDEDISK If unsure, say Y. config IDEDISK_MULTI_MODE - bool "Use multi-mode by default" - help - If you get this error, try to say Y here: + bool "Use multiple sector mode for Programmed Input/Output by default" + help + This setting is irrelevant for most IDE disks, with direct memory + access, to which multiple sector mode does not apply. Multiple sector + mode is a feature of most modern IDE hard drives, permitting the + transfer of multiple sectors per Programmed Input/Output interrupt, + rather than the usual one sector per interrupt. When this feature is + enabled, it can reduce operating system overhead for disk Programmed + Input/Output. On some systems, it also can increase the data + throughput of Programmed Input/Output. Some drives, however, seemed + to run slower with multiple sector mode enabled. Some drives claimed + to support multiple sector mode, but lost data at some settings. + Under rare circumstances, such failures could result in massive + filesystem corruption. + + If you get the following error, try to say Y here: hda: set_multmode: status=0x51 { DriveReady SeekComplete Error } hda: set_multmode: error=0x04 { DriveStatusError }
@@ -380,9 +393,10 @@ config IDEPCI_SHARE_IRQ config IDEPCI_PCIBUS_ORDER def_bool BLK_DEV_IDE=y && BLK_DEV_IDEPCI +# TODO: split it on per host driver config options (or module parameters) config BLK_DEV_OFFBOARD bool "Boot off-board chipsets first support" - depends on BLK_DEV_IDEPCI + depends on BLK_DEV_IDEPCI && (BLK_DEV_AEC62XX || BLK_DEV_GENERIC || BLK_DEV_HPT34X || BLK_DEV_HPT366 || BLK_DEV_PDC202XX_NEW || BLK_DEV_PDC202XX_OLD || BLK_DEV_TC86C001) help Normally, IDE controllers built into the motherboard (on-board controllers) are assigned to ide0 and ide1 while those on add-in PCI
drivers/ide/ide-dma.c +3 -2
@@ -340,7 +340,7 @@ static int config_drive_for_dma (ide_drive_t *drive)if (drive->media != ide_disk) {if (hwif->host_flags &IDE_HFLAG_NO_ATAPI_DMA ) -return -1 ; +return 0 ; }/*
@@ -752,7 +752,8 @@ u8 ide_find_dma_mode(ide_drive_t *drive, u8 req_mode) mode =XFER_MW_DMA_1 ; } -printk (KERN_DEBUG "%s: selected mode 0x%x\n" , drive->name, mode); +printk (KERN_DEBUG "%s: %s mode selected\n" , drive->name, + mode ?ide_xfer_verbose (mode) :"no DMA" );return min (mode, req_mode); }
drivers/ide/ide-io.c +4 -1
@@ -340,6 +340,8 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)if (args) { args[0 ] = stat; args[1 ] = err; +/* be sure we're looking at the low order bits */ + hwif->OUTB (drive->ctl & ~0x80 ,IDE_CONTROL_REG ); args[2 ] = hwif->INB (IDE_NSECTOR_REG ); args[3 ] = hwif->INB (IDE_SECTOR_REG ); args[4 ] = hwif->INB (IDE_LCYL_REG );
@@ -654,7 +656,8 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive)int retries =10 ;local_irq_enable_in_hardirq (); -if ((stat &DRQ_STAT ) && args && args[3 ]) { +if (rq->cmd_type ==REQ_TYPE_ATA_CMD && + (stat &DRQ_STAT ) && args && args[3 ]) {u8 io_32bit = drive->io_32bit; drive->io_32bit =0 ; hwif->ata_input_data (drive, &args[4 ], args[3 ] *SECTOR_WORDS );
drivers/ide/ide-iops.c +6 -2
@@ -403,8 +403,12 @@ void ide_fix_driveid (struct hd_driveid *id)#endif } -/* FIXME: exported for use by the USB storage (isd200.c) code only */ -EXPORT_SYMBOL (ide_fix_driveid); +/* +* ide_fixstring() cleans up and (optionally) byte-swaps a text string, +* removing leading/trailing blanks and compressing internal blanks. +* It is primarily used to tidy up the model name/number fields as +* returned by the WIN_[P]IDENTIFY commands. +*/ void ide_fixstring (u8 *s,const int bytecount,const int byteswap) {
drivers/ide/ide-probe.c +3 -2
@@ -172,11 +172,12 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)ide_fixstring (id->fw_rev,sizeof (id->fw_rev), bswap);ide_fixstring (id->serial_no,sizeof (id->serial_no), bswap); +/* we depend on this a lot! */ + id->model[sizeof (id->model)-1 ] ='\0' ; +if (strstr (id->model,"E X A B Y T E N E S T" )) goto err_misc; -/* we depend on this a lot! */ - id->model[sizeof (id->model)-1 ] ='\0' ;printk ("%s: %s, " , drive->name, id->model); drive->present =1 ; drive->dead =0 ;
drivers/ide/ide-taskfile.c +3 -0
@@ -471,6 +471,7 @@ static int ide_diag_taskfile(ide_drive_t *drive, ide_task_t *args, unsigned longstruct request rq;memset (&rq,0 ,sizeof (rq)); + rq.ref_count =1 ; rq.cmd_type =REQ_TYPE_ATA_TASKFILE ; rq.buffer = buf;
@@ -511,6 +512,7 @@ int ide_raw_taskfile (ide_drive_t *drive, ide_task_t *args, u8 *buf)EXPORT_SYMBOL (ide_raw_taskfile); +#ifdef CONFIG_IDE_TASK_IOCTL int ide_taskfile_ioctl (ide_drive_t *drive,unsigned int cmd,unsigned long arg) {ide_task_request_t *req_task;
@@ -660,6 +662,7 @@ abort: return err; } +#endif int ide_wait_cmd (ide_drive_t *drive,u8 cmd,u8 nsect,u8 feature,u8 sectors,u8 *buf) {
drivers/ide/pci/piix.c +1 -0
@@ -302,6 +302,7 @@ struct ich_laptop {static const struct ich_laptop ich_laptop[] = {/* devid, subvendor, subdev */ + {0x27DF ,0x1025 ,0x0102 },/* ICH7 on Acer 5602aWLMi */ {0x27DF ,0x0005 ,0x0280 },/* ICH7 on Acer 5602WLMi */ {0x27DF ,0x1025 ,0x0110 },/* ICH7 on Acer 3682WLMi */ {0x27DF ,0x1043 ,0x1267 },/* ICH7 on Asus W5F */
include/linux/ide.h +1 -8
@@ -1031,14 +1031,7 @@ ide_startstop_t __ide_abort(ide_drive_t *, struct request *);extern ide_startstop_t ide_abort (ide_drive_t *,const char *);extern void ide_fix_driveid (struct hd_driveid *); -/* -* ide_fixstring() cleans up and (optionally) byte-swaps a text string, -* removing leading/trailing blanks and compressing internal blanks. -* It is primarily used to tidy up the model name/number fields as -* returned by the WIN_[P]IDENTIFY commands. -* -* (s, bytecount, byteswap) -*/ +extern void ide_fixstring (u8 *,const int ,const int );int ide_wait_stat (ide_startstop_t *,ide_drive_t *,u8 ,u8 ,unsigned long );