IDE updates part 1
Subsystems (2)
Hi,
Mostly fixes/cleanups for ATAPI support from Tejun and Borislav (block layer change has been acked by Jens).
Linus, please pull from 'for-2.6.31' branch of:
master.kernel.org:/pub/scm/linux/kernel/git/bart/ide-2.6.git for-2.6.31
to receive the following updates:
block/blk-core.c | 10 +- drivers/ide/alim15x3.c | 10 +- drivers/ide/ide-atapi.c | 168 +++++++---- drivers/ide/ide-cd.c | 88 ++---- drivers/ide/ide-cd.h | 4 - drivers/ide/ide-disk.c | 1 - drivers/ide/ide-dma.c | 20 +- drivers/ide/ide-floppy.c | 24 +- drivers/ide/ide-io.c | 14 +- drivers/ide/ide-ioctls.c | 1 - drivers/ide/ide-park.c | 7 +- drivers/ide/ide-pm.c | 38 +-- drivers/ide/ide-tape.c | 734 ++++++++++---------------------------------- drivers/ide/ide-taskfile.c | 18 +- include/linux/ide.h | 27 +- 15 files changed, 369 insertions(+), 795 deletions(-)
Anton Vorontsov (1):
alim15x3: Remove historical hacks, re-enable init_hwif for PowerPC
Bartlomiej Zolnierkiewicz (5):
Merge branch 'for-linus' into for-next
Merge branch 'for-linus' into for-next
Merge branch 'for-linus' into for-next
Merge branch 'for-linus' into for-next
Merge branch 'for-2.6.31' into 2.6.30
Borislav Petkov (3):
ide: add helpers for preparing sense requests
ide-cd: convert to using generic sense request
ide-atapi: convert ide-{floppy,tape} to using preallocated sense buffer
Mark de Wever (1):
ide-tape: fix debug call
Tejun Heo (23):
block: clear req->errors on bio completion only for fs requests
ide-tape: remove back-to-back REQUEST_SENSE detection
ide: use blk_run_queue() instead of blk_start_queueing()
ide: don't set REQ_SOFTBARRIER
ide kill unused ide_cmd->special
ide-cd: clear sense buffer before issuing request sense
ide-floppy: block pc always uses bio
ide-taskfile: don't abuse rq->buffer
ide-atapi: don't abuse rq->buffer
ide-cd: don't abuse rq->buffer
ide-cd,atapi: use bio for internal commands
ide-pm: don't abuse rq->data
ide-tape,floppy: fix failed command completion after request sense ide-atapi,tape,floppy: allow ->pc_callback() to change rq->data_len
ide-tape: use single continuous buffer
ide-tape: use standard data transfer mechanism
ide-tape: kill idetape_bh
ide-tape: unify r/w init paths
ide-tape: use byte size instead of sectors on rw issue functions
ide-tape: simplify read/write functions
ide-atapi: kill unused fields and callbacks
ide: drop rq->data handling from ide_map_sg()
ide-dma: don't reset request fields on dma_timeout_retry()
block/blk-core.c +7 -3
@@ -1741,10 +1741,14 @@ static int __end_that_request_first(struct request *req, int error,trace_block_rq_complete (req->q, req);/* -* for a REQ_TYPE_BLOCK_PC request, we want to carry any eventual -* sense key with us all the way through +* For fs requests, rq is just carrier of independent bio's +* and each partial completion should be handled separately. +* Reset per-request error on each partial completion. +* +* TODO: tj: This is too subtle. It would be better to let +* low level drivers do what they see fit. */ -if (!blk_pc_request (req)) +if (blk_fs_request (req)) req->errors =0 ;if (error && (blk_fs_request (req) && !(req->cmd_flags &REQ_QUIET ))) {
drivers/ide/alim15x3.c +3 -7
@@ -402,27 +402,23 @@ static u8 ali_cable_detect(ide_hwif_t *hwif)return cbl; } -#if !defined(CONFIG_SPARC64 ) && !defined(CONFIG_PPC ) +#ifndef CONFIG_SPARC64 /** * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff * @hwif: interface to configure * * Obtain the IRQ tables for an ALi based IDE solution on the PC * class platforms. This part of the code isn't applicable to the -* Sparc and PowerPC systems. +* Sparc systems. */ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) { -struct pci_dev *dev =to_pci_dev (hwif->dev);u8 ideic, inmir;s8 irq_routing_table[] = {-1 ,9 ,3 ,10 ,4 ,5 ,7 ,6 ,1 ,11 ,0 ,12 ,0 ,14 ,0 ,15 };int irq =-1 ; -if (dev->device ==PCI_DEVICE_ID_AL_M5229 ) - hwif->irq = hwif->channel ?15 :14 ; -if (isa_dev) {/* * read IDE interface control
@@ -455,7 +451,7 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) }#else #define init_hwif_ali15x3 NULL -#endif /* !defined(CONFIG_SPARC64) && !defined(CONFIG_PPC) */ +#endif /* CONFIG_SPARC64 */ /** * init_dma_ali15x3 - set up DMA on ALi15x3
drivers/ide/ide-atapi.c +105 -63
255 lines not on this page · raw message
drivers/ide/ide-cd.c +27 -61
139 lines not on this page · raw message
drivers/ide/ide-cd.h +0 -4
@@ -87,10 +87,6 @@ struct cdrom_info {struct atapi_toc *toc; -/* The result of the last successful request sense command -on this device. */ -struct request_sense sense_data; -u8 max_speed;/* Max speed of the drive. */ u8 current_speed;/* Current speed of the drive. */
drivers/ide/ide-disk.c +0 -1
@@ -411,7 +411,6 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) cmd->protocol =ATA_PROT_NODATA ; rq->cmd_type =REQ_TYPE_ATA_TASKFILE ; - rq->cmd_flags |=REQ_SOFTBARRIER ; rq->special = cmd; }
drivers/ide/ide-dma.c +4 -16
@@ -510,23 +510,11 @@ ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error)/* * un-busy drive etc and make sure request is sane */ - rq = hwif->rq; -if (!rq) - goto out; - - hwif->rq =NULL ; - - rq->errors =0 ; - -if (!rq->bio) - goto out; - - rq->sector = rq->bio->bi_sector; - rq->current_nr_sectors =bio_iovec (rq->bio)->bv_len >>9 ; - rq->hard_cur_sectors = rq->current_nr_sectors; - rq->buffer =bio_data (rq->bio); -out: +if (rq) { + hwif->rq =NULL ; + rq->errors =0 ; + }return ret; }
drivers/ide/ide-floppy.c +14 -10
@@ -134,13 +134,17 @@ static ide_startstop_t ide_floppy_issue_pc(ide_drive_t *drive, drive->pc = pc;if (pc->retries >IDEFLOPPY_MAX_PC_RETRIES ) { +unsigned int done =blk_rq_bytes (drive->hwif->rq); +if (!(pc->flags &PC_FLAG_SUPPRESS_ERROR ))ide_floppy_report_error (floppy, pc); +/* Giving up */ pc->error =IDE_DRV_ERROR_GENERAL ; drive->failed_pc =NULL ; drive->pc_callback (drive,0 ); +ide_complete_rq (drive, -EIO , done);return ide_stopped; }
@@ -216,15 +220,13 @@ static void idefloppy_blockpc_cmd(struct ide_disk_obj *floppy,ide_init_pc (pc);memcpy (pc->c, rq->cmd,sizeof (pc->c)); pc->rq = rq; -if (rq->data_len &&rq_data_dir (rq) ==WRITE ) - pc->flags |=PC_FLAG_WRITING ; - pc->buf = rq->data; -if (rq->bio) +if (rq->data_len) { pc->flags |=PC_FLAG_DMA_OK ; -/* -* possibly problematic, doesn't look like ide-floppy correctly -* handled scattered requests if dma fails... -*/ +if (rq_data_dir (rq) ==WRITE ) + pc->flags |=PC_FLAG_WRITING ; + } +/* pio will be performed by ide_pio_bytes() which handles sg fine */ + pc->buf =NULL ; pc->req_xfer = pc->buf_size = rq->data_len; }
@@ -265,8 +267,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, } pc = &floppy->queued_pc;idefloppy_create_rw_cmd (drive, pc, rq, (unsigned long )block); - }else if (blk_special_request (rq)) { - pc = (struct ide_atapi_pc *) rq->buffer; + }else if (blk_special_request (rq) ||blk_sense_request (rq)) { + pc = (struct ide_atapi_pc *)rq->special; }else if (blk_pc_request (rq)) { pc = &floppy->queued_pc;idefloppy_blockpc_cmd (floppy, pc, rq);
@@ -275,6 +277,8 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive, goto out_end; } +ide_prep_sense (drive, rq); +memset (&cmd,0 ,sizeof (cmd));if (rq_data_dir (rq))
drivers/ide/ide-io.c +5 -9
@@ -248,14 +248,7 @@ void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd)struct scatterlist *sg = hwif->sg_table;struct request *rq = cmd->rq; -if (rq->cmd_type ==REQ_TYPE_ATA_TASKFILE ) { -sg_init_one (sg, rq->buffer, rq->nr_sectors *SECTOR_SIZE ); - cmd->sg_nents =1 ; - }else if (!rq->bio) { -sg_init_one (sg, rq->data, rq->data_len); - cmd->sg_nents =1 ; - }else - cmd->sg_nents =blk_rq_map_sg (drive->queue, rq, sg); + cmd->sg_nents =blk_rq_map_sg (drive->queue, rq, sg); }EXPORT_SYMBOL_GPL (ide_map_sg);
@@ -371,7 +364,7 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)if (rq->cmd_type ==REQ_TYPE_ATA_TASKFILE )return execute_drive_cmd (drive, rq);else if (blk_pm_request (rq)) { -struct request_pm_state *pm = rq->data; +struct request_pm_state *pm = rq->special;#ifdef DEBUG_PM printk ("%s: start_power_step(step: %d)\n" , drive->name, pm->pm_step);
@@ -484,6 +477,9 @@ void do_ide_request(struct request_queue *q)spin_unlock_irq (q->queue_lock); +/* HLD do_request() callback might sleep, make sure it's okay */ +might_sleep (); +if (ide_lock_host (host, hwif)) goto plug_device_2;
drivers/ide/ide-ioctls.c +0 -1
@@ -231,7 +231,6 @@ static int generic_drive_reset(ide_drive_t *drive) rq->cmd_type =REQ_TYPE_SPECIAL ; rq->cmd_len =1 ; rq->cmd[0 ] =REQ_DRIVE_RESET ; - rq->cmd_flags |=REQ_SOFTBARRIER ;if (blk_execute_rq (drive->queue,NULL , rq,1 )) ret = rq->errors;blk_put_request (rq);
drivers/ide/ide-park.c +2 -5
@@ -24,11 +24,8 @@ static void issue_park_cmd(ide_drive_t *drive, unsigned long timeout) start_queue =1 ;spin_unlock_irq (&hwif->lock); -if (start_queue) { -spin_lock_irq (q->queue_lock); -blk_start_queueing (q); -spin_unlock_irq (q->queue_lock); - } +if (start_queue) +blk_run_queue (q);return ; }spin_unlock_irq (&hwif->lock);
drivers/ide/ide-pm.c +15 -23
@@ -7,7 +7,6 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg)ide_hwif_t *hwif = drive->hwif;struct request *rq;struct request_pm_state rqpm; -struct ide_cmd cmd;int ret;/* call ACPI _GTM only once */
@@ -15,11 +14,9 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg)ide_acpi_get_timing (hwif);memset (&rqpm,0 ,sizeof (rqpm)); -memset (&cmd,0 ,sizeof (cmd)); rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->cmd_type =REQ_TYPE_PM_SUSPEND ; - rq->special = &cmd; - rq->data = &rqpm; + rq->special = &rqpm; rqpm.pm_step =IDE_PM_START_SUSPEND ;if (mesg.event ==PM_EVENT_PRETHAW ) mesg.event =PM_EVENT_FREEZE ;
@@ -41,7 +38,6 @@ int generic_ide_resume(struct device *dev)ide_hwif_t *hwif = drive->hwif;struct request *rq;struct request_pm_state rqpm; -struct ide_cmd cmd;int err;/* call ACPI _PS0 / _STM only once */
@@ -53,12 +49,10 @@ int generic_ide_resume(struct device *dev)ide_acpi_exec_tfs (drive);memset (&rqpm,0 ,sizeof (rqpm)); -memset (&cmd,0 ,sizeof (cmd)); rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->cmd_type =REQ_TYPE_PM_RESUME ; rq->cmd_flags |=REQ_PREEMPT ; - rq->special = &cmd; - rq->data = &rqpm; + rq->special = &rqpm; rqpm.pm_step =IDE_PM_START_RESUME ; rqpm.pm_state =PM_EVENT_ON ;
@@ -77,7 +71,7 @@ int generic_ide_resume(struct device *dev)void ide_complete_power_step (ide_drive_t *drive,struct request *rq) { -struct request_pm_state *pm = rq->data; +struct request_pm_state *pm = rq->special;#ifdef DEBUG_PM printk(KERN_INFO "%s: complete_power_step(step: %d)\n",
@@ -107,10 +101,8 @@ void ide_complete_power_step(ide_drive_t *drive, struct request *rq)ide_startstop_t ide_start_power_step (ide_drive_t *drive,struct request *rq) { -struct request_pm_state *pm = rq->data; -struct ide_cmd *cmd = rq->special; - -memset (cmd,0 ,sizeof (*cmd)); +struct request_pm_state *pm = rq->special; +struct ide_cmd cmd = { };switch (pm->pm_step) {case IDE_PM_FLUSH_CACHE :/* Suspend step 1 (flush cache) */
@@ -123,12 +115,12 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)return ide_stopped; }if (ata_id_flush_ext_enabled (drive->id)) - cmd->tf.command =ATA_CMD_FLUSH_EXT ; + cmd.tf.command =ATA_CMD_FLUSH_EXT ;else - cmd->tf.command =ATA_CMD_FLUSH ; + cmd.tf.command =ATA_CMD_FLUSH ; goto out_do_tf;case IDE_PM_STANDBY :/* Suspend step 2 (standby) */ - cmd->tf.command =ATA_CMD_STANDBYNOW1 ; + cmd.tf.command =ATA_CMD_STANDBYNOW1 ; goto out_do_tf;case IDE_PM_RESTORE_PIO :/* Resume step 1 (restore PIO) */ ide_set_max_pio (drive);
@@ -141,7 +133,7 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)ide_complete_power_step (drive, rq);return ide_stopped;case IDE_PM_IDLE :/* Resume step 2 (idle) */ - cmd->tf.command =ATA_CMD_IDLEIMMEDIATE ; + cmd.tf.command =ATA_CMD_IDLEIMMEDIATE ; goto out_do_tf;case IDE_PM_RESTORE_DMA :/* Resume step 3 (restore DMA) */ /*
@@ -163,11 +155,11 @@ ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *rq)return ide_stopped; out_do_tf: - 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 ; + 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); +return do_rw_taskfile (drive, &cmd); }/**
@@ -181,7 +173,7 @@ out_do_tf:void ide_complete_pm_rq (ide_drive_t *drive,struct request *rq) {struct request_queue *q = drive->queue; -struct request_pm_state *pm = rq->data; +struct request_pm_state *pm = rq->special;unsigned long flags;ide_complete_power_step (drive, rq);
@@ -207,7 +199,7 @@ void ide_complete_pm_rq(ide_drive_t *drive, struct request *rq)void ide_check_pm_state (ide_drive_t *drive,struct request *rq) { -struct request_pm_state *pm = rq->data; +struct request_pm_state *pm = rq->special;if (blk_pm_suspend_request (rq) && pm->pm_step ==IDE_PM_START_SUSPEND )
drivers/ide/ide-tape.c +164 -570
984 lines not on this page · raw message
drivers/ide/ide-taskfile.c +11 -7
@@ -424,7 +424,9 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->cmd_type =REQ_TYPE_ATA_TASKFILE ; - rq->buffer = buf; + +if (cmd->tf_flags &IDE_TFLAG_WRITE ) + rq->cmd_flags |=REQ_RW ;/* * (ks) We transfer currently only whole sectors.
@@ -432,18 +434,20 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf,* if we would find a solution to transfer any size. * To support special commands like READ LONG. */ - rq->hard_nr_sectors = rq->nr_sectors = nsect; - rq->hard_cur_sectors = rq->current_nr_sectors = nsect; - -if (cmd->tf_flags &IDE_TFLAG_WRITE ) - rq->cmd_flags |=REQ_RW ; +if (nsect) { + error =blk_rq_map_kern (drive->queue, rq, buf, + nsect *SECTOR_SIZE , __GFP_WAIT); +if (error) + goto put_req; + } rq->special = cmd; cmd->rq = rq; error =blk_execute_rq (drive->queue,NULL , rq,0 ); -blk_put_request (rq); +put_req: +blk_put_request (rq);return error; }
include/linux/ide.h +12 -15
@@ -26,6 +26,9 @@#include <asm/io.h> #include <asm/mutex.h> +/* for request_sense */ +#include <linux/cdrom.h> +#if defined(CONFIG_CRIS ) || defined(CONFIG_FRV ) || defined(CONFIG_MN10300 )# define SUPPORT_VLB_SYNC 0#else
@@ -324,7 +327,6 @@ struct ide_cmd {unsigned int cursg_ofs;struct request *rq;/* copy of request */ -void *special;/* valid_t generally */ };/* ATAPI packet command flags */
@@ -360,11 +362,7 @@ struct ide_atapi_pc {/* data buffer */ u8 *buf; -/* current buffer position */ -u8 *cur_pos;int buf_size; -/* missing/available data on the current buffer */ -int b_count;/* the corresponding request */ struct request *rq;
@@ -377,10 +375,6 @@ struct ide_atapi_pc {*/ u8 pc_buf[IDE_PC_BUFFER_SIZE ]; -/* idetape only */ -struct idetape_bh *bh; -char *b_data; -unsigned long timeout; };
@@ -593,16 +587,16 @@ struct ide_drive_s {/* callback for packet commands */ int (*pc_callback)(struct ide_drive_s *,int ); -void (*pc_update_buffers)(struct ide_drive_s *,struct ide_atapi_pc *); -int (*pc_io_buffers)(struct ide_drive_s *,struct ide_atapi_pc *, -unsigned int ,int ); -ide_startstop_t (*irq_handler)(struct ide_drive_s *);unsigned long atapi_flags;struct ide_atapi_pc request_sense_pc; -struct request request_sense_rq; + +/* current sense rq and buffer */ +bool sense_rq_armed; +struct request sense_rq; +struct request_sense sense_data; };typedef struct ide_drive_s ide_drive_t ;
@@ -1174,7 +1168,10 @@ int ide_do_test_unit_ready(ide_drive_t *, struct gendisk *);int ide_do_start_stop (ide_drive_t *,struct gendisk *,int );int ide_set_media_lock (ide_drive_t *,struct gendisk *,int );void ide_create_request_sense_cmd (ide_drive_t *,struct ide_atapi_pc *); -void ide_retry_pc (ide_drive_t *,struct gendisk *); +void ide_retry_pc (ide_drive_t *drive); + +void ide_prep_sense (ide_drive_t *drive,struct request *rq); +int ide_queue_sense_rq (ide_drive_t *drive,void *special);int ide_cd_expiry (ide_drive_t *);