patch-2.3.99-pre7 linux/drivers/ide/ide-cd.c
Next file: linux/drivers/ide/ide-cd.h
Previous file: linux/drivers/i2o/i2o_pci.c
Back to the patch index
Back to the overall index
- Lines: 111
- Date:
Wed May 10 17:33:57 2000
- Orig file:
v2.3.99-pre6/linux/drivers/ide/ide-cd.c
- Orig date:
Wed Apr 26 16:34:07 2000
diff -u --recursive --new-file v2.3.99-pre6/linux/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c
@@ -282,9 +282,12 @@
* - cdrom_read_capacity returns one frame too little.
* - Fix real capacity reporting.
*
+ * 4.58 May 1, 2000 - Clean up ACER50 stuff.
+ * - Fix small problem with ide_cdrom_capacity
+ *
*************************************************************************/
-#define IDECD_VERSION "4.57"
+#define IDECD_VERSION "4.58"
#include <linux/config.h>
#include <linux/module.h>
@@ -1521,7 +1524,7 @@
memset(&pc, 0, sizeof(pc));
pc.sense = sense;
pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
- pc.c[4] = (lockflag != 0);
+ pc.c[4] = lockflag ? 3 : 0;
stat = cdrom_queue_packet_command (drive, &pc);
}
@@ -1857,6 +1860,10 @@
pc.buffer = cgc->buffer;
pc.buflen = cgc->buflen;
cgc->stat = cdrom_queue_packet_command(drive, &pc);
+
+ /*
+ * FIXME: copy sense, don't just assign pointer!!
+ */
cgc->sense = pc.sense;
return cgc->stat;
@@ -2159,9 +2166,9 @@
{
struct cdrom_info *info = drive->driver_data;
struct cdrom_device_info *devinfo = &info->devinfo;
- int minor = (drive->select.b.unit)<<PARTN_BITS;
+ int minor = (drive->select.b.unit) << PARTN_BITS;
- devinfo->dev = MKDEV (HWIF(drive)->major, minor | CD_PART_MASK);
+ devinfo->dev = MKDEV (HWIF(drive)->major, minor);
devinfo->ops = &ide_cdrom_dops;
devinfo->mask = 0;
*(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed;
@@ -2195,22 +2202,23 @@
return register_cdrom(devinfo);
}
-/*
- * the buffer struct used by ide_cdrom_get_capabilities()
- */
-struct get_capabilities_buf {
- char pad[8];
- struct atapi_capabilities_page cap;
- char extra_cap[4];
-};
-
static
int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap)
{
struct cdrom_info *info = drive->driver_data;
struct cdrom_device_info *cdi = &info->devinfo;
struct cdrom_generic_command cgc;
- int stat, attempts = 3;
+ int stat, attempts = 3, size = sizeof(*cap);
+
+ /*
+ * ACER50 (and others?) require the full spec length mode sense
+ * page capabilities size, but older drives break.
+ */
+ if (drive->id) {
+ if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
+ !strcmp(drive->id->model, "WPI CDS-32X")))
+ size -= sizeof(cap->pad);
+ }
/* we have to cheat a little here. the packet will eventually
* be queued with ide_cdrom_packet(), which extracts the
@@ -2220,7 +2228,7 @@
*/
cdi->handle = (ide_drive_t *) drive;
cdi->ops = &ide_cdrom_dops;
- init_cdrom_command(&cgc, cap, sizeof(*cap), CGC_DATA_UNKNOWN);
+ init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
if (!stat)
@@ -2513,9 +2521,8 @@
static
int ide_cdrom_check_media_change (ide_drive_t *drive)
{
- return cdrom_fops.check_media_change
- (MKDEV (HWIF (drive)->major,
- (drive->select.b.unit)<<PARTN_BITS));
+ return cdrom_fops.check_media_change(MKDEV (HWIF (drive)->major,
+ (drive->select.b.unit) << PARTN_BITS));
}
static
@@ -2545,8 +2552,7 @@
{
unsigned capacity;
- capacity = cdrom_read_capacity(drive, &capacity, NULL);
- return capacity ? 0 : capacity * SECTORS_PER_FRAME;
+ return cdrom_read_capacity(drive, &capacity, NULL) ? 0 : capacity * SECTORS_PER_FRAME;
}
static
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)