IDE updates part 4
Subsystems (3)
[ Sigh, seems like I'm 42 minutes late... ]
Hi,
The final bits:
- bug fixes for few fallouts from previous IDE updates (Geert Uytterhoeven)
- TRIM support ("discard" operation for SSD devices) (David Woodhouse & Matthew Wilcox)
Since this is a new feature and hasn't seen much testing with production devices it is not enabled by default yet (requires use of "ide_core.trim=1" kernel parameter).
- at91_ide host driver updates including PIO6 support (Stanislaw Gruszka)
- tx493[89]ide host driver updates (Atsushi Nemoto)
- simplififcation of 'struct ide_taskfile' and tf_{read,load}() methods (Sergei Shtylyov)
The nice end effect of this work is clearly visible in diffstat.
- ide-cd: initial unification of error handling for fs and pc requests (Borislav Petkov)
- removal of superfluous write memory barriers (Grant Grundler)
I also included obviously correct xsysace fix (from Grant Likely, xsysace Maintainer) for the very recent regression introduced by my <linux/hdreg.h> cleanups (just to make life easier for everybody).
Linus, please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git/
to receive the following updates:
drivers/block/xsysace.c | 12 +- drivers/ide/at91_ide.c | 91 +------------- drivers/ide/falconide.c | 13 ++- drivers/ide/ide-acpi.c | 5 +- drivers/ide/ide-atapi.c | 38 +++---- drivers/ide/ide-cd.c | 288 +++++++++++++++++++++---------------------- drivers/ide/ide-disk.c | 123 ++++++++++++++---- drivers/ide/ide-disk_proc.c | 6 +- drivers/ide/ide-dma-sff.c | 9 +- drivers/ide/ide-h8300.c | 101 +--------------- drivers/ide/ide-io-std.c | 75 +++--------- drivers/ide/ide-io.c | 13 +- drivers/ide/ide-ioctls.c | 14 ++- drivers/ide/ide-iops.c | 20 ++-- drivers/ide/ide-lib.c | 28 +++-- drivers/ide/ide-park.c | 3 +- drivers/ide/ide-pm.c | 3 +- drivers/ide/ide-probe.c | 18 +-- drivers/ide/ide-proc.c | 4 +- drivers/ide/ide-taskfile.c | 97 +++++++++----- drivers/ide/ide.c | 6 + drivers/ide/ns87415.c | 34 ++---- drivers/ide/q40ide.c | 14 ++- drivers/ide/scc_pata.c | 71 +++-------- drivers/ide/tx4938ide.c | 89 +------------- drivers/ide/tx4939ide.c | 110 ++--------------- include/linux/ide.h | 151 +++++++++-------------- 27 files changed, 520 insertions(+), 916 deletions(-)
Atsushi Nemoto (3):
tx4939ide: remove wmb()
tx493[89]ide: Remove big endian version of tx493[89]ide_tf_{load,read}
tx4939ide: Fix tx4939ide_{in,out}put_data_swap argumentBartlomiej Zolnierkiewicz (3):
ide-cd: convert cdrom_decode_status() to use switch statements
ide-cd: unify handling of fs and pc requests in cdrom_decode_status()
ide-cd: fix intendation in cdrom_decode_status()
Borislav Petkov (5):
ide-cd: move status checking into the IRQ handler
ide-cd: carve out an ide_cd_breathe()-helper for fs write requests
ide-cd: respect REQ_QUIET for fs requests in cdrom_decode_status()
ide-cd: update debugging support
ide-cd: reverse NOT_READY sense key logic
David Woodhouse (1):
ide: Add support for TRIM
Geert Uytterhoeven (2):
ide: Fix host drivers that need IRQF_SHARED
ide: falconide/q40ide - Use __ide_mm_{in,out}sw() for data
Grant Grundler (1):
ide: remove wmb() from ide-dma-sff.c and scc_pata.c
Grant Likely (1):
xsysace: Fix dereferencing of cf_id after hd_driveid removal
Huang Weiyi (1):
ide: remove unused #include <linux/version.h>
Sergei Shtylyov (9):
ide-h8300: remove mm_{inw|outw}()
at91_ide: remove custom tf_{read|load}() methods
ide-h8300: remove custom tf_{read|load}() methods
ide: replace IDE_TFLAG_* flags by IDE_VALID_*
ide: simplify 'struct ide_taskfile'
ide: move common code out of tf_load() method
ide: call write_devctl() method from tf_read() method
ide: refactor tf_load() method
ide: refactor tf_read() method
Stanislaw Gruszka (2):
at91_ide: remove unused ide_mm_{outb,inb}
at91_ide: turn on PIO 6 support
drivers/block/xsysace.c +6 -6
@@ -563,7 +563,7 @@ static void ace_fsm_dostate(struct ace_device *ace)case ACE_FSM_STATE_IDENTIFY_PREPARE :/* Send identify command */ ace->fsm_task =ACE_TASK_IDENTIFY ; - ace->data_ptr = &ace->cf_id; + ace->data_ptr = ace->cf_id; ace->data_count =ACE_BUF_PER_SECTOR ;ace_out (ace,ACE_SECCNTCMD ,ACE_SECCNTCMD_IDENTIFY );
@@ -608,8 +608,8 @@ static void ace_fsm_dostate(struct ace_device *ace)break ;case ACE_FSM_STATE_IDENTIFY_COMPLETE : -ace_fix_driveid (&ace->cf_id[0 ]); -ace_dump_mem (&ace->cf_id,512 );/* Debug: Dump out disk ID */ +ace_fix_driveid (ace->cf_id); +ace_dump_mem (ace->cf_id,512 );/* Debug: Dump out disk ID */ if (ace->data_result) {/* Error occured, disable the disk */
@@ -622,9 +622,9 @@ static void ace_fsm_dostate(struct ace_device *ace)/* Record disk parameters */ set_capacity (ace->gd, -ata_id_u32 (&ace->cf_id,ATA_ID_LBA_CAPACITY )); +ata_id_u32 (ace->cf_id,ATA_ID_LBA_CAPACITY ));dev_info (ace->dev,"capacity: %i sectors\n" , -ata_id_u32 (&ace->cf_id,ATA_ID_LBA_CAPACITY )); +ata_id_u32 (ace->cf_id,ATA_ID_LBA_CAPACITY )); }/* We're done, drop to IDLE state and notify waiters */
@@ -923,7 +923,7 @@ static int ace_release(struct gendisk *disk, fmode_t mode)static int ace_getgeo (struct block_device *bdev,struct hd_geometry *geo) {struct ace_device *ace = bdev->bd_disk->private_data; -u16 *cf_id = &ace->cf_id[0 ]; +u16 *cf_id = ace->cf_id;dev_dbg (ace->dev,"ace_getgeo()\n" );
drivers/ide/at91_ide.c +3 -88
115 lines not on this page · raw message
drivers/ide/falconide.c +9 -4
@@ -20,6 +20,7 @@#include <asm/atarihw.h> #include <asm/atariints.h> #include <asm/atari_stdma.h> +#include <asm/ide.h> #define DRV_NAME "falconide"
@@ -67,8 +68,10 @@ static void falconide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, {unsigned long data_addr = drive->hwif->io_ports.data_addr; -if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) -return insw (data_addr, buf, (len +1 ) /2 ); +if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) { +__ide_mm_insw (data_addr, buf, (len +1 ) /2 ); +return ; + }raw_insw_swapw ((u16 *)data_addr, buf, (len +1 ) /2 ); }
@@ -78,8 +81,10 @@ static void falconide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, {unsigned long data_addr = drive->hwif->io_ports.data_addr; -if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) -return outsw (data_addr, buf, (len +1 ) /2 ); +if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) { +__ide_mm_outsw (data_addr, buf, (len +1 ) /2 ); +return ; + }raw_outsw_swapw ((u16 *)data_addr, buf, (len +1 ) /2 ); }
drivers/ide/ide-acpi.c +3 -2
@@ -318,8 +318,9 @@ static int do_drive_set_taskfiles(ide_drive_t *drive,/* convert GTF to taskfile */ memset (&cmd,0 ,sizeof (cmd)); -memcpy (&cmd.tf_array[7 ], gtf,REGS_PER_GTF ); - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; +memcpy (&cmd.tf.feature, gtf,REGS_PER_GTF ); + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; err =ide_no_data_taskfile (drive, &cmd);if (err) {
drivers/ide/ide-atapi.c +16 -22
@@ -254,16 +254,13 @@ EXPORT_SYMBOL_GPL(ide_cd_get_xferlen);void ide_read_bcount_and_ireason (ide_drive_t *drive,u16 *bcount,u8 *ireason) { -struct ide_cmd cmd; +struct ide_taskfile tf; -memset (&cmd,0 ,sizeof (cmd)); - cmd.tf_flags =IDE_TFLAG_IN_LBAH |IDE_TFLAG_IN_LBAM | -IDE_TFLAG_IN_NSECT ; + drive->hwif->tp_ops->tf_read (drive, &tf,IDE_VALID_NSECT | +IDE_VALID_LBAM |IDE_VALID_LBAH ); - drive->hwif->tp_ops->tf_read (drive, &cmd); - - *bcount = (cmd.tf.lbah <<8 ) | cmd.tf.lbam; - *ireason = cmd.tf.nsect &3 ; + *bcount = (tf.lbah <<8 ) | tf.lbam; + *ireason = tf.nsect &3 ; }EXPORT_SYMBOL_GPL (ide_read_bcount_and_ireason);
@@ -439,12 +436,12 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive)return ide_started; } -static void ide_init_packet_cmd (struct ide_cmd *cmd,u32 tf_flags, +static void ide_init_packet_cmd (struct ide_cmd *cmd,u8 valid_tf,u16 bcount,u8 dma) { - cmd->protocol = dma ?ATAPI_PROT_DMA :ATAPI_PROT_PIO ; - cmd->tf_flags |=IDE_TFLAG_OUT_LBAH |IDE_TFLAG_OUT_LBAM | -IDE_TFLAG_OUT_FEATURE | tf_flags; + cmd->protocol = dma ?ATAPI_PROT_DMA :ATAPI_PROT_PIO ; + cmd->valid.out.tf =IDE_VALID_LBAH |IDE_VALID_LBAM | +IDE_VALID_FEATURE | valid_tf; cmd->tf.command =ATA_CMD_PACKET ; cmd->tf.feature = dma;/* Use PIO/DMA */ cmd->tf.lbam = bcount &0xff ;
@@ -453,14 +450,11 @@ static void ide_init_packet_cmd(struct ide_cmd *cmd, u32 tf_flags,static u8 ide_read_ireason (ide_drive_t *drive) { -struct ide_cmd cmd; - -memset (&cmd,0 ,sizeof (cmd)); - cmd.tf_flags =IDE_TFLAG_IN_NSECT ; +struct ide_taskfile tf; - drive->hwif->tp_ops->tf_read (drive, &cmd); + drive->hwif->tp_ops->tf_read (drive, &tf,IDE_VALID_NSECT ); -return cmd.tf.nsect &3 ; +return tf.nsect &3 ; }static u8 ide_wait_ireason (ide_drive_t *drive,u8 ireason)
@@ -588,12 +582,12 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd)ide_expiry_t *expiry =NULL ;struct request *rq = hwif->rq;unsigned int timeout; -u32 tf_flags;u16 bcount; +u8 valid_tf;u8 drq_int = !!(drive->atapi_flags &IDE_AFLAG_DRQ_INTERRUPT );if (dev_is_idecd (drive)) { - tf_flags =IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL ; + valid_tf =IDE_VALID_NSECT |IDE_VALID_LBAL ; bcount =ide_cd_get_xferlen (rq); expiry = ide_cd_expiry; timeout =ATAPI_WAIT_PC ;
@@ -607,7 +601,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) pc->xferred =0 ; pc->cur_pos = pc->buf; - tf_flags =IDE_TFLAG_OUT_DEVICE ; + valid_tf =IDE_VALID_DEVICE ; bcount = ((drive->media == ide_tape) ? pc->req_xfer :min (pc->req_xfer,63 *1024 ));
@@ -627,7 +621,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) : WAIT_TAPE_CMD; } -ide_init_packet_cmd (cmd, tf_flags, bcount, drive->dma); +ide_init_packet_cmd (cmd, valid_tf, bcount, drive->dma); (void )do_rw_taskfile (drive, cmd);
drivers/ide/ide-cd.c +138 -150
350 lines not on this page · raw message
drivers/ide/ide-disk.c +95 -28
216 lines not on this page · raw message
drivers/ide/ide-disk_proc.c +4 -2
@@ -13,7 +13,8 @@ static int smart_enable(ide_drive_t *drive) tf->lbam =ATA_SMART_LBAM_PASS ; tf->lbah =ATA_SMART_LBAH_PASS ; tf->command =ATA_CMD_SMART ; - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ;return ide_no_data_taskfile (drive, &cmd); }
@@ -29,7 +30,8 @@ static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd) tf->lbam =ATA_SMART_LBAM_PASS ; tf->lbah =ATA_SMART_LBAH_PASS ; tf->command =ATA_CMD_SMART ; - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; cmd.protocol =ATA_PROT_PIO ;return ide_raw_taskfile (drive, &cmd, buf,1 );
drivers/ide/ide-dma-sff.c +3 -6
@@ -277,8 +277,6 @@ void ide_dma_start(ide_drive_t *drive) dma_cmd =inb (hwif->dma_base +ATA_DMA_CMD );outb (dma_cmd |ATA_DMA_START , hwif->dma_base +ATA_DMA_CMD ); } - -wmb (); }EXPORT_SYMBOL_GPL (ide_dma_start);
@@ -286,7 +284,7 @@ EXPORT_SYMBOL_GPL(ide_dma_start);int ide_dma_end (ide_drive_t *drive) {ide_hwif_t *hwif = drive->hwif; -u8 dma_stat =0 , dma_cmd =0 , mask; +u8 dma_stat =0 , dma_cmd =0 ;/* stop DMA */ if (hwif->host_flags &IDE_HFLAG_MMIO ) {
@@ -304,11 +302,10 @@ int ide_dma_end(ide_drive_t *drive)/* clear INTR & ERROR bits */ ide_dma_sff_write_status (hwif, dma_stat |ATA_DMA_ERR |ATA_DMA_INTR ); -wmb (); +#define CHECK_DMA_MASK (ATA_DMA_ACTIVE | ATA_DMA_ERR | ATA_DMA_INTR)/* verify good DMA status */ - mask =ATA_DMA_ACTIVE |ATA_DMA_ERR |ATA_DMA_INTR ; -if ((dma_stat & mask) !=ATA_DMA_INTR ) +if ((dma_stat &CHECK_DMA_MASK ) !=ATA_DMA_INTR )return 0x10 | dma_stat;return 0 ; }
drivers/ide/ide-h8300.c +2 -99
113 lines not on this page · raw message
drivers/ide/ide-io-std.c +17 -58
115 lines not on this page · raw message
drivers/ide/ide-io.c +7 -6
@@ -86,18 +86,18 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) tp_ops->input_data (drive, cmd, data,2 ); - tf->data = data[0 ]; - tf->hob_data = data[1 ]; + cmd->tf.data = data[0 ]; + cmd->hob.data = data[1 ]; } - tp_ops->tf_read (drive, cmd); +ide_tf_readback (drive, cmd);if ((cmd->tf_flags &IDE_TFLAG_CUSTOM_HANDLER ) && tf_cmd ==ATA_CMD_IDLEIMMEDIATE ) {if (tf->lbal !=0xc4 ) {printk (KERN_ERR "%s: head unload failed!\n" , drive->name); -ide_tf_dump (drive->name, tf); +ide_tf_dump (drive->name, cmd); }else drive->dev_flags |=IDE_DFLAG_PARKED ; }
@@ -205,8 +205,9 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive)return ide_stopped; } - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE | -IDE_TFLAG_CUSTOM_HANDLER ; + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; + cmd.tf_flags =IDE_TFLAG_CUSTOM_HANDLER ;do_rw_taskfile (drive, &cmd);
drivers/ide/ide-ioctls.c +8 -6
@@ -141,11 +141,12 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) tf->lbal = args[1 ]; tf->lbam =0x4f ; tf->lbah =0xc2 ; - cmd.tf_flags =IDE_TFLAG_OUT_TF |IDE_TFLAG_IN_NSECT ; + cmd.valid.out.tf =IDE_VALID_OUT_TF ; + cmd.valid.in.tf =IDE_VALID_NSECT ; }else { tf->nsect = args[1 ]; - cmd.tf_flags =IDE_TFLAG_OUT_FEATURE |IDE_TFLAG_OUT_NSECT | -IDE_TFLAG_IN_NSECT ; + cmd.valid.out.tf =IDE_VALID_FEATURE |IDE_VALID_NSECT ; + cmd.valid.in.tf =IDE_VALID_NSECT ; } tf->command = args[0 ]; cmd.protocol = args[3 ] ?ATA_PROT_PIO :ATA_PROT_NODATA ;
@@ -205,14 +206,15 @@ static int ide_task_ioctl(ide_drive_t *drive, unsigned long arg)return -EFAULT ;memset (&cmd,0 ,sizeof (cmd)); -memcpy (&cmd.tf_array[7 ], &args[1 ],6 ); +memcpy (&cmd.tf.feature, &args[1 ],6 ); cmd.tf.command = args[0 ]; - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; err =ide_no_data_taskfile (drive, &cmd); args[0 ] = cmd.tf.command; -memcpy (&args[1 ], &cmd.tf_array[7 ],6 ); +memcpy (&args[1 ], &cmd.tf.feature,6 );if (copy_to_user (p, args,7 )) err = -EFAULT ;
drivers/ide/ide-iops.c +8 -12
@@ -37,14 +37,11 @@ void SELECT_MASK(ide_drive_t *drive, int mask)u8 ide_read_error (ide_drive_t *drive) { -struct ide_cmd cmd; +struct ide_taskfile tf; -memset (&cmd,0 ,sizeof (cmd)); - cmd.tf_flags =IDE_TFLAG_IN_ERROR ; + drive->hwif->tp_ops->tf_read (drive, &tf,IDE_VALID_ERROR ); - drive->hwif->tp_ops->tf_read (drive, &cmd); - -return cmd.tf.error; +return tf.error; }EXPORT_SYMBOL_GPL (ide_read_error);
@@ -312,10 +309,10 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) {ide_hwif_t *hwif = drive->hwif;const struct ide_tp_ops *tp_ops = hwif->tp_ops; +struct ide_taskfile tf;u16 *id = drive->id, i;int error =0 ;u8 stat; -struct ide_cmd cmd;#ifdef CONFIG_BLK_DEV_IDEDMA if (hwif->dma_ops)/* check if host supports DMA */
@@ -347,12 +344,11 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)udelay (1 ); tp_ops->write_devctl (hwif,ATA_NIEN |ATA_DEVCTL_OBS ); -memset (&cmd,0 ,sizeof (cmd)); - cmd.tf_flags =IDE_TFLAG_OUT_FEATURE |IDE_TFLAG_OUT_NSECT ; - cmd.tf.feature =SETFEATURES_XFER ; - cmd.tf.nsect = speed; +memset (&tf,0 ,sizeof (tf)); + tf.feature =SETFEATURES_XFER ; + tf.nsect = speed; - tp_ops->tf_load (drive, &cmd); + tp_ops->tf_load (drive, &tf,IDE_VALID_FEATURE |IDE_VALID_NSECT ); tp_ops->exec_command (hwif,ATA_CMD_SET_FEATURES );
drivers/ide/ide-lib.c +15 -13
@@ -49,16 +49,17 @@ static void ide_dump_opcode(ide_drive_t *drive)printk (KERN_CONT "0x%02x\n" , cmd->tf.command); } -u64 ide_get_lba_addr (struct ide_taskfile *tf,int lba48) +u64 ide_get_lba_addr (struct ide_cmd *cmd,int lba48) { +struct ide_taskfile *tf = &cmd->tf;u32 high, low; -if (lba48) - high = (tf->hob_lbah <<16 ) | (tf->hob_lbam <<8 ) | - tf->hob_lbal; -else - high = tf->device &0xf ; low = (tf->lbah <<16 ) | (tf->lbam <<8 ) | tf->lbal; +if (lba48) { + tf = &cmd->hob; + high = (tf->lbah <<16 ) | (tf->lbam <<8 ) | tf->lbal; + }else + high = tf->device &0xf ;return ((u64 )high <<24 ) | low; }
@@ -71,17 +72,18 @@ static void ide_dump_sector(ide_drive_t *drive)u8 lba48 = !!(drive->dev_flags &IDE_DFLAG_LBA48 );memset (&cmd,0 ,sizeof (cmd)); -if (lba48) - cmd.tf_flags =IDE_TFLAG_IN_LBA |IDE_TFLAG_IN_HOB_LBA | -IDE_TFLAG_LBA48 ; -else - cmd.tf_flags =IDE_TFLAG_IN_LBA |IDE_TFLAG_IN_DEVICE ; +if (lba48) { + cmd.valid.in.tf =IDE_VALID_LBA ; + cmd.valid.in.hob =IDE_VALID_LBA ; + cmd.tf_flags =IDE_TFLAG_LBA48 ; + }else + cmd.valid.in.tf =IDE_VALID_LBA |IDE_VALID_DEVICE ; - drive->hwif->tp_ops->tf_read (drive, &cmd); +ide_tf_readback (drive, &cmd);if (lba48 || (tf->device &ATA_LBA ))printk (KERN_CONT ", LBAsect=%llu" , - (unsigned long long )ide_get_lba_addr (tf, lba48)); + (unsigned long long )ide_get_lba_addr (&cmd, lba48));else printk (KERN_CONT ", CHS=%d/%d/%d" , (tf->lbah <<8 ) + tf->lbam, tf->device &0xf , tf->lbal);
drivers/ide/ide-park.c +2 -1
@@ -74,7 +74,8 @@ ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) tf->lbal =0x4c ; tf->lbam =0x4e ; tf->lbah =0x55 ; - cmd.tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; + cmd.valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd.valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; }else /* cmd == REQ_UNPARK_HEADS */ tf->command =ATA_CMD_CHK_POWER ;
drivers/ide/ide-pm.c +2 -1
@@ -163,7 +163,8 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)return ide_stopped; out_do_tf: - cmd->tf_flags =IDE_TFLAG_TF |IDE_TFLAG_DEVICE ; + cmd->valid.out.tf =IDE_VALID_OUT_TF |IDE_VALID_DEVICE ; + cmd->valid.in.tf =IDE_VALID_IN_TF |IDE_VALID_DEVICE ; cmd->protocol =ATA_PROT_NODATA ;return do_rw_taskfile (drive, cmd);
drivers/ide/ide-probe.c +7 -11
@@ -283,13 +283,11 @@ int ide_dev_read_id(ide_drive_t *drive, u8 cmd, u16 *id)* identify command to be sure of reply */ if (cmd ==ATA_CMD_ID_ATAPI ) { -struct ide_cmd cmd; +struct ide_taskfile tf; -memset (&cmd,0 ,sizeof (cmd)); +memset (&tf,0 ,sizeof (tf));/* disable DMA & overlap */ - cmd.tf_flags =IDE_TFLAG_OUT_FEATURE ; - - tp_ops->tf_load (drive, &cmd); + tp_ops->tf_load (drive, &tf,IDE_VALID_FEATURE ); }/* ask drive for ID */
@@ -337,14 +335,11 @@ int ide_busy_sleep(ide_hwif_t *hwif, unsigned long timeout, int altstatus)static u8 ide_read_device (ide_drive_t *drive) { -struct ide_cmd cmd; - -memset (&cmd,0 ,sizeof (cmd)); - cmd.tf_flags =IDE_TFLAG_IN_DEVICE ; +struct ide_taskfile tf; - drive->hwif->tp_ops->tf_read (drive, &cmd); + drive->hwif->tp_ops->tf_read (drive, &tf,IDE_VALID_DEVICE ); -return cmd.tf.device; +return tf.device; }/**
@@ -1314,6 +1309,7 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws) host->get_lock = d->get_lock; host->release_lock = d->release_lock; host->host_flags = d->host_flags; + host->irq_flags = d->irq_flags; }return host;
drivers/ide/ide-proc.c +2 -2
@@ -204,8 +204,8 @@ static int set_xfer_rate (ide_drive_t *drive, int arg) cmd.tf.command =ATA_CMD_SET_FEATURES ; cmd.tf.feature =SETFEATURES_XFER ; cmd.tf.nsect = (u8 )arg; - cmd.tf_flags =IDE_TFLAG_OUT_FEATURE |IDE_TFLAG_OUT_NSECT | -IDE_TFLAG_IN_NSECT ; + cmd.valid.out.tf =IDE_VALID_FEATURE |IDE_VALID_NSECT ; + cmd.valid.in.tf =IDE_VALID_NSECT ; err =ide_no_data_taskfile (drive, &cmd);
drivers/ide/ide-taskfile.c +62 -35
163 lines not on this page · raw message
drivers/ide/ide.c +6 -0
@@ -178,6 +178,12 @@ EXPORT_SYMBOL_GPL(ide_pci_clk);module_param_named (pci_clock, ide_pci_clk, int,0 );MODULE_PARM_DESC (pci_clock,"PCI bus clock frequency (in MHz)" ); +int ide_trim =0 ; +EXPORT_SYMBOL_GPL (ide_trim); + +module_param_named (trim, ide_trim, int,0 ); +MODULE_PARM_DESC (trim,"TRIM support (0=off, 1=on)" ); +static int ide_set_dev_param_mask (const char *s,struct kernel_param *kp) {int a, b, i, j =1 ;
drivers/ide/ns87415.c +8 -26
@@ -61,41 +61,23 @@ static u8 superio_dma_sff_read_status(ide_hwif_t *hwif)return superio_ide_inb (hwif->dma_base +ATA_DMA_STATUS ); } -static void superio_tf_read (ide_drive_t *drive,struct ide_cmd *cmd) +static void superio_tf_read (ide_drive_t *drive,struct ide_taskfile *tf, +u8 valid) {struct ide_io_ports *io_ports = &drive->hwif->io_ports; -struct ide_taskfile *tf = &cmd->tf; -/* be sure we're looking at the low order bits */ -outb (ATA_DEVCTL_OBS , io_ports->ctl_addr); - -if (cmd->tf_flags &IDE_TFLAG_IN_ERROR ) +if (valid &IDE_VALID_ERROR ) tf->error =inb (io_ports->feature_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_NSECT ) +if (valid &IDE_VALID_NSECT ) tf->nsect =inb (io_ports->nsect_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_LBAL ) +if (valid &IDE_VALID_LBAL ) tf->lbal =inb (io_ports->lbal_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_LBAM ) +if (valid &IDE_VALID_LBAM ) tf->lbam =inb (io_ports->lbam_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_LBAH ) +if (valid &IDE_VALID_LBAH ) tf->lbah =inb (io_ports->lbah_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_DEVICE ) +if (valid &IDE_VALID_DEVICE ) tf->device =superio_ide_inb (io_ports->device_addr); - -if (cmd->tf_flags &IDE_TFLAG_LBA48 ) { -outb (ATA_HOB |ATA_DEVCTL_OBS , io_ports->ctl_addr); - -if (cmd->tf_flags &IDE_TFLAG_IN_HOB_ERROR ) - tf->hob_error =inb (io_ports->feature_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_HOB_NSECT ) - tf->hob_nsect =inb (io_ports->nsect_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_HOB_LBAL ) - tf->hob_lbal =inb (io_ports->lbal_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_HOB_LBAM ) - tf->hob_lbam =inb (io_ports->lbam_addr); -if (cmd->tf_flags &IDE_TFLAG_IN_HOB_LBAH ) - tf->hob_lbah =inb (io_ports->lbah_addr); - } }static void ns87415_dev_select (ide_drive_t *drive);
drivers/ide/q40ide.c +10 -4
@@ -16,6 +16,8 @@#include <linux/blkdev.h> #include <linux/ide.h> +#include <asm/ide.h> +/* * Bases of the IDE interfaces */
@@ -77,8 +79,10 @@ static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, {unsigned long data_addr = drive->hwif->io_ports.data_addr; -if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) -return insw (data_addr, buf, (len +1 ) /2 ); +if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) { +__ide_mm_insw (data_addr, buf, (len +1 ) /2 ); +return ; + }raw_insw_swapw ((u16 *)data_addr, buf, (len +1 ) /2 ); }
@@ -88,8 +92,10 @@ static void q40ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, {unsigned long data_addr = drive->hwif->io_ports.data_addr; -if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) -return outsw (data_addr, buf, (len +1 ) /2 ); +if (drive->media == ide_disk && cmd && (cmd->tf_flags &IDE_TFLAG_FS )) { +__ide_mm_outsw (data_addr, buf, (len +1 ) /2 ); +return ; + }raw_outsw_swapw ((u16 *)data_addr, buf, (len +1 ) /2 ); }
drivers/ide/scc_pata.c +16 -55
107 lines not on this page · raw message
drivers/ide/tx4938ide.c +2 -87
101 lines not on this page · raw message
drivers/ide/tx4939ide.c +12 -98
152 lines not on this page · raw message
include/linux/ide.h +57 -94
197 lines not on this page · raw message
Quoted 6 lines · Bartlomiej Zolnierkiewicz
- TRIM support ("discard" operation for SSD devices) (David Woodhouse & Matthew Wilcox)
Since this is a new feature and hasn't seen much testing with production devices it is not enabled by default yet (requires use of "ide_core.trim=1" kernel parameter).
As noted by Matthew, this appears to be missing the requisite block support?
Jeff
Quoted 10 lines · On Wednesday 08 April 2009 00:30:06 Jeff Garzik wrote:
Quoted 6 lines · Bartlomiej Zolnierkiewicz
- TRIM support ("discard" operation for SSD devices) (David Woodhouse & Matthew Wilcox)
Since this is a new feature and hasn't seen much testing with production devices it is not enabled by default yet (requires use of "ide_core.trim=1" kernel parameter).
As noted by Matthew, this appears to be missing the requisite block support?
I had this nice feeling of missing some detail but I didn't have time to think about it too much since I was rushing to get all changes integrated for the last pre -rc1 pull request. Now it is late due to premature TRIM support... :)
However it is not all that bad since we can just leave things as they are for now and disable TRIM support until block changes get merged with patch below.
[ I added it to the pull request. Sorry Linus, this is the best I can do ATM
before failing asleep -- if this is not acceptable I'll revisit pull request tomorrow. ]
Quoted 1 line
From
316f69abbb73595d0950c56c3b293534056d112eMon Sep 17 00:00:00 2001
From: Bartlomiej Zolnierkiewicz <[email protected]>
Date: Wed, 8 Apr 2009 00:42:59 +0200
Subject: [PATCH] ide: disable TRIM until block layer support gets merged
--- drivers/ide/ide.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
drivers/ide/ide.c +3 -0
@@ -178,11 +178,14 @@ EXPORT_SYMBOL_GPL(ide_pci_clk);module_param_named (pci_clock, ide_pci_clk, int,0 );MODULE_PARM_DESC (pci_clock,"PCI bus clock frequency (in MHz)" ); +/* needs block layer support */ +#if 0 int ide_trim =0 ;EXPORT_SYMBOL_GPL (ide_trim);module_param_named (trim, ide_trim, int,0 );MODULE_PARM_DESC (trim,"TRIM support (0=off, 1=on)" ); +#endif static int ide_set_dev_param_mask (const char *s,struct kernel_param *kp) {
Signature · 1 line
1.6.0.6
Quoted 2 lines · On Wednesday 08 April 2009 00:59:43 Bartlomiej Zolnierkiewicz wrote:
[ I added it to the pull request. Sorry Linus, this is the best I can do ATM
before failing asleep -- if this is not acceptable I'll revisit pull request
^^^^^^^
I failed to spot it.
On Wednesday 08 April 2009 00:59:43 Bartlomiej Zolnierkiewicz wrote:
[...]
drivers/ide/ide.c EXPORT_SYMBOL_GPL(ide_pci_clk); · line 183
Quoted 11 lines
drivers/ide/ide.c +2
-0@@ -178,11 +178,14 @@ EXPORT_SYMBOL_GPL(ide_pci_clk);module_param_named (pci_clock, ide_pci_clk, int,0 );MODULE_PARM_DESC (pci_clock,"PCI bus clock frequency (in MHz)" ); +/* needs block layer support */ +#if 0 int ide_trim =0 ;
This patch is crap and will break ide-disk build.
Linus, I'll revisit the pull request later...