Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville...
[safe/jmp/linux-2.6] / drivers / ide / ide-ioctls.c
index 4953028..6e7ae2b 100644 (file)
@@ -64,7 +64,8 @@ static int ide_get_identity_ioctl(ide_drive_t *drive, unsigned int cmd,
                goto out;
        }
 
-       id = kmalloc(size, GFP_KERNEL);
+       /* ata_id_to_hd_driveid() relies on 'id' to be fully allocated. */
+       id = kmalloc(ATA_ID_WORDS * 2, GFP_KERNEL);
        if (id == NULL) {
                rc = -ENOMEM;
                goto out;
@@ -118,7 +119,6 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
        u8 args[4], xfer_rate = 0;
        struct ide_cmd cmd;
        struct ide_taskfile *tf = &cmd.tf;
-       u16 *id = drive->id;
 
        if (NULL == (void *) arg) {
                struct request *rq;
@@ -141,14 +141,15 @@ 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.data_phase = args[3] ? TASKFILE_IN : TASKFILE_NO_DATA;
+       cmd.protocol = args[3] ? ATA_PROT_PIO : ATA_PROT_NODATA;
 
        if (args[3]) {
                cmd.tf_flags |= IDE_TFLAG_IO_16BIT;
@@ -160,16 +161,14 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
 
        if (tf->command == ATA_CMD_SET_FEATURES &&
            tf->feature == SETFEATURES_XFER &&
-           tf->nsect >= XFER_SW_DMA_0 &&
-           (id[ATA_ID_UDMA_MODES] ||
-            id[ATA_ID_MWDMA_MODES] ||
-            id[ATA_ID_SWDMA_MODES])) {
-               xfer_rate = args[1];
-               if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) {
-                       printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
-                                           "be set\n", drive->name);
+           tf->nsect >= XFER_SW_DMA_0) {
+               xfer_rate = ide_find_dma_mode(drive, tf->nsect);
+               if (xfer_rate != tf->nsect) {
+                       err = -EINVAL;
                        goto abort;
                }
+
+               cmd.tf_flags |= IDE_TFLAG_SET_XFER;
        }
 
        err = ide_raw_taskfile(drive, &cmd, buf, args[3]);
@@ -177,12 +176,6 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
        args[0] = tf->status;
        args[1] = tf->error;
        args[2] = tf->nsect;
-
-       if (!err && xfer_rate) {
-               /* active-retuning-calls future */
-               ide_set_xfer_rate(drive, xfer_rate);
-               ide_driveid_update(drive);
-       }
 abort:
        if (copy_to_user((void __user *)arg, &args, 4))
                err = -EFAULT;
@@ -205,14 +198,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;
@@ -229,7 +223,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);