The patch titled
permit changing of DVD speed via ioctl() call
has been added to the -mm tree. Its filename is
permit-changing-of-dvd-speed-via-ioctl-call.patch
Patches currently in -mm which might be from [EMAIL PROTECTED] are
permit-changing-of-dvd-speed-via-ioctl-call.patch
From: cHitman <[EMAIL PROTECTED]>
This patch implements changing of DVD speed via ioctl() call, like
CDROM_SELECT_SPEED do. In CDROM_SELECT_SPEED its implementation isn't so
good (diffirent values of 1x in KB/s, troubles with return value of
cdrom_select_speed() and other). I defined CDROM_SELECT_DVDSPEED ioctl ()
call with value 0x5324. But some dvdroms (like Plexter) do not support
this feature.. :(
I've successfully tested this patch on:s
NEC ND-3500AG (fw 2.19)
BENQ DVD-ROM 16X 1650T (fw: A.DD)
HL-DT-ST DVD-RW GCA-4080N (fw: 0A31)
Signed-off-by: Ilja Samartsev <[EMAIL PROTECTED]>
Cc: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
Cc: Jens Axboe <[EMAIL PROTECTED]>
Cc: Alan Cox <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---
drivers/cdrom/cdrom.c | 5 +++
drivers/ide/ide-cd.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++-
include/linux/cdrom.h | 2 +
3 files changed, 79 insertions(+), 1 deletion(-)
diff -puN drivers/cdrom/cdrom.c~permit-changing-of-dvd-speed-via-ioctl-call
drivers/cdrom/cdrom.c
--- devel/drivers/cdrom/cdrom.c~permit-changing-of-dvd-speed-via-ioctl-call
2005-08-21 22:25:03.000000000 -0700
+++ devel-akpm/drivers/cdrom/cdrom.c 2005-08-21 22:25:03.000000000 -0700
@@ -2332,6 +2332,11 @@ int cdrom_ioctl(struct file * file, stru
return cdo->select_speed(cdi, arg);
}
+ case CDROM_SELECT_DVDSPEED: {
+ cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DVDSPEED\n");
+ return cdo->select_dvd_speed(cdi, arg);
+ }
+
case CDROM_SELECT_DISC: {
cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
if (!CDROM_CAN(CDC_SELECT_DISC))
diff -puN drivers/ide/ide-cd.c~permit-changing-of-dvd-speed-via-ioctl-call
drivers/ide/ide-cd.c
--- devel/drivers/ide/ide-cd.c~permit-changing-of-dvd-speed-via-ioctl-call
2005-08-21 22:25:03.000000000 -0700
+++ devel-akpm/drivers/ide/ide-cd.c 2005-08-21 22:25:03.000000000 -0700
@@ -2391,7 +2391,7 @@ static int cdrom_select_speed(ide_drive_
cdrom_prepare_request(drive, &req);
req.sense = sense;
- if (speed == 0)
+ if (speed <= 0)
speed = 0xffff; /* set to max */
else
speed *= 177; /* Nx to kbytes/s */
@@ -2413,6 +2413,63 @@ static int cdrom_select_speed(ide_drive_
return cdrom_queue_packet_command(drive, &req);
}
+static int cdrom_select_dvd_speed(ide_drive_t *drive, int speed,
+ struct request_sense *sense)
+{
+ struct request req;
+ struct request_sense cap_sense;
+ unsigned char pd[28];
+ unsigned long cap, spf;
+
+ if (!CDROM_CONFIG_FLAGS(drive)->dvd)
+ return -ENOSYS;
+
+ cdrom_prepare_request(drive, &req);
+
+ req.sense = sense;
+ req.data = pd;
+ req.data_len = sizeof(pd);
+
+ memset(pd, 0, sizeof(pd));
+
+ req.cmd[0] = GPCMD_SET_STREAMING;
+ req.cmd[10] = sizeof(pd); /* parameter list length */
+
+ if (speed <= 0) {
+ pd[0] = 4; /* restore drive defaults */
+ } else {
+
+ speed *= 1385; /* Nx to kbytes/s (FIXME: maybe not right
value) */
+
+ if (!cdrom_read_capacity(drive, &cap, &spf, &cap_sense) && cap)
{
+ /* good End LBA detected */
+ cap++;
+ pd[8] = (cap >> 24) & 0xff;
+ pd[9] = (cap >> 16) & 0xff;
+ pd[10] = (cap >> 8) & 0xff;
+ pd[11] = cap & 0xff;
+ } else {
+ /* no good End LBA detected, using max */
+ pd[8] = 0xff;
+ pd[9] = 0xff;
+ pd[10] = 0xff;
+ pd[11] = 0xff;
+ }
+
+ /* read and write size */
+ pd[12] = pd[20] = (speed >> 24) & 0xff;
+ pd[13] = pd[21] = (speed >> 16) & 0xff;
+ pd[14] = pd[22] = (speed >> 8) & 0xff;
+ pd[15] = pd[23] = speed & 0xff;
+
+ /* read and write time */
+ pd[18] = pd[26] = 1000 >> 8;
+ pd[19] = pd[27] = 1000 & 0xff;
+ }
+
+ return cdrom_queue_packet_command(drive, &req);
+}
+
static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
{
struct request_sense sense;
@@ -2715,6 +2772,19 @@ int ide_cdrom_select_speed (struct cdrom
return 0;
}
+static
+int ide_cdrom_select_dvd_speed (struct cdrom_device_info *cdi, int speed)
+{
+ ide_drive_t *drive = cdi->handle;
+ struct request_sense sense;
+ int stat;
+
+ if ((stat = cdrom_select_dvd_speed(drive, speed, &sense)) < 0)
+ return stat;
+
+ return 0;
+}
+
/*
* add logic to try GET_EVENT command first to check for media and tray
* status. this should be supported by newer cd-r/w and all DVD etc
@@ -2861,6 +2931,7 @@ static struct cdrom_device_ops ide_cdrom
.tray_move = ide_cdrom_tray_move,
.lock_door = ide_cdrom_lock_door,
.select_speed = ide_cdrom_select_speed,
+ .select_dvd_speed = ide_cdrom_select_dvd_speed,
.get_last_session = ide_cdrom_get_last_session,
.get_mcn = ide_cdrom_get_mcn,
.reset = ide_cdrom_reset,
diff -puN include/linux/cdrom.h~permit-changing-of-dvd-speed-via-ioctl-call
include/linux/cdrom.h
--- devel/include/linux/cdrom.h~permit-changing-of-dvd-speed-via-ioctl-call
2005-08-21 22:25:03.000000000 -0700
+++ devel-akpm/include/linux/cdrom.h 2005-08-21 22:25:03.000000000 -0700
@@ -120,6 +120,7 @@
#define CDROM_CLEAR_OPTIONS 0x5321 /* Clear behavior options */
#define CDROM_SELECT_SPEED 0x5322 /* Set the CD-ROM speed */
#define CDROM_SELECT_DISC 0x5323 /* Select disc (for juke-boxes) */
+#define CDROM_SELECT_DVDSPEED 0x5324 /* Set the DVD-ROM speed */
#define CDROM_MEDIA_CHANGED 0x5325 /* Check is media changed */
#define CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */
#define CDROM_DISC_STATUS 0x5327 /* Get disc type, etc. */
@@ -965,6 +966,7 @@ struct cdrom_device_ops {
int (*tray_move) (struct cdrom_device_info *, int);
int (*lock_door) (struct cdrom_device_info *, int);
int (*select_speed) (struct cdrom_device_info *, int);
+ int (*select_dvd_speed) (struct cdrom_device_info *, int);
int (*select_disc) (struct cdrom_device_info *, int);
int (*get_last_session) (struct cdrom_device_info *,
struct cdrom_multisession *);
_
-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html