VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / scsi / sr_ioctl.c
index 0416030..7d24b57 100644 (file)
 #include <asm/io.h>
 #include <asm/uaccess.h>
 
-#include "scsi.h"
-#include "hosts.h"
+#include <scsi/scsi.h>
+#include <scsi/scsi_dbg.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_eh.h>
+#include <scsi/scsi_host.h>
 #include <scsi/scsi_ioctl.h>
+#include <scsi/scsi_request.h>
 
 #include "sr.h"
 
@@ -34,7 +38,7 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti
 {
        struct cdrom_tocentry trk0_te, trk1_te;
        struct cdrom_tochdr tochdr;
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
        int ntracks, ret;
 
        if ((ret = sr_audio_ioctl(cdi, CDROMREADTOCHDR, &tochdr)))
@@ -57,7 +61,7 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti
        if ((ret = sr_audio_ioctl(cdi, CDROMREADTOCENTRY, &trk1_te)))
                return ret;
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
        cgc.cmd[3] = trk0_te.cdte_addr.msf.minute;
        cgc.cmd[4] = trk0_te.cdte_addr.msf.second;
@@ -65,7 +69,7 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti
        cgc.cmd[6] = trk1_te.cdte_addr.msf.minute;
        cgc.cmd[7] = trk1_te.cdte_addr.msf.second;
        cgc.cmd[8] = trk1_te.cdte_addr.msf.frame;
-       cgc.data_direction = SCSI_DATA_NONE;
+       cgc.data_direction = DMA_NONE;
        cgc.timeout = IOCTL_TIMEOUT;
        return sr_do_ioctl(cdi->handle, &cgc);
 }
@@ -74,7 +78,7 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti
    error code is.  Normally the UNIT_ATTENTION code will automatically
    clear after one error */
 
-int sr_do_ioctl(Scsi_CD *cd, struct cdrom_generic_command *cgc)
+int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
 {
        struct scsi_request *SRpnt;
        struct scsi_device *SDev;
@@ -138,7 +142,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct cdrom_generic_command *cgc)
                        if (!cgc->quiet)
                                printk(KERN_INFO "%s: CDROM not ready.  Make sure there is a disc in the drive.\n", cd->cdi.name);
 #ifdef DEBUG
-                       print_req_sense("sr", SRpnt);
+                       scsi_print_req_sense("sr", SRpnt);
 #endif
                        err = -ENOMEDIUM;
                        break;
@@ -149,14 +153,14 @@ int sr_do_ioctl(Scsi_CD *cd, struct cdrom_generic_command *cgc)
                                /* sense: Invalid command operation code */
                                err = -EDRIVE_CANT_DO_THIS;
 #ifdef DEBUG
-                       print_command(cgc->cmd);
-                       print_req_sense("sr", SRpnt);
+                       __scsi_print_command(cgc->cmd);
+                       scsi_print_req_sense("sr", SRpnt);
 #endif
                        break;
                default:
                        printk(KERN_ERR "%s: CDROM (ioctl) error, command: ", cd->cdi.name);
-                       print_command(cgc->cmd);
-                       print_req_sense("sr", SRpnt);
+                       __scsi_print_command(cgc->cmd);
+                       scsi_print_req_sense("sr", SRpnt);
                        err = -EIO;
                }
        }
@@ -178,12 +182,12 @@ int sr_do_ioctl(Scsi_CD *cd, struct cdrom_generic_command *cgc)
 
 static int test_unit_ready(Scsi_CD *cd)
 {
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
        cgc.quiet = 1;
-       cgc.data_direction = SCSI_DATA_NONE;
+       cgc.data_direction = DMA_NONE;
        cgc.timeout = IOCTL_TIMEOUT;
        return sr_do_ioctl(cd, &cgc);
 }
@@ -191,12 +195,12 @@ static int test_unit_ready(Scsi_CD *cd)
 int sr_tray_move(struct cdrom_device_info *cdi, int pos)
 {
        Scsi_CD *cd = cdi->handle;
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_START_STOP_UNIT;
        cgc.cmd[4] = (pos == 0) ? 0x03 /* close */ : 0x02 /* eject */ ;
-       cgc.data_direction = SCSI_DATA_NONE;
+       cgc.data_direction = DMA_NONE;
        cgc.timeout = IOCTL_TIMEOUT;
        return sr_do_ioctl(cd, &cgc);
 }
@@ -269,18 +273,18 @@ int sr_get_last_session(struct cdrom_device_info *cdi,
 int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
 {
        Scsi_CD *cd = cdi->handle;
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
        char *buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd));
        int result;
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
        cgc.cmd[2] = 0x40;      /* I do want the subchannel info */
        cgc.cmd[3] = 0x02;      /* Give me medium catalog number info */
        cgc.cmd[8] = 24;
        cgc.buffer = buffer;
        cgc.buflen = 24;
