Generic ide device flags
cover Generic ide device flags
Hi Bart,
here's another series of generic ide tweaks. The biggest change in here is the introduction of ide_drive_t->dev_flags member which replaces all flags members in the drivers structs. As a result, some PC_FLAGs become useless and got removed, details in the respective patch descriptions below. The changes have been tested with the hardware i have (i.e., ide-cd and ide-floppy).
drivers/ide/ide-atapi.c | 26 ++++++--- drivers/ide/ide-cd.c | 108 ++++++++++++++++++++--------------------- drivers/ide/ide-cd.h | 38 -------------- drivers/ide/ide-cd_ioctl.c | 27 +++++------ drivers/ide/ide-floppy.c | 81 ++++++++++++------------------ drivers/ide/ide-tape.c | 116 ++++++++++++++++++------------------------- drivers/scsi/ide-scsi.c | 24 ++------- include/linux/ide.h | 64 +++++++++++++++++++++++-- 8 files changed, 229 insertions(+), 255 deletions(-)
Signature · 2 lines
Regards/Gruß, Boris.
PATCH 1/16 ide: push pc callback pointer into the ide_drive_t structure
Refrain from carrying the callback ptr with every packet command since the callback function is only one anyways. ide_drive_t is probably not the most suitable place for it right now but is the more sane solution. Besides, these structs are going to be reorganized anyways during the generic ide rewrite.
--- include/linux/ide.h | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-)
include/linux/ide.h +7 -2
@@ -286,7 +286,7 @@ struct ide_acpi_drive_link;struct ide_acpi_hwif_link ;#endif -typedef struct ide_drive_s { +struct ide_drive_s {char name[4 ];/* drive name, such as "hda" */ char driver_req[10 ];/* requests specific driver */
@@ -379,7 +379,12 @@ typedef struct ide_drive_s {struct list_head list;struct device gendev;struct completion gendev_rel_comp;/* to deal with device release() */ -} ide_drive_t; + +/* callback for packet commands */ +void (*pc_callback)(struct ide_drive_s *); +}; + +typedef struct ide_drive_s ide_drive_t ;#define to_ide_device (dev)container_of(dev, ide_drive_t, gendev)
Signature · 1 line
1.5.5.4
PATCH 2/16 ide-floppy: use drive->pc_callback instead of pc->callback
In reply to Borislav PetkovIt is important that drive->pc_callback is set prior to enabling IRQs on the device since this is called from the IRQ handler. Otherwise it hurts as I learnt the hard way from the several "Kernel panic - not synching: Fatal exception in interrupt" during the weekend :).
The if-else block in the IRQ handler is only temporary so that bisect searches don't break and it'll be removed after converting the remainder of the drivers.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 10 ++++++++-- drivers/ide/ide-floppy.c | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-)
drivers/ide/ide-atapi.c +8 -2
@@ -30,7 +30,10 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,debug_log ("Enter %s - interrupt handler\n" , __func__);if (pc->flags &PC_FLAG_TIMEDOUT ) { - pc->callback (drive); +if (drive->media == ide_floppy) + drive->pc_callback (drive); +else + pc->callback (drive);return ide_stopped; }
@@ -96,7 +99,10 @@ cmd_finished:return ide_stopped; }/* Command finished - Call the callback function */ - pc->callback (drive); +if (drive->media == ide_floppy) + drive->pc_callback (drive); +else + pc->callback (drive);return ide_stopped; }
drivers/ide/ide-floppy.c +2 -2
@@ -354,7 +354,6 @@ static void idefloppy_init_pc(struct ide_atapi_pc *pc)memset (pc,0 ,sizeof (*pc)); pc->buf = pc->pc_buf; pc->buf_size =IDEFLOPPY_PC_BUFFER_SIZE ; - pc->callback = ide_floppy_callback; }static void idefloppy_create_request_sense_cmd (struct ide_atapi_pc *pc)
@@ -474,7 +473,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, pc->error =IDEFLOPPY_ERROR_GENERAL ; floppy->failed_pc =NULL ; - pc->callback (drive); + drive->pc_callback (drive);return ide_stopped; }
@@ -1039,6 +1038,7 @@ static void idefloppy_setup(ide_drive_t *drive, idefloppy_floppy_t *floppy) *((u16 *) &gcw) = drive->id->config; floppy->pc = floppy->pc_stack; + drive->pc_callback = ide_floppy_callback;if (((gcw[0 ] &0x60 ) >>5 ) ==1 ) floppy->flags |=IDEFLOPPY_FLAG_DRQ_INTERRUPT ;
Signature · 1 line
1.5.5.4
PATCH 3/16 ide-tape: use drive->pc_callback instead of pc->callback
In reply to Borislav PetkovThe if-else block in the IRQ handler is only temporary so that bisect searches don't break and it'll be removed after converting the remainder of the drivers.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 4 ++-- drivers/ide/ide-tape.c | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-)
drivers/ide/ide-atapi.c +2 -2
@@ -30,7 +30,7 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,debug_log ("Enter %s - interrupt handler\n" , __func__);if (pc->flags &PC_FLAG_TIMEDOUT ) { -if (drive->media == ide_floppy) +if (drive->media == ide_floppy || drive->media == ide_tape) drive->pc_callback (drive);else pc->callback (drive);
@@ -99,7 +99,7 @@ cmd_finished:return ide_stopped; }/* Command finished - Call the callback function */ -if (drive->media == ide_floppy) +if (drive->media == ide_floppy || drive->media == ide_tape) drive->pc_callback (drive);else pc->callback (drive);
drivers/ide/ide-tape.c +4 -3
@@ -690,7 +690,6 @@ static void idetape_init_pc(struct ide_atapi_pc *pc) pc->buf_size =IDETAPE_PC_BUFFER_SIZE ; pc->bh =NULL ; pc->b_data =NULL ; - pc->callback = ide_tape_callback; }static void idetape_create_request_sense_cmd (struct ide_atapi_pc *pc)
@@ -887,7 +886,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, pc->error =IDETAPE_ERROR_GENERAL ; } tape->failed_pc =NULL ; - pc->callback (drive); + drive->pc_callback (drive);return ide_stopped; }debug_log (DBG_SENSE ,"Retry #%d, cmd = %02X\n" , pc->retries, pc->c[0 ]);
@@ -948,7 +947,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) pc->error =IDETAPE_ERROR_GENERAL ; tape->failed_pc =NULL ; } - pc->callback (drive); + drive->pc_callback (drive);return ide_stopped; }
@@ -2459,6 +2458,8 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)u8 gcw[2 ];u16 *ctl = (u16 *)&tape->caps[12 ]; + drive->pc_callback = ide_tape_callback; +spin_lock_init (&tape->lock); drive->dsc_overlap =1 ;if (drive->hwif->host_flags &IDE_HFLAG_NO_DSC ) {
Signature · 1 line
1.5.5.4
PATCH 4/16 ide-scsi: use drive->pc_callback instead of pc->callback
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 10 ++-------- drivers/scsi/ide-scsi.c | 5 +++-- 2 files changed, 5 insertions(+), 10 deletions(-)
drivers/ide/ide-atapi.c +2 -8
@@ -30,10 +30,7 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,debug_log ("Enter %s - interrupt handler\n" , __func__);if (pc->flags &PC_FLAG_TIMEDOUT ) { -if (drive->media == ide_floppy || drive->media == ide_tape) - drive->pc_callback (drive); -else - pc->callback (drive); + drive->pc_callback (drive);return ide_stopped; }
@@ -99,10 +96,7 @@ cmd_finished:return ide_stopped; }/* Command finished - Call the callback function */ -if (drive->media == ide_floppy || drive->media == ide_tape) - drive->pc_callback (drive); -else - pc->callback (drive); + drive->pc_callback (drive);return ide_stopped; }
drivers/scsi/ide-scsi.c +3 -2
@@ -228,7 +228,6 @@ static int idescsi_check_condition(ide_drive_t *drive, rq->cmd_type =REQ_TYPE_SENSE ; rq->cmd_flags |=REQ_PREEMPT ; pc->timeout = jiffies +WAIT_READY ; - pc->callback = ide_scsi_callback;/* NOTE! Save the failed packet command in "rq->buffer" */ rq->buffer = (void *) failed_cmd->special; pc->scsi_cmd = ((struct ide_atapi_pc *) failed_cmd->special)->scsi_cmd;
@@ -478,6 +477,9 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)#if IDESCSI_DEBUG_LOG set_bit (IDESCSI_LOG_CMD , &scsi->log);#endif /* IDESCSI_DEBUG_LOG */ + + drive->pc_callback = ide_scsi_callback; +idescsi_add_settings (drive); }
@@ -630,7 +632,6 @@ static int idescsi_queue (struct scsi_cmnd *cmd, pc->scsi_cmd = cmd; pc->done = done; pc->timeout = jiffies + cmd->timeout_per_command; - pc->callback = ide_scsi_callback;if (test_bit (IDESCSI_LOG_CMD , &scsi->log)) {printk ("ide-scsi: %s: que %lu, cmd = " , drive->name, cmd->serial_number);
Signature · 1 line
1.5.5.4
PATCH 5/16 ide: remove pc->callback member from ide_atapi_pc
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- include/linux/ide.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-)
include/linux/ide.h +0 -2
@@ -632,8 +632,6 @@ struct ide_atapi_pc {*/ u8 pc_buf[256 ]; -void (*callback)(ide_drive_t *); -/* idetape only */ struct idetape_bh *bh;char *b_data;
Signature · 1 line
1.5.5.4
PATCH 6/16 ide-floppy: pass packet command in rq->cmd
In reply to Borislav PetkovMake a redundant copy of the packet command bits into rq->cmd. Later, after all drivers have been converted, it'll be switched to use that in the common code instead of pc->c.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-floppy.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-)
drivers/ide/ide-floppy.c +4 -0
@@ -291,6 +291,7 @@ static void idefloppy_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc, rq->cmd_type =REQ_TYPE_SPECIAL ; rq->cmd_flags |=REQ_PREEMPT ; rq->rq_disk = floppy->disk; +memcpy (rq->cmd, pc->c,12 );ide_do_drive_cmd (drive, rq); }
@@ -573,6 +574,8 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,put_unaligned (cpu_to_be16 (blocks), (unsigned short *)&pc->c[7 ]);put_unaligned (cpu_to_be32 (block), (unsigned int *) &pc->c[2 ]); +memcpy (rq->cmd, pc->c,12 ); + pc->rq = rq; pc->b_count = cmd ==READ ?0 : rq->bio->bi_size;if (rq->cmd_flags &REQ_RW )
@@ -670,6 +673,7 @@ static int idefloppy_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc) rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->buffer = (char *) pc; rq->cmd_type =REQ_TYPE_SPECIAL ; +memcpy (rq->cmd, pc->c,12 ); error =blk_execute_rq (drive->queue, floppy->disk, rq,0 );blk_put_request (rq);
Signature · 1 line
1.5.5.4
PATCH 7/16 ide-tape: make room for packet command ids in rq->cmd
In reply to Borislav Petkovide-tape uses rq->cmd for special commands from the chrdev interface so move those to byte 13 (BLK_MAX_CDB = 16) since a packet cmd is max 12 bytes.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-tape.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-)
drivers/ide/ide-tape.c +11 -11
@@ -704,7 +704,7 @@ static void idetape_init_rq(struct request *rq, u8 cmd) {blk_rq_init (NULL , rq); rq->cmd_type =REQ_TYPE_SPECIAL ; - rq->cmd[0 ] = cmd; + rq->cmd[13 ] = cmd; }/*
@@ -1018,7 +1018,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,*/ stat =ide_read_status (drive); -if (!drive->dsc_overlap && !(rq->cmd[0 ] &REQ_IDETAPE_PC2 )) +if (!drive->dsc_overlap && !(rq->cmd[13 ] &REQ_IDETAPE_PC2 ))set_bit (IDETAPE_FLAG_IGNORE_DSC , &tape->flags);if (drive->post_reset ==1 ) {
@@ -1035,7 +1035,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, }else if (time_after (jiffies, tape->dsc_timeout)) {printk (KERN_ERR "ide-tape: %s: DSC timeout\n" , tape->name); -if (rq->cmd[0 ] &REQ_IDETAPE_PC2 ) { +if (rq->cmd[13 ] &REQ_IDETAPE_PC2 ) {idetape_media_access_finished (drive);return ide_stopped; }else {
@@ -1048,27 +1048,27 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,idetape_postpone_request (drive);return ide_stopped; } -if (rq->cmd[0 ] &REQ_IDETAPE_READ ) { +if (rq->cmd[13 ] &REQ_IDETAPE_READ ) { pc =idetape_next_pc_storage (drive);ide_tape_create_rw_cmd (tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special,READ_6 ); goto out; } -if (rq->cmd[0 ] &REQ_IDETAPE_WRITE ) { +if (rq->cmd[13 ] &REQ_IDETAPE_WRITE ) { pc =idetape_next_pc_storage (drive);ide_tape_create_rw_cmd (tape, pc, rq->current_nr_sectors, (struct idetape_bh *)rq->special,WRITE_6 ); goto out; } -if (rq->cmd[0 ] &REQ_IDETAPE_PC1 ) { +if (rq->cmd[13 ] &REQ_IDETAPE_PC1 ) { pc = (struct ide_atapi_pc *) rq->buffer; - rq->cmd[0 ] &= ~(REQ_IDETAPE_PC1 ); - rq->cmd[0 ] |=REQ_IDETAPE_PC2 ; + rq->cmd[13 ] &= ~(REQ_IDETAPE_PC1 ); + rq->cmd[13 ] |=REQ_IDETAPE_PC2 ; goto out; } -if (rq->cmd[0 ] &REQ_IDETAPE_PC2 ) { +if (rq->cmd[13 ] &REQ_IDETAPE_PC2 ) {idetape_media_access_finished (drive);return ide_stopped; }
@@ -1280,7 +1280,7 @@ static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc) rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->cmd_type =REQ_TYPE_SPECIAL ; - rq->cmd[0 ] =REQ_IDETAPE_PC1 ; + rq->cmd[13 ] =REQ_IDETAPE_PC1 ; rq->buffer = (char *)pc; error =blk_execute_rq (drive->queue, tape->disk, rq,0 );blk_put_request (rq);
@@ -1464,7 +1464,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks, rq =blk_get_request (drive->queue,READ , __GFP_WAIT); rq->cmd_type =REQ_TYPE_SPECIAL ; - rq->cmd[0 ] = cmd; + rq->cmd[13 ] = cmd; rq->rq_disk = tape->disk; rq->special = (void *)bh; rq->sector = tape->first_frame;
Signature · 1 line
1.5.5.4
PATCH 8/16 ide-tape: pass packet command in rq->cmd
In reply to Borislav PetkovMake a redundant copy of the packet command bits into rq->cmd. Later, after all drivers have been converted, it'll be switched to use that in the common code instead of pc->c. While at it, simplify ide_tape_create_rw_cmd.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-tape.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-)
drivers/ide/ide-tape.c +11 -8
@@ -731,6 +731,7 @@ static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc, rq->cmd_flags |=REQ_PREEMPT ; rq->buffer = (char *) pc; rq->rq_disk = tape->disk; +memcpy (rq->cmd, pc->c,12 );ide_do_drive_cmd (drive, rq); }
@@ -952,9 +953,12 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) }static void ide_tape_create_rw_cmd (idetape_tape_t *tape, -struct ide_atapi_pc *pc,unsigned int length, -struct idetape_bh *bh,u8 opcode) +struct ide_atapi_pc *pc,struct request *rq, +u8 opcode) { +struct idetape_bh *bh = (struct idetape_bh *)rq->special; +unsigned int length = rq->current_nr_sectors; +idetape_init_pc (pc);put_unaligned (cpu_to_be32 (length), (unsigned int *) &pc->c[1 ]); pc->c[1 ] =1 ;
@@ -974,6 +978,8 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape, pc->b_data = bh->b_data; pc->b_count =atomic_read (&bh->b_count); } + +memcpy (rq->cmd, pc->c,12 ); } static ide_startstop_t idetape_do_request(ide_drive_t *drive,
@@ -1050,16 +1056,12 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, }if (rq->cmd[13 ] &REQ_IDETAPE_READ ) { pc =idetape_next_pc_storage (drive); -ide_tape_create_rw_cmd (tape, pc, rq->current_nr_sectors, - (struct idetape_bh *)rq->special, -READ_6 ); +ide_tape_create_rw_cmd (tape, pc, rq,READ_6 ); goto out; }if (rq->cmd[13 ] &REQ_IDETAPE_WRITE ) { pc =idetape_next_pc_storage (drive); -ide_tape_create_rw_cmd (tape, pc, rq->current_nr_sectors, - (struct idetape_bh *)rq->special, -WRITE_6 ); +ide_tape_create_rw_cmd (tape, pc, rq,WRITE_6 ); goto out; }if (rq->cmd[13 ] &REQ_IDETAPE_PC1 ) {
@@ -1282,6 +1284,7 @@ static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc) rq->cmd_type =REQ_TYPE_SPECIAL ; rq->cmd[13 ] =REQ_IDETAPE_PC1 ; rq->buffer = (char *)pc; +memcpy (rq->cmd, pc->c,12 ); error =blk_execute_rq (drive->queue, tape->disk, rq,0 );blk_put_request (rq);return error;
Signature · 1 line
1.5.5.4
PATCH 9/16 ide-scsi: pass packet command in rq->cmd
In reply to Borislav PetkovMake a redundant copy of the packet command bits into rq->cmd. Later, after all drivers have been converted, it'll be switched to use that in the common code instead of pc->c.
There should be no functionality change resulting from this patch.
--- drivers/scsi/ide-scsi.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/scsi/ide-scsi.c +2 -0
@@ -236,6 +236,7 @@ static int idescsi_check_condition(ide_drive_t *drive,ide_scsi_hex_dump (pc->c,6 ); } rq->rq_disk = scsi->disk; +memcpy (rq->cmd, pc->c,12 );ide_do_drive_cmd (drive, rq);return 0 ; }
@@ -646,6 +647,7 @@ static int idescsi_queue (struct scsi_cmnd *cmd, rq->special = (char *) pc; rq->cmd_type =REQ_TYPE_SPECIAL ;spin_unlock_irq (host->host_lock); +memcpy (rq->cmd, pc->c,12 );blk_execute_rq_nowait (drive->queue, scsi->disk, rq,0 ,NULL );spin_lock_irq (host->host_lock);return 0 ;
Signature · 1 line
1.5.5.4
PATCH 10/16 ide: use rq->cmd instead of pc->c in atapi common code
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-)
drivers/ide/ide-atapi.c +13 -5
@@ -22,6 +22,7 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, void (*io_buffers)(ide_drive_t *, struct ide_atapi_pc *, unsigned, int)) {ide_hwif_t *hwif = drive->hwif; +struct request *rq =HWGROUP (drive)->rq;xfer_func_t *xferfunc;unsigned int temp;u16 bcount;
@@ -63,8 +64,9 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,local_irq_enable_in_hardirq ();if (drive->media == ide_tape && !scsi && - (stat &ERR_STAT ) && pc->c[0 ] ==REQUEST_SENSE ) + (stat &ERR_STAT ) && rq->cmd[0 ] ==REQUEST_SENSE ) stat &= ~ERR_STAT ; +if ((stat &ERR_STAT ) || (pc->flags &PC_FLAG_DMA_ERROR )) {/* Error detected */ debug_log ("%s: I/O error\n" , drive->name);
@@ -75,16 +77,17 @@ ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, goto cmd_finished; } -if (pc->c[0 ] ==REQUEST_SENSE ) { +if (rq->cmd[0 ] ==REQUEST_SENSE ) {printk (KERN_ERR "%s: I/O error in request sense" " command\n" , drive->name);return ide_do_reset (drive); } -debug_log ("[cmd %x]: check condition\n" , pc->c[0 ]); +debug_log ("[cmd %x]: check condition\n" , rq->cmd[0 ]);/* Retry operation */ retry_pc (drive); +/* queued, but not started */ return ide_stopped; }
@@ -95,8 +98,10 @@ cmd_finished:dsc_handle (drive);return ide_stopped; } +/* Command finished - Call the callback function */ drive->pc_callback (drive); +return ide_stopped; }
@@ -117,6 +122,7 @@ cmd_finished:printk (KERN_ERR "%s: CoD != 0 in %s\n" , drive->name, __func__);return ide_do_reset (drive); } +if (((ireason &IO ) ==IO ) == !!(pc->flags &PC_FLAG_WRITING )) {/* Hopefully, we will never get here */ printk(KERN_ERR "%s: We wanted to %s, but the device wants us "
@@ -125,6 +131,7 @@ cmd_finished: (ireason & IO) ? "Read" : "Write");return ide_do_reset (drive); } +if (!(pc->flags &PC_FLAG_WRITING )) {/* Reading - Check that we have enough space */ temp = pc->xferred + bcount;
@@ -175,7 +182,7 @@ cmd_finished: pc->cur_pos += bcount;debug_log ("[cmd %x] transferred %d bytes on that intr.\n" , - pc->c[0 ], bcount); + rq->cmd[0 ], bcount);/* And set the interrupt handler again */ ide_set_handler (drive, handler, timeout, expiry);
@@ -210,6 +217,7 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, ide_expiry_t *expiry) {ide_hwif_t *hwif = drive->hwif; +struct request *rq =HWGROUP (drive)->rq;ide_startstop_t startstop;u8 ireason;
@@ -240,7 +248,7 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,/* Send the actual packet */ if ((pc->flags &PC_FLAG_ZIP_DRIVE ) ==0 ) - hwif->output_data (drive,NULL , pc->c,12 ); + hwif->output_data (drive,NULL , rq->cmd,12 );return ide_started; }
Signature · 1 line
1.5.5.4
PATCH 11/16 ide: add per-device flags
In reply to Borislav PetkovPush device flags up into ide_drive_t.
There should be no functionality change resulting from this patch.
--- include/linux/ide.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-)
include/linux/ide.h +60 -0
@@ -286,6 +286,64 @@ struct ide_acpi_drive_link;struct ide_acpi_hwif_link ;#endif +/* device flags */ +enum { +IDE_FLAG_DRQ_INTERRUPT = (1 <<0 ), +IDE_FLAG_MEDIA_CHANGED = (1 <<1 ), + +/* ide-cd */ +/* Drive cannot lock the door. */ +IDE_FLAG_NO_DOORLOCK = (1 <<2 ), +/* Drive cannot eject the disc. */ +IDE_FLAG_NO_EJECT = (1 <<3 ), +/* Drive is a pre ATAPI 1.2 drive. */ +IDE_FLAG_PRE_ATAPI12 = (1 <<4 ), +/* TOC addresses are in BCD. */ +IDE_FLAG_TOCADDR_AS_BCD = (1 <<5 ), +/* TOC track numbers are in BCD. */ +IDE_FLAG_TOCTRACKS_AS_BCD = (1 <<6 ), +/* +* Drive does not provide data in multiples of SECTOR_SIZE +* when more than one interrupt is needed. +*/ +IDE_FLAG_LIMIT_NFRAMES = (1 <<7 ), +/* Seeking in progress. */ +IDE_FLAG_SEEKING = (1 <<8 ), +/* Saved TOC information is current. */ +IDE_FLAG_TOC_VALID = (1 <<9 ), +/* We think that the drive door is locked. */ +IDE_FLAG_DOOR_LOCKED = (1 <<10 ), +/* SET_CD_SPEED command is unsupported. */ +IDE_FLAG_NO_SPEED_SELECT = (1 <<11 ), +IDE_FLAG_VERTOS_300_SSD = (1 <<12 ), +IDE_FLAG_VERTOS_600_ESD = (1 <<13 ), +IDE_FLAG_SANYO_3CD = (1 <<14 ), +IDE_FLAG_FULL_CAPS_PAGE = (1 <<15 ), +IDE_FLAG_PLAY_AUDIO_OK = (1 <<16 ), +IDE_FLAG_LE_SPEED_FIELDS = (1 <<17 ), + +/* ide-floppy */ +/* Format in progress */ +IDE_FLAG_FORMAT_IN_PROGRESS = (1 <<18 ), +/* Avoid commands not supported in Clik drive */ +IDE_FLAG_CLIK_DRIVE = (1 <<19 ), +/* Requires BH algorithm for packets */ +IDE_FLAG_ZIP_DRIVE = (1 <<20 ), + +/* ide-tape */ +IDE_FLAG_IGNORE_DSC = (1 <<21 ), +/* 0 When the tape position is unknown */ +IDE_FLAG_ADDRESS_VALID = (1 <<22 ), +/* Device already opened */ +IDE_FLAG_BUSY = (1 <<23 ), +/* Attempt to auto-detect the current user block size */ +IDE_FLAG_DETECT_BS = (1 <<24 ), +/* Currently on a filemark */ +IDE_FLAG_FILEMARK = (1 <<25 ), +/* 0 = no tape is loaded, so we don't rewind after ejecting */ +IDE_FLAG_MEDIUM_PRESENT = (1 <<26 ) +}; +struct ide_drive_s {char name[4 ];/* drive name, such as "hda" */ char driver_req[10 ];/* requests specific driver */
@@ -382,6 +440,8 @@ struct ide_drive_s {/* callback for packet commands */ void (*pc_callback)(struct ide_drive_s *); + +unsigned long dev_flags; };typedef struct ide_drive_s ide_drive_t ;
Signature · 1 line
1.5.5.4
PATCH 12/16 ide-floppy: convert to using the new dev_flags
In reply to Borislav Petkovwhile at it, remove PC_FLAG_ZIP_DRIVE from the packed command flags altogether and query the drive type through drive->dev_flags.
There should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 5 ++- drivers/ide/ide-floppy.c | 73 +++++++++++++++++----------------------------- include/linux/ide.h | 3 +- 3 files changed, 31 insertions(+), 50 deletions(-)
drivers/ide/ide-atapi.c +3 -2
@@ -247,7 +247,7 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, }/* Send the actual packet */ -if ((pc->flags &PC_FLAG_ZIP_DRIVE ) ==0 ) +if ((drive->dev_flags &IDE_FLAG_ZIP_DRIVE ) ==0 ) hwif->output_data (drive,NULL , rq->cmd,12 );return ide_started;
@@ -292,7 +292,8 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, bcount, dma);/* Issue the packet command */ -if (pc->flags &PC_FLAG_DRQ_INTERRUPT ) { +if ((pc->flags &PC_FLAG_DRQ_INTERRUPT ) || + (drive->dev_flags &IDE_FLAG_DRQ_INTERRUPT )) {ide_execute_command (drive,WIN_PACKETCMD , handler, timeout,NULL );return ide_started;
drivers/ide/ide-floppy.c +27 -46
201 lines not on this page · raw message
include/linux/ide.h +1 -2
@@ -657,8 +657,7 @@ enum {PC_FLAG_WRITING = (1 <<6 ),/* command timed out */ PC_FLAG_TIMEDOUT = (1 <<7 ), -PC_FLAG_ZIP_DRIVE = (1 <<8 ), - PC_FLAG_DRQ_INTERRUPT = (1 << 9), + PC_FLAG_DRQ_INTERRUPT = (1 << 8), }; struct ide_atapi_pc {
Signature · 1 line
1.5.5.4
PATCH 13/16 ide-tape: convert to using the new dev_flags
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-tape.c | 68 ++++++++++++++++------------------------------- 1 files changed, 23 insertions(+), 45 deletions(-)
drivers/ide/ide-tape.c +23 -45
@@ -195,23 +195,6 @@ enum {#define IDETAPE_BLOCK_DESCRIPTOR 0#define IDETAPE_CAPABILITIES_PAGE 0x2a -/* Tape flag bits values. */ -enum { -IDETAPE_FLAG_IGNORE_DSC = (1 <<0 ), -/* 0 When the tape position is unknown */ -IDETAPE_FLAG_ADDRESS_VALID = (1 <<1 ), -/* Device already opened */ -IDETAPE_FLAG_BUSY = (1 <<2 ), -/* Attempt to auto-detect the current user block size */ -IDETAPE_FLAG_DETECT_BS = (1 <<3 ), -/* Currently on a filemark */ -IDETAPE_FLAG_FILEMARK = (1 <<4 ), -/* DRQ interrupt device */ -IDETAPE_FLAG_DRQ_INTERRUPT = (1 <<5 ), -/* 0 = no tape is loaded, so we don't rewind after ejecting */ -IDETAPE_FLAG_MEDIUM_PRESENT = (1 <<6 ), -}; -/* * Most of our global data which we need to save even as we leave the driver due * to an interrupt or a timer event is stored in the struct defined below.
@@ -312,8 +295,6 @@ typedef struct ide_tape_obj {/* Wasted space in each stage */ int excess_bh_size; -/* Status/Action flags: long for set_bit */ -unsigned long flags;/* protects the ide-tape queue */ spinlock_t lock;
@@ -665,7 +646,7 @@ static void ide_tape_callback(ide_drive_t *drive)if (readpos[0 ] &0x4 ) {printk (KERN_INFO "ide-tape: Block location is unknown" "to the tape\n" ); -clear_bit (IDETAPE_FLAG_ADDRESS_VALID , &tape->flags); +clear_bit (IDE_FLAG_ADDRESS_VALID , &drive->dev_flags); uptodate =0 ; }else { debug_log(DBG_SENSE, "Block Location - %u\n",
@@ -673,7 +654,7 @@ static void ide_tape_callback(ide_drive_t *drive) tape->partition = readpos[1 ]; tape->first_frame =be32_to_cpu (*(u32 *)&readpos[4 ]); -set_bit (IDETAPE_FLAG_ADDRESS_VALID , &tape->flags); +set_bit (IDE_FLAG_ADDRESS_VALID , &drive->dev_flags); } }
@@ -742,7 +723,6 @@ static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,*/ static void idetape_retry_pc (ide_drive_t *drive) { -idetape_tape_t *tape = drive->driver_data;struct ide_atapi_pc *pc;struct request *rq;
@@ -750,7 +730,7 @@ static void idetape_retry_pc(ide_drive_t *drive) pc =idetape_next_pc_storage (drive); rq =idetape_next_rq_storage (drive);idetape_create_request_sense_cmd (pc); -set_bit (IDETAPE_FLAG_IGNORE_DSC , &tape->flags); +set_bit (IDE_FLAG_IGNORE_DSC , &drive->dev_flags);idetape_queue_pc_head (drive, pc, rq); }
@@ -1025,14 +1005,14 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, stat =ide_read_status (drive);if (!drive->dsc_overlap && !(rq->cmd[13 ] &REQ_IDETAPE_PC2 )) -set_bit (IDETAPE_FLAG_IGNORE_DSC , &tape->flags); +set_bit (IDE_FLAG_IGNORE_DSC , &drive->dev_flags);if (drive->post_reset ==1 ) { -set_bit (IDETAPE_FLAG_IGNORE_DSC , &tape->flags); +set_bit (IDE_FLAG_IGNORE_DSC , &drive->dev_flags); drive->post_reset =0 ; } -if (!test_and_clear_bit (IDETAPE_FLAG_IGNORE_DSC , &tape->flags) && +if (!test_and_clear_bit (IDE_FLAG_IGNORE_DSC , &drive->dev_flags) && (stat &SEEK_STAT ) ==0 ) {if (postponed_rq ==NULL ) { tape->dsc_polling_start = jiffies;
@@ -1075,10 +1055,8 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,return ide_stopped; }BUG (); -out: -if (test_bit (IDETAPE_FLAG_DRQ_INTERRUPT , &tape->flags)) - pc->flags |=PC_FLAG_DRQ_INTERRUPT ; +out:return idetape_issue_pc (drive, pc); }
@@ -1306,7 +1284,7 @@ static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)int load_attempted =0 ;/* Wait for the tape to become ready */ -set_bit (IDETAPE_FLAG_MEDIUM_PRESENT , &tape->flags); +set_bit (IDE_FLAG_MEDIUM_PRESENT , &drive->dev_flags); timeout += jiffies;while (time_before (jiffies, timeout)) {idetape_create_test_unit_ready_cmd (&pc);
@@ -1399,7 +1377,7 @@ static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)if (tape->chrdev_dir !=IDETAPE_DIR_READ )return ; -clear_bit (IDETAPE_FLAG_FILEMARK , &tape->flags); +clear_bit (IDE_FLAG_FILEMARK , &drive->dev_flags); tape->merge_bh_size =0 ;if (tape->merge_bh !=NULL ) {ide_tape_kfree_buffer (tape);
@@ -1638,7 +1616,7 @@ static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)debug_log (DBG_PROCS ,"Enter %s, %d blocks\n" , __func__, blocks);/* If we are at a filemark, return a read length of 0 */ -if (test_bit (IDETAPE_FLAG_FILEMARK , &tape->flags)) +if (test_bit (IDE_FLAG_FILEMARK , &drive->dev_flags))return 0 ;idetape_init_read (drive);
@@ -1748,7 +1726,7 @@ static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,if (tape->chrdev_dir ==IDETAPE_DIR_READ ) { tape->merge_bh_size =0 ; -if (test_and_clear_bit (IDETAPE_FLAG_FILEMARK , &tape->flags)) +if (test_and_clear_bit (IDE_FLAG_FILEMARK , &drive->dev_flags)) ++count;ide_tape_discard_merge_buffer (drive,0 ); }
@@ -1803,7 +1781,7 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,debug_log (DBG_CHRDEV ,"Enter %s, count %Zd\n" , __func__, count);if (tape->chrdev_dir !=IDETAPE_DIR_READ ) { -if (test_bit (IDETAPE_FLAG_DETECT_BS , &tape->flags)) +if (test_bit (IDE_FLAG_DETECT_BS , &drive->dev_flags))if (count > tape->blk_size && (count % tape->blk_size) ==0 ) tape->user_bs_factor = count / tape->blk_size;
@@ -1843,7 +1821,7 @@ static ssize_t idetape_chrdev_read(struct file *file, char __user *buf, tape->merge_bh_size = bytes_read-temp; } finish: -if (!actually_read &&test_bit (IDETAPE_FLAG_FILEMARK , &tape->flags)) { +if (!actually_read &&test_bit (IDE_FLAG_FILEMARK , &drive->dev_flags)) {debug_log (DBG_SENSE ,"%s: spacing over filemark\n" , tape->name);idetape_space_over_filemarks (drive,MTFSF ,1 );
@@ -2029,7 +2007,7 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) !IDETAPE_LU_LOAD_MASK); retval =idetape_queue_pc_tail (drive, &pc);if (!retval) -clear_bit (IDETAPE_FLAG_MEDIUM_PRESENT , &tape->flags); +clear_bit (IDE_FLAG_MEDIUM_PRESENT , &drive->dev_flags);return retval;case MTNOP :ide_tape_discard_merge_buffer (drive,0 );
@@ -2052,9 +2030,9 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) mt_count % tape->blk_size)return -EIO ; tape->user_bs_factor = mt_count / tape->blk_size; -clear_bit (IDETAPE_FLAG_DETECT_BS , &tape->flags); +clear_bit (IDE_FLAG_DETECT_BS , &drive->dev_flags); }else -set_bit (IDETAPE_FLAG_DETECT_BS , &tape->flags); +set_bit (IDE_FLAG_DETECT_BS , &drive->dev_flags);return 0 ;case MTSEEK :ide_tape_discard_merge_buffer (drive,0 );
@@ -2201,20 +2179,20 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp) filp->private_data = tape; -if (test_and_set_bit (IDETAPE_FLAG_BUSY , &tape->flags)) { +if (test_and_set_bit (IDE_FLAG_BUSY , &drive->dev_flags)) { retval = -EBUSY ; goto out_put_tape; } retval =idetape_wait_ready (drive,60 *HZ );if (retval) { -clear_bit (IDETAPE_FLAG_BUSY , &tape->flags); +clear_bit (IDE_FLAG_BUSY , &drive->dev_flags);printk (KERN_ERR "ide-tape: %s: drive not ready\n" , tape->name); goto out_put_tape; }idetape_read_position (drive); -if (!test_bit (IDETAPE_FLAG_ADDRESS_VALID , &tape->flags)) +if (!test_bit (IDE_FLAG_ADDRESS_VALID , &drive->dev_flags)) (void )idetape_rewind_tape (drive);/* Read block size and write protect status from drive. */
@@ -2230,7 +2208,7 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp)if (tape->write_prot) {if ((filp->f_flags &O_ACCMODE ) ==O_WRONLY || (filp->f_flags &O_ACCMODE ) ==O_RDWR ) { -clear_bit (IDETAPE_FLAG_BUSY , &tape->flags); +clear_bit (IDE_FLAG_BUSY , &drive->dev_flags); retval = -EROFS ; goto out_put_tape; }
@@ -2288,7 +2266,7 @@ static int idetape_chrdev_release(struct inode *inode, struct file *filp)ide_tape_discard_merge_buffer (drive,1 ); } -if (minor <128 &&test_bit (IDETAPE_FLAG_MEDIUM_PRESENT , &tape->flags)) +if (minor <128 &&test_bit (IDE_FLAG_MEDIUM_PRESENT , &drive->dev_flags)) (void )idetape_rewind_tape (drive);if (tape->chrdev_dir ==IDETAPE_DIR_NONE ) {if (tape->door_locked ==DOOR_LOCKED ) {
@@ -2298,7 +2276,7 @@ static int idetape_chrdev_release(struct inode *inode, struct file *filp) } } } -clear_bit (IDETAPE_FLAG_BUSY , &tape->flags); +clear_bit (IDE_FLAG_BUSY , &drive->dev_flags);ide_tape_put (tape);unlock_kernel ();return 0 ;
@@ -2483,7 +2461,7 @@ static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)/* Command packet DRQ type */ if (((gcw[0 ] &0x60 ) >>5 ) ==1 ) -set_bit (IDETAPE_FLAG_DRQ_INTERRUPT , &tape->flags); +set_bit (IDE_FLAG_DRQ_INTERRUPT , &drive->dev_flags);idetape_get_inquiry_results (drive);idetape_get_mode_sense_results (drive);
Signature · 1 line
1.5.5.4
PATCH 14/16 ide-scsi: convert to using the new dev_flags
In reply to Borislav PetkovRemove unused IDESCSI_PC_RQ while at it.
There should be no functionality change resulting from this patch.
--- drivers/scsi/ide-scsi.c | 17 +---------------- 1 files changed, 1 insertions(+), 16 deletions(-)
drivers/scsi/ide-scsi.c +1 -16
@@ -84,7 +84,6 @@ typedef struct ide_scsi_obj {struct Scsi_Host *host;struct ide_atapi_pc *pc;/* Current packet command */ -unsigned long flags;/* Status/Action flags */ unsigned long transform;/* SCSI cmd translation layer */ unsigned long log;/* log flags */ } idescsi_scsi_t;
@@ -126,16 +125,6 @@ static inline idescsi_scsi_t *drive_to_idescsi(ide_drive_t *ide_drive) }/* -* Per ATAPI device status bits. -*/ -#define IDESCSI_DRQ_INTERRUPT 0/* DRQ interrupt device */ - -/* -* ide-scsi requests. -*/ -#define IDESCSI_PC_RQ 90 - -/* * PIO data transfer routine using the scatter gather table. */ static void ide_scsi_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
@@ -434,10 +423,6 @@ static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *rif (blk_sense_request (rq) ||blk_special_request (rq)) {struct ide_atapi_pc *pc = (struct ide_atapi_pc *)rq->special; -idescsi_scsi_t *scsi =drive_to_idescsi (drive); - -if (test_bit (IDESCSI_DRQ_INTERRUPT , &scsi->flags)) - pc->flags |=PC_FLAG_DRQ_INTERRUPT ;if (drive->using_dma && !idescsi_map_sg (drive, pc)) pc->flags |=PC_FLAG_DMA_OK ;
@@ -473,7 +458,7 @@ static inline void idescsi_add_settings(ide_drive_t *drive) { ; }static void idescsi_setup (ide_drive_t *drive,idescsi_scsi_t *scsi) {if (drive->id && (drive->id->config &0x0060 ) ==0x20 ) -set_bit (IDESCSI_DRQ_INTERRUPT , &scsi->flags); +set_bit (IDE_FLAG_DRQ_INTERRUPT , &drive->dev_flags);clear_bit (IDESCSI_SG_TRANSFORM , &scsi->transform);#if IDESCSI_DEBUG_LOG set_bit (IDESCSI_LOG_CMD , &scsi->log);
Signature · 1 line
1.5.5.4
PATCH 15/16 ide: remove unused PC_FLAG_DRQ_INTERRUPT
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-atapi.c | 3 +-- include/linux/ide.h | 1 - 2 files changed, 1 insertions(+), 3 deletions(-)
drivers/ide/ide-atapi.c +1 -2
@@ -292,8 +292,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_atapi_pc *pc, bcount, dma);/* Issue the packet command */ -if ((pc->flags &PC_FLAG_DRQ_INTERRUPT ) || - (drive->dev_flags &IDE_FLAG_DRQ_INTERRUPT )) { +if (drive->dev_flags &IDE_FLAG_DRQ_INTERRUPT ) {ide_execute_command (drive,WIN_PACKETCMD , handler, timeout,NULL );return ide_started;
include/linux/ide.h +0 -1
@@ -657,7 +657,6 @@ enum {PC_FLAG_WRITING = (1 <<6 ),/* command timed out */ PC_FLAG_TIMEDOUT = (1 << 7), - PC_FLAG_DRQ_INTERRUPT = (1 << 8), }; struct ide_atapi_pc {
Signature · 1 line
1.5.5.4
PATCH 16/16 ide-cd: convert to using the new dev_flags
In reply to Borislav PetkovThere should be no functionality change resulting from this patch.
--- drivers/ide/ide-cd.c | 108 +++++++++++++++++++++----------------------- drivers/ide/ide-cd.h | 38 --------------- drivers/ide/ide-cd_ioctl.c | 27 +++++------ 3 files changed, 64 insertions(+), 109 deletions(-)
drivers/ide/ide-cd.c +52 -56
@@ -85,10 +85,8 @@ static void ide_cd_put(struct cdrom_info *cd)/* Mark that we've seen a media change and invalidate our internal buffers. */ static void cdrom_saw_media_change (ide_drive_t *drive) { -struct cdrom_info *cd = drive->driver_data; - - cd->cd_flags |=IDE_CD_FLAG_MEDIA_CHANGED ; - cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID ; + drive->dev_flags |=IDE_FLAG_MEDIA_CHANGED ; + drive->dev_flags &= ~IDE_FLAG_TOC_VALID ; } static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
@@ -528,7 +526,7 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,ide_pktcmd_tf_load (drive,IDE_TFLAG_OUT_NSECT |IDE_TFLAG_OUT_LBAL , xferlen, info->dma); -if (info->cd_flags &IDE_CD_FLAG_DRQ_INTERRUPT ) { +if (drive->dev_flags &IDE_FLAG_DRQ_INTERRUPT ) {/* waiting for CDB interrupt, not DMA yet. */ if (info->dma) drive->waiting_for_dma =0 ;
@@ -560,7 +558,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,struct cdrom_info *info = drive->driver_data;ide_startstop_t startstop; -if (info->cd_flags &IDE_CD_FLAG_DRQ_INTERRUPT ) { +if (drive->dev_flags &IDE_FLAG_DRQ_INTERRUPT ) {/* * Here we should have been called after receiving an interrupt * from the device. DRQ should how be set.
@@ -645,20 +643,18 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,*/ static int ide_cd_check_transfer_size (ide_drive_t *drive,int len) { -struct cdrom_info *cd = drive->driver_data; -if ((len %SECTOR_SIZE ) ==0 )return 0 ;printk (KERN_ERR "%s: %s: Bad transfer size %d\n" , drive->name, __func__, len); -if (cd->cd_flags &IDE_CD_FLAG_LIMIT_NFRAMES ) +if (drive->dev_flags &IDE_FLAG_LIMIT_NFRAMES )printk (KERN_ERR " This drive is not supported by " "this version of the driver\n" );else {printk (KERN_ERR " Trying to limit transfer sizes\n" ); - cd->cd_flags |=IDE_CD_FLAG_LIMIT_NFRAMES ; + drive->dev_flags |=IDE_FLAG_LIMIT_NFRAMES ; }return 1 ;
@@ -735,7 +731,7 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive)if (cdrom_decode_status (drive,0 , &stat))return ide_stopped; - info->cd_flags |=IDE_CD_FLAG_SEEKING ; + drive->dev_flags |=IDE_FLAG_SEEKING ;if (retry &&time_after (jiffies, info->start_seek +IDECD_SEEK_TIMER )) {if (--retry ==0 )
@@ -1187,7 +1183,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,int xferlen;if (blk_fs_request (rq)) { -if (info->cd_flags &IDE_CD_FLAG_SEEKING ) { +if (drive->dev_flags &IDE_FLAG_SEEKING ) {unsigned long elapsed = jiffies - info->start_seek;int stat =ide_read_status (drive);
@@ -1200,7 +1196,7 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,printk (KERN_ERR "%s: DSC timeout\n" , drive->name); } - info->cd_flags &= ~IDE_CD_FLAG_SEEKING ; + drive->dev_flags &= ~IDE_FLAG_SEEKING ; }if (rq_data_dir (rq) ==READ && IDE_LARGE_SEEK(info->last_block, block,
@@ -1358,7 +1354,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)*/ (void )cdrom_check_status (drive, sense); -if (info->cd_flags &IDE_CD_FLAG_TOC_VALID ) +if (drive->dev_flags &IDE_FLAG_TOC_VALID )return 0 ;/* try to get the total cdrom capacity and sector size */
@@ -1380,7 +1376,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)if (stat)return stat; -if (info->cd_flags &IDE_CD_FLAG_TOCTRACKS_AS_BCD ) { +if (drive->dev_flags &IDE_FLAG_TOCTRACKS_AS_BCD ) { toc->hdr.first_track =BCD2BIN (toc->hdr.first_track); toc->hdr.last_track =BCD2BIN (toc->hdr.last_track); }
@@ -1421,7 +1417,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)if (stat)return stat; -if (info->cd_flags &IDE_CD_FLAG_TOCTRACKS_AS_BCD ) { +if (drive->dev_flags &IDE_FLAG_TOCTRACKS_AS_BCD ) { toc->hdr.first_track = (u8 )BIN2BCD (CDROM_LEADOUT ); toc->hdr.last_track = (u8 )BIN2BCD (CDROM_LEADOUT ); }else {
@@ -1435,14 +1431,14 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) toc->hdr.toc_length =be16_to_cpu (toc->hdr.toc_length); -if (info->cd_flags &IDE_CD_FLAG_TOCTRACKS_AS_BCD ) { +if (drive->dev_flags &IDE_FLAG_TOCTRACKS_AS_BCD ) { toc->hdr.first_track =BCD2BIN (toc->hdr.first_track); toc->hdr.last_track =BCD2BIN (toc->hdr.last_track); }for (i =0 ; i <= ntracks; i++) { -if (info->cd_flags &IDE_CD_FLAG_TOCADDR_AS_BCD ) { -if (info->cd_flags &IDE_CD_FLAG_TOCTRACKS_AS_BCD ) +if (drive->dev_flags &IDE_FLAG_TOCADDR_AS_BCD ) { +if (drive->dev_flags &IDE_FLAG_TOCTRACKS_AS_BCD ) toc->ent[i].track =BCD2BIN (toc->ent[i].track);msf_from_bcd (&toc->ent[i].addr.msf); }
@@ -1465,7 +1461,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) toc->last_session_lba =msf_to_lba (0 ,2 ,0 );/* 0m 2s 0f */ } -if (info->cd_flags &IDE_CD_FLAG_TOCADDR_AS_BCD ) { +if (drive->dev_flags &IDE_FLAG_TOCADDR_AS_BCD ) {/* re-read multisession information using MSF format */ stat =cdrom_read_tocentry (drive,0 ,1 ,1 , (char *)&ms_tmp,sizeof (ms_tmp), sense);
@@ -1489,7 +1485,7 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) }/* Remember that we've read this stuff. */ - info->cd_flags |=IDE_CD_FLAG_TOC_VALID ; + drive->dev_flags |=IDE_FLAG_TOC_VALID ;return 0 ; }
@@ -1501,7 +1497,7 @@ int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)struct packet_command cgc;int stat, attempts =3 , size =ATAPI_CAPABILITIES_PAGE_SIZE ; -if ((info->cd_flags &IDE_CD_FLAG_FULL_CAPS_PAGE ) ==0 ) +if ((drive->dev_flags &IDE_FLAG_FULL_CAPS_PAGE ) ==0 ) size -=ATAPI_CAPABILITIES_PAGE_PAD_SIZE ;init_cdrom_command (&cgc, buf, size,CGC_DATA_UNKNOWN );
@@ -1522,7 +1518,7 @@ void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf) curspeed = *(u16 *)&buf[8 +14 ]; maxspeed = *(u16 *)&buf[8 +8 ]; -if (cd->cd_flags &IDE_CD_FLAG_LE_SPEED_FIELDS ) { +if (drive->dev_flags &IDE_FLAG_LE_SPEED_FIELDS ) { curspeed =le16_to_cpu (curspeed); maxspeed =le16_to_cpu (maxspeed); }else {
@@ -1568,7 +1564,7 @@ static int ide_cdrom_register(ide_drive_t *drive, int nslots) devinfo->handle = drive;strcpy (devinfo->name, drive->name); -if (info->cd_flags &IDE_CD_FLAG_NO_SPEED_SELECT ) +if (drive->dev_flags &IDE_FLAG_NO_SPEED_SELECT ) devinfo->mask |=CDC_SELECT_SPEED ; devinfo->disk = info->disk;
@@ -1594,8 +1590,8 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)return nslots; } -if (cd->cd_flags &IDE_CD_FLAG_PRE_ATAPI12 ) { - cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT ; +if (drive->dev_flags &IDE_FLAG_PRE_ATAPI12 ) { + drive->dev_flags &= ~IDE_FLAG_NO_EJECT ; cdi->mask &= ~CDC_PLAY_AUDIO ;return nslots; }
@@ -1613,9 +1609,9 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive)return 0 ;if ((buf[8 +6 ] &0x01 ) ==0 ) - cd->cd_flags |=IDE_CD_FLAG_NO_DOORLOCK ; + drive->dev_flags |=IDE_FLAG_NO_DOORLOCK ;if (buf[8 +6 ] &0x08 ) - cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT ; + drive->dev_flags &= ~IDE_FLAG_NO_EJECT ;if (buf[8 +3 ] &0x01 ) cdi->mask &= ~CDC_CD_R ;if (buf[8 +3 ] &0x02 )
@@ -1626,7 +1622,7 @@ static int ide_cdrom_probe_capabilities(ide_drive_t *drive) cdi->mask &= ~(CDC_DVD_RAM |CDC_RAM );if (buf[8 +3 ] &0x10 ) cdi->mask &= ~CDC_DVD_R ; -if ((buf[8 +4 ] &0x01 ) || (cd->cd_flags &IDE_CD_FLAG_PLAY_AUDIO_OK )) +if ((buf[8 +4 ] &0x01 ) || (drive->dev_flags &IDE_FLAG_PLAY_AUDIO_OK )) cdi->mask &= ~CDC_PLAY_AUDIO ; mechtype = buf[8 +6 ] >>5 ;
@@ -1791,43 +1787,43 @@ static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }static const struct cd_list_entry ide_cd_quirks_list[] = {/* Limit transfer size per interrupt. */ - {"SAMSUNG CD-ROM SCR-2430" ,NULL ,IDE_CD_FLAG_LIMIT_NFRAMES }, - {"SAMSUNG CD-ROM SCR-2432" ,NULL ,IDE_CD_FLAG_LIMIT_NFRAMES }, + {"SAMSUNG CD-ROM SCR-2430" ,NULL ,IDE_FLAG_LIMIT_NFRAMES }, + {"SAMSUNG CD-ROM SCR-2432" ,NULL ,IDE_FLAG_LIMIT_NFRAMES },/* SCR-3231 doesn't support the SET_CD_SPEED command. */ - {"SAMSUNG CD-ROM SCR-3231" ,NULL ,IDE_CD_FLAG_NO_SPEED_SELECT }, + {"SAMSUNG CD-ROM SCR-3231" ,NULL ,IDE_FLAG_NO_SPEED_SELECT },/* Old NEC260 (not R) was released before ATAPI 1.2 spec. */ - {"NEC CD-ROM DRIVE:260" ,"1.01" ,IDE_CD_FLAG_TOCADDR_AS_BCD | -IDE_CD_FLAG_PRE_ATAPI12 , }, + {"NEC CD-ROM DRIVE:260" ,"1.01" ,IDE_FLAG_TOCADDR_AS_BCD | +IDE_FLAG_PRE_ATAPI12 , },/* Vertos 300, some versions of this drive like to talk BCD. */ - {"V003S0DS" ,NULL ,IDE_CD_FLAG_VERTOS_300_SSD , }, + {"V003S0DS" ,NULL ,IDE_FLAG_VERTOS_300_SSD , },/* Vertos 600 ESD. */ - {"V006E0DS" ,NULL ,IDE_CD_FLAG_VERTOS_600_ESD , }, + {"V006E0DS" ,NULL ,IDE_FLAG_VERTOS_600_ESD , },/* * Sanyo 3 CD changer uses a non-standard command for CD changing * (by default standard ATAPI support for CD changers is used). */ - {"CD-ROM CDR-C3 G" ,NULL ,IDE_CD_FLAG_SANYO_3CD }, - {"CD-ROM CDR-C3G" ,NULL ,IDE_CD_FLAG_SANYO_3CD }, - {"CD-ROM CDR_C36" ,NULL ,IDE_CD_FLAG_SANYO_3CD }, + {"CD-ROM CDR-C3 G" ,NULL ,IDE_FLAG_SANYO_3CD }, + {"CD-ROM CDR-C3G" ,NULL ,IDE_FLAG_SANYO_3CD }, + {"CD-ROM CDR_C36" ,NULL ,IDE_FLAG_SANYO_3CD },/* Stingray 8X CD-ROM. */ - {"STINGRAY 8422 IDE 8X CD-ROM 7-27-95" ,NULL ,IDE_CD_FLAG_PRE_ATAPI12 }, + {"STINGRAY 8422 IDE 8X CD-ROM 7-27-95" ,NULL ,IDE_FLAG_PRE_ATAPI12 },/* * ACER 50X CD-ROM and WPI 32X CD-ROM require the full spec length * mode sense page capabilities size, but older drives break. */ - {"ATAPI CD ROM DRIVE 50X MAX" ,NULL ,IDE_CD_FLAG_FULL_CAPS_PAGE }, - {"WPI CDS-32X" ,NULL ,IDE_CD_FLAG_FULL_CAPS_PAGE }, + {"ATAPI CD ROM DRIVE 50X MAX" ,NULL ,IDE_FLAG_FULL_CAPS_PAGE }, + {"WPI CDS-32X" ,NULL ,IDE_FLAG_FULL_CAPS_PAGE },/* ACER/AOpen 24X CD-ROM has the speed fields byte-swapped. */ - {"" ,"241N" ,IDE_CD_FLAG_LE_SPEED_FIELDS }, + {"" ,"241N" ,IDE_FLAG_LE_SPEED_FIELDS },/* * Some drives used by Apple don't advertise audio play * but they do support reading TOC & audio datas. */ - {"MATSHITADVD-ROM SR-8187" ,NULL ,IDE_CD_FLAG_PLAY_AUDIO_OK }, - {"MATSHITADVD-ROM SR-8186" ,NULL ,IDE_CD_FLAG_PLAY_AUDIO_OK }, - {"MATSHITADVD-ROM SR-8176" ,NULL ,IDE_CD_FLAG_PLAY_AUDIO_OK }, - {"MATSHITADVD-ROM SR-8174" ,NULL ,IDE_CD_FLAG_PLAY_AUDIO_OK }, - {"Optiarc DVD RW AD-5200A" ,NULL ,IDE_CD_FLAG_PLAY_AUDIO_OK }, + {"MATSHITADVD-ROM SR-8187" ,NULL ,IDE_FLAG_PLAY_AUDIO_OK }, + {"MATSHITADVD-ROM SR-8186" ,NULL ,IDE_FLAG_PLAY_AUDIO_OK }, + {"MATSHITADVD-ROM SR-8176" ,NULL ,IDE_FLAG_PLAY_AUDIO_OK }, + {"MATSHITADVD-ROM SR-8174" ,NULL ,IDE_FLAG_PLAY_AUDIO_OK }, + {"Optiarc DVD RW AD-5200A" ,NULL ,IDE_FLAG_PLAY_AUDIO_OK }, {NULL ,NULL ,0 } };
@@ -1861,20 +1857,20 @@ static int ide_cdrom_setup(ide_drive_t *drive) drive->special.all =0 ; - cd->cd_flags =IDE_CD_FLAG_MEDIA_CHANGED |IDE_CD_FLAG_NO_EJECT | + drive->dev_flags =IDE_FLAG_MEDIA_CHANGED |IDE_FLAG_NO_EJECT |ide_cd_flags (id);if ((id->config &0x0060 ) ==0x20 ) - cd->cd_flags |=IDE_CD_FLAG_DRQ_INTERRUPT ; + drive->dev_flags |=IDE_FLAG_DRQ_INTERRUPT ; -if ((cd->cd_flags &IDE_CD_FLAG_VERTOS_300_SSD ) && +if ((drive->dev_flags &IDE_FLAG_VERTOS_300_SSD ) && id->fw_rev[4 ] =='1' && id->fw_rev[6 ] <='2' ) - cd->cd_flags |= (IDE_CD_FLAG_TOCTRACKS_AS_BCD | -IDE_CD_FLAG_TOCADDR_AS_BCD ); -else if ((cd->cd_flags &IDE_CD_FLAG_VERTOS_600_ESD ) && + drive->dev_flags |= (IDE_FLAG_TOCTRACKS_AS_BCD | +IDE_FLAG_TOCADDR_AS_BCD ); +else if ((drive->dev_flags &IDE_FLAG_VERTOS_600_ESD ) && id->fw_rev[4 ] =='1' && id->fw_rev[6 ] <='2' ) - cd->cd_flags |=IDE_CD_FLAG_TOCTRACKS_AS_BCD ; -else if (cd->cd_flags &IDE_CD_FLAG_SANYO_3CD ) + drive->dev_flags |=IDE_FLAG_TOCTRACKS_AS_BCD ; +else if (drive->dev_flags &IDE_FLAG_SANYO_3CD )/* 3 => use CD in slot 0 */ cdi->sanyo_slot =3 ;
drivers/ide/ide-cd.h +0 -38
@@ -27,42 +27,6 @@#define ATAPI_CAPABILITIES_PAGE_SIZE (8 + 20)#define ATAPI_CAPABILITIES_PAGE_PAD_SIZE 4 -enum { -/* Device sends an interrupt when ready for a packet command. */ -IDE_CD_FLAG_DRQ_INTERRUPT = (1 <<0 ), -/* Drive cannot lock the door. */ -IDE_CD_FLAG_NO_DOORLOCK = (1 <<1 ), -/* Drive cannot eject the disc. */ -IDE_CD_FLAG_NO_EJECT = (1 <<2 ), -/* Drive is a pre ATAPI 1.2 drive. */ -IDE_CD_FLAG_PRE_ATAPI12 = (1 <<3 ), -/* TOC addresses are in BCD. */ -IDE_CD_FLAG_TOCADDR_AS_BCD = (1 <<4 ), -/* TOC track numbers are in BCD. */ -IDE_CD_FLAG_TOCTRACKS_AS_BCD = (1 <<5 ), -/* -* Drive does not provide data in multiples of SECTOR_SIZE -* when more than one interrupt is needed. -*/ -IDE_CD_FLAG_LIMIT_NFRAMES = (1 <<6 ), -/* Seeking in progress. */ -IDE_CD_FLAG_SEEKING = (1 <<7 ), -/* Driver has noticed a media change. */ -IDE_CD_FLAG_MEDIA_CHANGED = (1 <<8 ), -/* Saved TOC information is current. */ -IDE_CD_FLAG_TOC_VALID = (1 <<9 ), -/* We think that the drive door is locked. */ -IDE_CD_FLAG_DOOR_LOCKED = (1 <<10 ), -/* SET_CD_SPEED command is unsupported. */ -IDE_CD_FLAG_NO_SPEED_SELECT = (1 <<11 ), -IDE_CD_FLAG_VERTOS_300_SSD = (1 <<12 ), -IDE_CD_FLAG_VERTOS_600_ESD = (1 <<13 ), -IDE_CD_FLAG_SANYO_3CD = (1 <<14 ), -IDE_CD_FLAG_FULL_CAPS_PAGE = (1 <<15 ), -IDE_CD_FLAG_PLAY_AUDIO_OK = (1 <<16 ), -IDE_CD_FLAG_LE_SPEED_FIELDS = (1 <<17 ), -}; -/* Structure of a MSF cdrom address. */ struct atapi_msf {byte reserved;
@@ -128,8 +92,6 @@ struct cdrom_info {unsigned long last_block;unsigned long start_seek; -unsigned int cd_flags; -u8 max_speed;/* Max speed of the drive. */ u8 current_speed;/* Current speed of the drive. */
drivers/ide/ide-cd_ioctl.c +12 -15
@@ -27,10 +27,9 @@ int ide_cdrom_open_real(struct cdrom_device_info *cdi, int purpose)void ide_cdrom_release_real (struct cdrom_device_info *cdi) {ide_drive_t *drive = cdi->handle; -struct cdrom_info *cd = drive->driver_data;if (!cdi->use_count) - cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID ; + drive->dev_flags &= ~IDE_FLAG_TOC_VALID ; }/*
@@ -83,13 +82,12 @@ int ide_cdrom_check_media_change_real(struct cdrom_device_info *cdi, int slot_nr) {ide_drive_t *drive = cdi->handle; -struct cdrom_info *cd = drive->driver_data;int retval;if (slot_nr ==CDSL_CURRENT ) { (void )cdrom_check_status (drive,NULL ); - retval = (cd->cd_flags &IDE_CD_FLAG_MEDIA_CHANGED ) ?1 :0 ; - cd->cd_flags &= ~IDE_CD_FLAG_MEDIA_CHANGED ; + retval = (drive->dev_flags &IDE_FLAG_MEDIA_CHANGED ) ?1 :0 ; + drive->dev_flags &= ~IDE_FLAG_MEDIA_CHANGED ;return retval; }else {return -EINVAL ;
@@ -107,11 +105,11 @@ int cdrom_eject(ide_drive_t *drive, int ejectflag,char loej =0x02 ;unsigned char cmd[BLK_MAX_CDB ]; -if ((cd->cd_flags &IDE_CD_FLAG_NO_EJECT ) && !ejectflag) +if ((drive->dev_flags &IDE_FLAG_NO_EJECT ) && !ejectflag)return -EDRIVE_CANT_DO_THIS ;/* reload fails on some drives, if the tray is locked */ -if ((cd->cd_flags &IDE_CD_FLAG_DOOR_LOCKED ) && ejectflag) +if ((drive->dev_flags &IDE_FLAG_DOOR_LOCKED ) && ejectflag)return 0 ;/* only tell drive to close tray if open, if it can do that */
@@ -131,7 +129,6 @@ staticint ide_cd_lockdoor (ide_drive_t *drive,int lockflag,struct request_sense *sense) { -struct cdrom_info *cd = drive->driver_data;struct request_sense my_sense;int stat;
@@ -139,7 +136,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag, sense = &my_sense;/* If the drive cannot lock the door, just pretend. */ -if (cd->cd_flags &IDE_CD_FLAG_NO_DOORLOCK ) { +if (drive->dev_flags &IDE_FLAG_NO_DOORLOCK ) { stat =0 ; }else {unsigned char cmd[BLK_MAX_CDB ];
@@ -160,7 +157,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag, (sense->asc == 0x24 || sense->asc == 0x20)) {printk (KERN_ERR "%s: door locking not supported\n" , drive->name); - cd->cd_flags |=IDE_CD_FLAG_NO_DOORLOCK ; + drive->dev_flags |=IDE_FLAG_NO_DOORLOCK ; stat =0 ; }
@@ -170,9 +167,9 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag,if (stat ==0 ) {if (lockflag) - cd->cd_flags |=IDE_CD_FLAG_DOOR_LOCKED ; + drive->dev_flags |=IDE_FLAG_DOOR_LOCKED ;else - cd->cd_flags &= ~IDE_CD_FLAG_DOOR_LOCKED ; + drive->dev_flags &= ~IDE_FLAG_DOOR_LOCKED ; }return stat;
@@ -250,7 +247,7 @@ int ide_cdrom_get_last_session(struct cdrom_device_info *cdi,struct request_sense sense;int ret; -if ((info->cd_flags &IDE_CD_FLAG_TOC_VALID ) ==0 || !info->toc) { +if ((drive->dev_flags &IDE_FLAG_TOC_VALID ) ==0 || !info->toc) { ret =ide_cd_read_toc (drive, &sense);if (ret)return ret;
@@ -308,7 +305,7 @@ int ide_cdrom_reset(struct cdrom_device_info *cdi)* A reset will unlock the door. If it was previously locked, * lock it again. */ -if (cd->cd_flags &IDE_CD_FLAG_DOOR_LOCKED ) +if (drive->dev_flags &IDE_FLAG_DOOR_LOCKED ) (void )ide_cd_lockdoor (drive,1 , &sense);return ret;
@@ -324,7 +321,7 @@ static int ide_cd_get_toc_entry(ide_drive_t *drive, int track,/* * don't serve cached data, if the toc isn't valid */ -if ((info->cd_flags &IDE_CD_FLAG_TOC_VALID ) ==0 ) +if ((drive->dev_flags &IDE_FLAG_TOC_VALID ) ==0 )return -EINVAL ;/* Check validity of requested track number. */
Signature · 1 line
1.5.5.4
Hi,
Quoted 7 lines · Borislav Petkov
Hi Bart,
here's another series of generic ide tweaks. The biggest change in here is the introduction of
ide_drive_t->dev_flagsmember which replaces all flags members in the drivers structs. As a result, somePC_FLAGsbecome useless and got removed, details in the respective patch descriptions below. The changes have been tested with the hardware i have (i.e., ide-cd and ide-floppy).
Thanks, I applied everything.
[ I made two minor changes while at it: HWGROUP(drive) is on its way out so
was replaced by 'hwif->hwgroup' and IDE_FLAG_* were renamed to IDE_DFLAG_* for consistency (we already have IDE_HFLAG_* and IDE_TFLAG_*). ]
Bart