diff -c --recursive linux-2.6.4_packet/drivers/block/Kconfig linux-2.6.4_dvd-rw/drivers/block/Kconfig *** linux-2.6.4_packet/drivers/block/Kconfig Mon Mar 22 14:44:56 2004 --- linux-2.6.4_dvd-rw/drivers/block/Kconfig Mon Mar 22 15:03:56 2004 *************** *** 345,351 **** compliant ATAPI or SCSI drive, which is just about any newer CD writer. ! Currently only writing to CD-RW discs is possible. To compile this driver as a module, choose M here: the module will be called pktcdvd. --- 345,353 ---- compliant ATAPI or SCSI drive, which is just about any newer CD writer. ! Currently only writing to CD-RW, DVD-RW and DVD+RW discs is possible. ! ! DVD-RW disks must be in restricted overwrite mode. To compile this driver as a module, choose M here: the module will be called pktcdvd. diff -c --recursive linux-2.6.4_packet/drivers/block/pktcdvd.c linux-2.6.4_dvd-rw/drivers/block/pktcdvd.c *** linux-2.6.4_packet/drivers/block/pktcdvd.c Mon Mar 22 14:44:56 2004 --- linux-2.6.4_dvd-rw/drivers/block/pktcdvd.c Mon Mar 22 15:21:43 2004 *************** *** 1346,1351 **** --- 1346,1357 ---- char buffer[128]; int ret, size; + /* doesn't apply to DVD+RW (?) */ + if (pd->mmc3_profile == 0x1a) + return 0; + /* if (pd->mmc3_profile == 0x13) */ + /* return 0; */ + memset(buffer, 0, sizeof(buffer)); init_cdrom_command(&cgc, buffer, sizeof(*wp), CGC_DATA_READ); cgc.sense = &sense; *************** *** 1451,1456 **** --- 1457,1475 ---- */ static int pkt_good_disc(struct pktcdvd_device *pd, disc_information *di) { + switch (pd->mmc3_profile) { + case 0x0a: /* CD-RW */ + case 0xffff: /* MMC3 not supported ? */ + break; + case 0x1a: /* DVD+RW */ + return 0; + case 0x13: /* DVD-RW Experimental */ + return 0; + default: + printk("pktcdvd: Wrong disc profile (%x)\n", pd->mmc3_profile); + return 1; + } + /* * for disc type 0xff we should probably reserve a new track. * but i'm not sure, should we leave this to user apps? probably. *************** *** 1480,1489 **** --- 1499,1516 ---- static int pkt_probe_settings(struct pktcdvd_device *pd) { + struct cdrom_generic_command cgc; + unsigned char buf[12]; disc_information di; track_information ti; int ret, track; + init_cdrom_command(&cgc, buf, 8, CGC_DATA_READ); + cgc.cmd[0] = GPCMD_GET_CONFIGURATION; + cgc.cmd[8] = 8; + ret = pkt_generic_packet(pd, &cgc); + pd->mmc3_profile = ret ? 0xffff : buf[6] << 8 | buf[7]; + memset(&di, 0, sizeof(disc_information)); memset(&ti, 0, sizeof(track_information)); *************** *** 1818,1831 **** if ((ret = pkt_get_max_speed(pd, &write_speed))) write_speed = 16; ! if ((ret = pkt_media_speed(pd, &media_write_speed))) ! media_write_speed = 16; ! write_speed = min_t(unsigned, write_speed, media_write_speed); ! read_speed = (write_speed * 3) / 2; if ((ret = pkt_set_speed(pd, write_speed, read_speed))) { DPRINTK("pktcdvd: %s couldn't set write speed\n", pd->name); return -EIO; } DPRINTK("pktcdvd: speed (R/W) %u/%u\n", read_speed, write_speed); pd->write_speed = write_speed; --- 1845,1868 ---- if ((ret = pkt_get_max_speed(pd, &write_speed))) write_speed = 16; ! switch (pd->mmc3_profile) { ! case 0x13: /* DVD-RW Experimental */ ! case 0x1a: /* DVD+RW */ ! read_speed = write_speed; ! break; ! default: ! if ((ret = pkt_media_speed(pd, &media_write_speed))) ! media_write_speed = 16; ! write_speed = min_t(unsigned, write_speed, media_write_speed); ! read_speed = (write_speed * 3) / 2; ! break; ! } if ((ret = pkt_set_speed(pd, write_speed, read_speed))) { DPRINTK("pktcdvd: %s couldn't set write speed\n", pd->name); + /* return -EIO; + */ } DPRINTK("pktcdvd: speed (R/W) %u/%u\n", read_speed, write_speed); pd->write_speed = write_speed; diff -c --recursive linux-2.6.4_packet/drivers/scsi/sr_vendor.c linux-2.6.4_dvd-rw/drivers/scsi/sr_vendor.c *** linux-2.6.4_packet/drivers/scsi/sr_vendor.c Mon Mar 22 14:51:24 2004 --- linux-2.6.4_dvd-rw/drivers/scsi/sr_vendor.c Mon Mar 22 15:03:56 2004 *************** *** 117,122 **** --- 117,125 ---- cd->needs_sector_size = 0; } /* no break; */ + case 0x13: /* DVD-RW Restricted Overwrite */ + cd->device->writeable = 1; + break; default: cd->cdi.mask |= CDC_DVD_RAM; cd->device->writeable = 0; diff -c --recursive linux-2.6.4_packet/include/linux/pktcdvd.h linux-2.6.4_dvd-rw/include/linux/pktcdvd.h *** linux-2.6.4_packet/include/linux/pktcdvd.h Mon Mar 22 14:44:56 2004 --- linux-2.6.4_dvd-rw/include/linux/pktcdvd.h Mon Mar 22 15:03:56 2004 *************** *** 244,249 **** --- 244,250 ---- __u8 mode_offset; /* 0 / 8 */ __u8 type; unsigned long flags; + __u16 mmc3_profile; __u8 disc_status; __u8 track_status; /* last one */ __u32 nwa; /* next writable address */