-       cgc.data_direction = SCSI_DATA_READ;
+       cgc.data_direction = DMA_FROM_DEVICE;
        cgc.timeout = IOCTL_TIMEOUT;
        result = sr_do_ioctl(cd, &cgc);
 
@@ -299,18 +303,18 @@ int sr_reset(struct cdrom_device_info *cdi)
 int sr_select_speed(struct cdrom_device_info *cdi, int speed)
 {
        Scsi_CD *cd = cdi->handle;
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
 
        if (speed == 0)
                speed = 0xffff; /* set to max */
        else
                speed *= 177;   /* Nx to kbyte/s */
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_SET_SPEED;   /* SET CD SPEED */
        cgc.cmd[2] = (speed >> 8) & 0xff;       /* MSB for speed (in kbytes/sec) */
        cgc.cmd[3] = speed & 0xff;      /* LSB */
-       cgc.data_direction = SCSI_DATA_NONE;
+       cgc.data_direction = DMA_NONE;
        cgc.timeout = IOCTL_TIMEOUT;
 
        if (sr_do_ioctl(cd, &cgc))
@@ -327,11 +331,14 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed)
 int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
 {
        Scsi_CD *cd = cdi->handle;
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
        int result;
        unsigned char *buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd));
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       if (!buffer)
+               return -ENOMEM;
+
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.timeout = IOCTL_TIMEOUT;
 
        switch (cmd) {
@@ -344,7 +351,7 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
                        cgc.buffer = buffer;
                        cgc.buflen = 12;
                        cgc.quiet = 1;
-                       cgc.data_direction = SCSI_DATA_READ;
+                       cgc.data_direction = DMA_FROM_DEVICE;
 
                        result = sr_do_ioctl(cd, &cgc);
 
@@ -364,7 +371,7 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
                        cgc.cmd[8] = 12;                /* LSB of length */
                        cgc.buffer = buffer;
                        cgc.buflen = 12;
-                       cgc.data_direction = SCSI_DATA_READ;
+                       cgc.data_direction = DMA_FROM_DEVICE;
 
                        result = sr_do_ioctl(cd, &cgc);
 
@@ -390,7 +397,7 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
                cgc.cmd[5] = ti->cdti_ind0;
                cgc.cmd[7] = ti->cdti_trk1;
                cgc.cmd[8] = ti->cdti_ind1;
-               cgc.data_direction = SCSI_DATA_NONE;
+               cgc.data_direction = DMA_NONE;
 
                result = sr_do_ioctl(cd, &cgc);
                if (result == -EDRIVE_CANT_DO_THIS)
@@ -428,14 +435,14 @@ int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg)
 
 static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int blksize)
 {
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
 
 #ifdef DEBUG
        printk("%s: sr_read_cd lba=%d format=%d blksize=%d\n",
               cd->cdi.name, lba, format, blksize);
 #endif
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_READ_CD;     /* READ_CD */
        cgc.cmd[1] = ((format & 7) << 2);
        cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
@@ -459,7 +466,7 @@ static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int
        }
        cgc.buffer = dest;
        cgc.buflen = blksize;
-       cgc.data_direction = SCSI_DATA_READ;
+       cgc.data_direction = DMA_FROM_DEVICE;
        cgc.timeout = IOCTL_TIMEOUT;
        return sr_do_ioctl(cd, &cgc);
 }
@@ -470,7 +477,7 @@ static int sr_read_cd(Scsi_CD *cd, unsigned char *dest, int lba, int format, int
 
 static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest)
 {
-       struct cdrom_generic_command cgc;
+       struct packet_command cgc;
        int rc;
 
        /* we try the READ CD command first... */
@@ -491,7 +498,7 @@ static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest
        printk("%s: sr_read_sector lba=%d blksize=%d\n", cd->cdi.name, lba, blksize);
 #endif
 
-       memset(&cgc, 0, sizeof(struct cdrom_generic_command));
+       memset(&cgc, 0, sizeof(struct packet_command));
        cgc.cmd[0] = GPCMD_READ_10;
        cgc.cmd[2] = (unsigned char) (lba >> 24) & 0xff;
        cgc.cmd[3] = (unsigned char) (lba >> 16) & 0xff;
@@ -500,7 +507,7 @@ static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest
        cgc.cmd[8] = 1;
        cgc.buffer = dest;
        cgc.buflen = blksize;
-       cgc.data_direction = SCSI_DATA_READ;
+       cgc.data_direction = DMA_FROM_DEVICE;
        cgc.timeout = IOCTL_TIMEOUT;
        rc = sr_do_ioctl(cd, &cgc);
 
@@ -541,5 +548,5 @@ int sr_dev_ioctl(struct cdrom_device_info *cdi,
                 unsigned int cmd, unsigned long arg)
 {
        Scsi_CD *cd = cdi->handle;
-       return scsi_ioctl(cd->device, cmd, (void *)arg);
+       return scsi_ioctl(cd->device, cmd, (void __user *)arg);
 }