|
@@ -2470,52 +2470,6 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi,
|
|
|
return cgc->stat;
|
|
|
}
|
|
|
|
|
|
-static
|
|
|
-int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
-{
|
|
|
- struct packet_command cgc;
|
|
|
- char buffer[16];
|
|
|
- int stat;
|
|
|
-
|
|
|
- init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
|
|
-
|
|
|
- /* These will be moved into the Uniform layer shortly... */
|
|
|
- switch (cmd) {
|
|
|
- case CDROMSETSPINDOWN: {
|
|
|
- char spindown;
|
|
|
-
|
|
|
- if (copy_from_user(&spindown, (void __user *) arg, sizeof(char)))
|
|
|
- return -EFAULT;
|
|
|
-
|
|
|
- if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
|
|
|
- return stat;
|
|
|
-
|
|
|
- buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
|
|
|
-
|
|
|
- return cdrom_mode_select(cdi, &cgc);
|
|
|
- }
|
|
|
-
|
|
|
- case CDROMGETSPINDOWN: {
|
|
|
- char spindown;
|
|
|
-
|
|
|
- if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
|
|
|
- return stat;
|
|
|
-
|
|
|
- spindown = buffer[11] & 0x0f;
|
|
|
-
|
|
|
- if (copy_to_user((void __user *) arg, &spindown, sizeof (char)))
|
|
|
- return -EFAULT;
|
|
|
-
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- default:
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
static
|
|
|
int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
|
|
|
unsigned int cmd, void *arg)
|
|
@@ -2852,12 +2806,11 @@ static struct cdrom_device_ops ide_cdrom_dops = {
|
|
|
.get_mcn = ide_cdrom_get_mcn,
|
|
|
.reset = ide_cdrom_reset,
|
|
|
.audio_ioctl = ide_cdrom_audio_ioctl,
|
|
|
- .dev_ioctl = ide_cdrom_dev_ioctl,
|
|
|
.capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
|
|
|
CDC_SELECT_SPEED | CDC_SELECT_DISC |
|
|
|
CDC_MULTI_SESSION | CDC_MCN |
|
|
|
CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
|
|
|
- CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
|
|
|
+ CDC_DRIVE_STATUS | CDC_CD_R |
|
|
|
CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
|
|
|
CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MRW |
|
|
|
CDC_MRW_W | CDC_RAM,
|
|
@@ -3367,6 +3320,45 @@ static int idecd_release(struct inode * inode, struct file * file)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
|
|
|
+{
|
|
|
+ struct packet_command cgc;
|
|
|
+ char buffer[16];
|
|
|
+ int stat;
|
|
|
+ char spindown;
|
|
|
+
|
|
|
+ if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
|
|
+
|
|
|
+ stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
|
|
|
+ if (stat)
|
|
|
+ return stat;
|
|
|
+
|
|
|
+ buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
|
|
|
+ return cdrom_mode_select(cdi, &cgc);
|
|
|
+}
|
|
|
+
|
|
|
+static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
|
|
|
+{
|
|
|
+ struct packet_command cgc;
|
|
|
+ char buffer[16];
|
|
|
+ int stat;
|
|
|
+ char spindown;
|
|
|
+
|
|
|
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
|
|
|
+
|
|
|
+ stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
|
|
|
+ if (stat)
|
|
|
+ return stat;
|
|
|
+
|
|
|
+ spindown = buffer[11] & 0x0f;
|
|
|
+ if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
|
|
|
+ return -EFAULT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int idecd_ioctl (struct inode *inode, struct file *file,
|
|
|
unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
@@ -3374,7 +3366,16 @@ static int idecd_ioctl (struct inode *inode, struct file *file,
|
|
|
struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
|
|
|
int err;
|
|
|
|
|
|
- err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
|
|
|
+ switch (cmd) {
|
|
|
+ case CDROMSETSPINDOWN:
|
|
|
+ return idecd_set_spindown(&info->devinfo, arg);
|
|
|
+ case CDROMGETSPINDOWN:
|
|
|
+ return idecd_get_spindown(&info->devinfo, arg);
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
|
|
|
if (err == -EINVAL)
|
|
|
err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
|
|
|
|