Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: ide: fix IDE_HFLAG_NO_ATAPI_DMA handling in config_drive_for_dma() ide: move ide_fixstring() documentation to ide-iops.c from ide.h ide: add missing #ifdef/#endif CONFIG_IDE_TASK_IOCTL ide: fix ide_find_dma_mode() to print human-readable info ide: add missing rq.ref_count initialization to ide_diag_taskfile() ide: clear HOB bit for REQ_TYPE_ATA_TASK requests in ide_end_drive_cmd() ide: check rq->cmd_type in drive_cmd_intr() ide/Kconfig: fix BLK_DEV_OFFBOARD dependencies ide: unexport ide_fix_driveid ide/Kconfig: add IDEDISK_MULTI_MODE text adapted from hdparm manual page ide: do_identify() string termination fix piix: add support for ICH7 on Acer 5602aWLMi
This commit is contained in:
commit
3131e530ac
@ -152,9 +152,22 @@ config BLK_DEV_IDEDISK
|
||||
If unsure, say Y.
|
||||
|
||||
config IDEDISK_MULTI_MODE
|
||||
bool "Use multi-mode by default"
|
||||
bool "Use multiple sector mode for Programmed Input/Output by default"
|
||||
help
|
||||
If you get this error, try to say Y here:
|
||||
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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -471,6 +471,7 @@ static int ide_diag_taskfile(ide_drive_t *drive, ide_task_t *args, unsigned long
|
||||
struct 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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user