ide: convert 'pio_mode' device setting to use DS_SYNC flag

* Convert 'pio_mode' device setting to use DS_SYNC flag.

* Remove unused special_t.b.{set_tune,serviced} and ide_drive_t.tune_req.
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 7f612f27
...@@ -543,30 +543,6 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive) ...@@ -543,30 +543,6 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive)
return ide_started; return ide_started;
} }
/*
* handle HDIO_SET_PIO_MODE ioctl abusers here, eventually it will go away
*/
static int set_pio_mode_abuse(ide_hwif_t *hwif, u8 req_pio)
{
switch (req_pio) {
case 202:
case 201:
case 200:
case 102:
case 101:
case 100:
return (hwif->host_flags & IDE_HFLAG_ABUSE_DMA_MODES) ? 1 : 0;
case 9:
case 8:
return (hwif->host_flags & IDE_HFLAG_ABUSE_PREFETCH) ? 1 : 0;
case 7:
case 6:
return (hwif->host_flags & IDE_HFLAG_ABUSE_FAST_DEVSEL) ? 1 : 0;
default:
return 0;
}
}
/** /**
* do_special - issue some special commands * do_special - issue some special commands
* @drive: drive the command is for * @drive: drive the command is for
...@@ -584,46 +560,12 @@ static ide_startstop_t do_special (ide_drive_t *drive) ...@@ -584,46 +560,12 @@ static ide_startstop_t do_special (ide_drive_t *drive)
#ifdef DEBUG #ifdef DEBUG
printk("%s: do_special: 0x%02x\n", drive->name, s->all); printk("%s: do_special: 0x%02x\n", drive->name, s->all);
#endif #endif
if (s->b.set_tune) { if (drive->media == ide_disk)
ide_hwif_t *hwif = drive->hwif; return ide_disk_special(drive);
const struct ide_port_ops *port_ops = hwif->port_ops;
u8 req_pio = drive->tune_req;
s->b.set_tune = 0;
if (set_pio_mode_abuse(drive->hwif, req_pio)) {
/*
* take ide_lock for IDE_DFLAG_[NO_]UNMASK/[NO_]IO_32BIT
*/
if (req_pio == 8 || req_pio == 9) {
unsigned long flags;
spin_lock_irqsave(&ide_lock, flags);
port_ops->set_pio_mode(drive, req_pio);
spin_unlock_irqrestore(&ide_lock, flags);
} else
port_ops->set_pio_mode(drive, req_pio);
} else {
int keep_dma =
!!(drive->dev_flags & IDE_DFLAG_USING_DMA);
ide_set_pio(drive, req_pio);
if (hwif->host_flags & IDE_HFLAG_SET_PIO_MODE_KEEP_DMA) {
if (keep_dma)
ide_dma_on(drive);
}
}
return ide_stopped;
} else {
if (drive->media == ide_disk)
return ide_disk_special(drive);
s->all = 0; s->all = 0;
drive->mult_req = 0; drive->mult_req = 0;
return ide_stopped; return ide_stopped;
}
} }
void ide_map_sg(ide_drive_t *drive, struct request *rq) void ide_map_sg(ide_drive_t *drive, struct request *rq)
......
...@@ -314,9 +314,32 @@ static int set_using_dma(ide_drive_t *drive, int arg) ...@@ -314,9 +314,32 @@ static int set_using_dma(ide_drive_t *drive, int arg)
#endif #endif
} }
/*
* handle HDIO_SET_PIO_MODE ioctl abusers here, eventually it will go away
*/
static int set_pio_mode_abuse(ide_hwif_t *hwif, u8 req_pio)
{
switch (req_pio) {
case 202:
case 201:
case 200:
case 102:
case 101:
case 100:
return (hwif->host_flags & IDE_HFLAG_ABUSE_DMA_MODES) ? 1 : 0;
case 9:
case 8:
return (hwif->host_flags & IDE_HFLAG_ABUSE_PREFETCH) ? 1 : 0;
case 7:
case 6:
return (hwif->host_flags & IDE_HFLAG_ABUSE_FAST_DEVSEL) ? 1 : 0;
default:
return 0;
}
}
static int set_pio_mode(ide_drive_t *drive, int arg) static int set_pio_mode(ide_drive_t *drive, int arg)
{ {
struct request *rq;
ide_hwif_t *hwif = drive->hwif; ide_hwif_t *hwif = drive->hwif;
const struct ide_port_ops *port_ops = hwif->port_ops; const struct ide_port_ops *port_ops = hwif->port_ops;
...@@ -327,17 +350,26 @@ static int set_pio_mode(ide_drive_t *drive, int arg) ...@@ -327,17 +350,26 @@ static int set_pio_mode(ide_drive_t *drive, int arg)
(hwif->host_flags & IDE_HFLAG_NO_SET_MODE)) (hwif->host_flags & IDE_HFLAG_NO_SET_MODE))
return -ENOSYS; return -ENOSYS;
if (drive->special.b.set_tune) if (set_pio_mode_abuse(drive->hwif, arg)) {
return -EBUSY; if (arg == 8 || arg == 9) {
unsigned long flags;
rq = blk_get_request(drive->queue, READ, __GFP_WAIT); /* take lock for IDE_DFLAG_[NO_]UNMASK/[NO_]IO_32BIT */
rq->cmd_type = REQ_TYPE_ATA_TASKFILE; spin_lock_irqsave(&ide_lock, flags);
port_ops->set_pio_mode(drive, arg);
spin_unlock_irqrestore(&ide_lock, flags);
} else
port_ops->set_pio_mode(drive, arg);
} else {
int keep_dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
drive->tune_req = (u8) arg; ide_set_pio(drive, arg);
drive->special.b.set_tune = 1;
blk_execute_rq(drive->queue, NULL, rq, 0); if (hwif->host_flags & IDE_HFLAG_SET_PIO_MODE_KEEP_DMA) {
blk_put_request(rq); if (keep_dma)
ide_dma_on(drive);
}
}
return 0; return 0;
} }
...@@ -367,7 +399,7 @@ ide_gen_devset_rw(io_32bit, io_32bit); ...@@ -367,7 +399,7 @@ ide_gen_devset_rw(io_32bit, io_32bit);
ide_gen_devset_rw(keepsettings, ksettings); ide_gen_devset_rw(keepsettings, ksettings);
ide_gen_devset_rw(unmaskirq, unmaskirq); ide_gen_devset_rw(unmaskirq, unmaskirq);
ide_gen_devset_rw(using_dma, using_dma); ide_gen_devset_rw(using_dma, using_dma);
__IDE_DEVSET(pio_mode, 0, NULL, set_pio_mode); __IDE_DEVSET(pio_mode, DS_SYNC, NULL, set_pio_mode);
static int generic_ide_suspend(struct device *dev, pm_message_t mesg) static int generic_ide_suspend(struct device *dev, pm_message_t mesg)
{ {
......
...@@ -262,8 +262,6 @@ static inline int __ide_default_irq(unsigned long base) ...@@ -262,8 +262,6 @@ static inline int __ide_default_irq(unsigned long base)
* set_geometry : respecify drive geometry * set_geometry : respecify drive geometry
* recalibrate : seek to cyl 0 * recalibrate : seek to cyl 0
* set_multmode : set multmode count * set_multmode : set multmode count
* set_tune : tune interface for drive
* serviced : service command
* reserved : unused * reserved : unused
*/ */
typedef union { typedef union {
...@@ -272,9 +270,7 @@ typedef union { ...@@ -272,9 +270,7 @@ typedef union {
unsigned set_geometry : 1; unsigned set_geometry : 1;
unsigned recalibrate : 1; unsigned recalibrate : 1;
unsigned set_multmode : 1; unsigned set_multmode : 1;
unsigned set_tune : 1; unsigned reserved : 5;
unsigned serviced : 1;
unsigned reserved : 3;
} b; } b;
} special_t; } special_t;
...@@ -514,7 +510,6 @@ struct ide_drive_s { ...@@ -514,7 +510,6 @@ struct ide_drive_s {
u8 ready_stat; /* min status value for drive ready */ u8 ready_stat; /* min status value for drive ready */
u8 mult_count; /* current multiple sector setting */ u8 mult_count; /* current multiple sector setting */
u8 mult_req; /* requested multiple sector setting */ u8 mult_req; /* requested multiple sector setting */
u8 tune_req; /* requested drive tuning setting */
u8 io_32bit; /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */ u8 io_32bit; /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
u8 bad_wstat; /* used for ignoring ATA_DF */ u8 bad_wstat; /* used for ignoring ATA_DF */
u8 head; /* "real" number of heads */ u8 head; /* "real" number of heads */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment