--- /usr/src/linux-2.0.33-saveme/drivers/block/ide-cd.c	Mon Aug  4 20:45:55 1997
+++ /usr/src/linux/drivers/block/ide-cd.c	Sat Feb 28 21:03:49 1998
@@ -227,6 +227,7 @@
 #define MODE_SENSE_10           0x5a
 #define MODE_SELECT_10          0x55
 #define READ_CD                 0xbe
+#define SET_READWRITE_SPEED     0xbb
 
 #define LOAD_UNLOAD             0xa6
 
@@ -2044,6 +2045,28 @@
 	}
 }
 
+/* Hopefully your drive will honor the request, in kB/s.  Speed should
+   become set to the value asked or any slower rate.  My 12X noname
+   drive DF6910C(-D18)2 selects ~450kB/s for most values of speedreq
+   therefore I don't think it's good to map speed with nX multipliers. */
+static int
+cdrom_select_speed (ide_drive_t *drive, int speedreq,
+		    struct atapi_request_sense *reqbuf)
+{
+	struct packet_command pc;
+
+	memset (&pc, 0, sizeof (pc));
+	pc.sense_data = reqbuf;
+
+	if(speedreq==0) speedreq=0xffff;
+
+	pc.c[0] = SET_READWRITE_SPEED;
+	pc.c[2] = (speedreq&0xff00) >> 8;
+	pc.c[3] = (speedreq&0x00ff);
+
+	return cdrom_queue_packet_command (drive, &pc);
+}
+
 
 int ide_cdrom_ioctl (ide_drive_t *drive, struct inode *inode,
 		     struct file *file, unsigned int cmd, unsigned long arg)
@@ -2509,6 +2532,11 @@
 		/* And try to read the TOC information now. */
 		return cdrom_read_toc (drive, &my_reqbuf);
 	}
+
+	case CDROM_SELECT_SPEED: 
+		return cdrom_select_speed(drive, arg, NULL);
+
+	   
 
 #if 0 /* Doesn't work reliably yet. */
 	case CDROMRESET: {
