]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/ide-ioctls.c
Merge branch 'drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
[linux-2.6-omap-h63xx.git] / drivers / ide / ide-ioctls.c
index 7a0d62e7286be4fde40a0a06047b7b88aebcc052..a90945f4979287ca8d260d65c4fab2e144a846af 100644 (file)
@@ -6,11 +6,11 @@
 #include <linux/ide.h>
 
 static const struct ide_ioctl_devset ide_ioctl_settings[] = {
-{ HDIO_GET_32BIT,       HDIO_SET_32BIT,        get_io_32bit,  set_io_32bit  },
-{ HDIO_GET_KEEPSETTINGS, HDIO_SET_KEEPSETTINGS,        get_ksettings, set_ksettings },
-{ HDIO_GET_UNMASKINTR,  HDIO_SET_UNMASKINTR,   get_unmaskirq, set_unmaskirq },
-{ HDIO_GET_DMA,                 HDIO_SET_DMA,          get_using_dma, set_using_dma },
-{ -1,                   HDIO_SET_PIO_MODE,     NULL,          set_pio_mode  },
+{ HDIO_GET_32BIT,       HDIO_SET_32BIT,        &ide_devset_io_32bit  },
+{ HDIO_GET_KEEPSETTINGS, HDIO_SET_KEEPSETTINGS,        &ide_devset_keepsettings },
+{ HDIO_GET_UNMASKINTR,  HDIO_SET_UNMASKINTR,   &ide_devset_unmaskirq },
+{ HDIO_GET_DMA,                 HDIO_SET_DMA,          &ide_devset_using_dma },
+{ -1,                   HDIO_SET_PIO_MODE,     &ide_devset_pio_mode  },
 { 0 }
 };
 
@@ -18,13 +18,14 @@ int ide_setting_ioctl(ide_drive_t *drive, struct block_device *bdev,
                      unsigned int cmd, unsigned long arg,
                      const struct ide_ioctl_devset *s)
 {
+       const struct ide_devset *ds;
        unsigned long flags;
        int err = -EOPNOTSUPP;
 
-       for (; s->get_ioctl; s++) {
-               if (s->get && s->get_ioctl == cmd)
+       for (; (ds = s->setting); s++) {
+               if (ds->get && s->get_ioctl == cmd)
                        goto read_val;
-               else if (s->set && s->set_ioctl == cmd)
+               else if (ds->set && s->set_ioctl == cmd)
                        goto set_val;
        }
 
@@ -33,7 +34,7 @@ int ide_setting_ioctl(ide_drive_t *drive, struct block_device *bdev,
 read_val:
        mutex_lock(&ide_setting_mtx);
        spin_lock_irqsave(&ide_lock, flags);
-       err = s->get(drive);
+       err = ds->get(drive);
        spin_unlock_irqrestore(&ide_lock, flags);
        mutex_unlock(&ide_setting_mtx);
        return err >= 0 ? put_user(err, (long __user *)arg) : err;
@@ -46,7 +47,7 @@ set_val:
                        err = -EACCES;
                else {
                        mutex_lock(&ide_setting_mtx);
-                       err = s->set(drive, arg);
+                       err = ide_devset_execute(drive, ds, arg);
                        mutex_unlock(&ide_setting_mtx);
                }
        }
@@ -61,7 +62,7 @@ static int ide_get_identity_ioctl(ide_drive_t *drive, unsigned int cmd,
        int size = (cmd == HDIO_GET_IDENTITY) ? (ATA_ID_WORDS * 2) : 142;
        int rc = 0;
 
-       if (drive->id_read == 0) {
+       if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
                rc = -ENOMSG;
                goto out;
        }
@@ -85,8 +86,10 @@ out:
 
 static int ide_get_nice_ioctl(ide_drive_t *drive, unsigned long arg)
 {
-       return put_user((drive->dsc_overlap << IDE_NICE_DSC_OVERLAP) |
-                       (drive->nice1 << IDE_NICE_1), (long __user *)arg);
+       return put_user((!!(drive->dev_flags & IDE_DFLAG_DSC_OVERLAP)
+                        << IDE_NICE_DSC_OVERLAP) |
+                       (!!(drive->dev_flags & IDE_DFLAG_NICE1)
+                        << IDE_NICE_1), (long __user *)arg);
 }
 
 static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg)
@@ -96,11 +99,18 @@ static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg)
 
        if (((arg >> IDE_NICE_DSC_OVERLAP) & 1) &&
            (drive->media == ide_disk || drive->media == ide_floppy ||
-            drive->scsi))
+            (drive->dev_flags & IDE_DFLAG_SCSI)))
                return -EPERM;
 
-       drive->dsc_overlap = (arg >> IDE_NICE_DSC_OVERLAP) & 1;
-       drive->nice1 = (arg >> IDE_NICE_1) & 1;
+       if ((arg >> IDE_NICE_DSC_OVERLAP) & 1)
+               drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
+       else
+               drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
+
+       if ((arg >> IDE_NICE_1) & 1)
+               drive->dev_flags |= IDE_DFLAG_NICE1;
+       else
+               drive->dev_flags &= ~IDE_DFLAG_NICE1;
 
        return 0;
 }