From: Peter Osterlund That shouldn't cause any real problems, but since it's quite confusing, here is a patch to fix it. With this change, both DVD+RW and DVD-RW media is correctly identified in the kernel log, and DVD speeds are printed in kB/s. Signed-off-by: Peter Osterlund Signed-off-by: Andrew Morton --- 25-akpm/drivers/block/pktcdvd.c | 34 ++++++++++++++++++++-------------- 25-akpm/include/linux/pktcdvd.h | 4 ++-- 2 files changed, 22 insertions(+), 16 deletions(-) diff -puN drivers/block/pktcdvd.c~packet-writing-reporting-fix drivers/block/pktcdvd.c --- 25/drivers/block/pktcdvd.c~packet-writing-reporting-fix Tue Aug 17 16:01:35 2004 +++ 25-akpm/drivers/block/pktcdvd.c Tue Aug 17 16:02:38 2004 @@ -400,11 +400,6 @@ static int pkt_set_speed(struct pktcdvd_ struct request_sense sense; int ret; - write_speed = write_speed * 177; /* should be 176.4, but CD-RWs rounds down */ - write_speed = min_t(unsigned, write_speed, MAX_SPEED); - read_speed = read_speed * 177; - read_speed = min_t(unsigned, read_speed, MAX_SPEED); - init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); cgc.sense = &sense; cgc.cmd[0] = GPCMD_SET_SPEED; @@ -519,8 +514,8 @@ static void pkt_iosched_process_queue(st pd->iosched.successive_reads = 0; if (pd->iosched.successive_reads >= HI_SPEED_SWITCH) { if (pd->read_speed == pd->write_speed) { - pd->read_speed = 0xff; - pkt_set_speed(pd, pd->write_speed, MAX_SPEED); + pd->read_speed = MAX_SPEED; + pkt_set_speed(pd, pd->write_speed, pd->read_speed); } } else { if (pd->read_speed != pd->write_speed) { @@ -1547,7 +1542,17 @@ static int pkt_probe_settings(struct pkt if (pkt_good_disc(pd, &di)) return -ENXIO; - printk("pktcdvd: inserted media is CD-R%s\n", di.erasable ? "W" : ""); + switch (pd->mmc3_profile) { + case 0x1a: /* DVD+RW */ + printk("pktcdvd: inserted media is DVD+RW\n"); + break; + case 0x13: /* DVD-RW */ + printk("pktcdvd: inserted media is DVD-RW\n"); + break; + default: + printk("pktcdvd: inserted media is CD-R%s\n", di.erasable ? "W" : ""); + break; + } pd->type = di.erasable ? PACKET_CDRW : PACKET_CDR; track = 1; /* (di.last_track_msb << 8) | di.last_track_lsb; */ @@ -1700,7 +1705,7 @@ static int pkt_get_max_speed(struct pktc offset = 34; } - *write_speed = ((cap_buf[offset] << 8) | cap_buf[offset + 1]) / 0xb0; + *write_speed = (cap_buf[offset] << 8) | cap_buf[offset + 1]; return 0; } @@ -1832,15 +1837,17 @@ static int pkt_open_write(struct pktcdvd pkt_write_caching(pd, USE_WCACHING); if ((ret = pkt_get_max_speed(pd, &write_speed))) - write_speed = 16; + write_speed = 16 * 177; switch (pd->mmc3_profile) { case 0x13: /* DVD-RW */ case 0x1a: /* DVD+RW */ + DPRINTK("pktcdvd: write speed %ukB/s\n", write_speed); break; default: if ((ret = pkt_media_speed(pd, &media_write_speed))) media_write_speed = 16; - write_speed = min(write_speed, media_write_speed); + write_speed = min(write_speed, media_write_speed * 177); + DPRINTK("pktcdvd: write speed %ux\n", write_speed / 176); break; } read_speed = write_speed; @@ -1849,7 +1856,6 @@ static int pkt_open_write(struct pktcdvd DPRINTK("pktcdvd: %s couldn't set write speed\n", pd->name); return -EIO; } - DPRINTK("pktcdvd: write speed %u\n", write_speed); pd->write_speed = write_speed; pd->read_speed = read_speed; @@ -2250,8 +2256,8 @@ static int pkt_seq_show(struct seq_file seq_printf(m, "\nMisc:\n"); seq_printf(m, "\treference count:\t%d\n", pd->refcnt); seq_printf(m, "\tflags:\t\t\t0x%lx\n", pd->flags); - seq_printf(m, "\tread speed:\t\t%ukB/s\n", pd->read_speed * 150); - seq_printf(m, "\twrite speed:\t\t%ukB/s\n", pd->write_speed * 150); + seq_printf(m, "\tread speed:\t\t%ukB/s\n", pd->read_speed); + seq_printf(m, "\twrite speed:\t\t%ukB/s\n", pd->write_speed); seq_printf(m, "\tstart offset:\t\t%lu\n", pd->offset); seq_printf(m, "\tmode page offset:\t%u\n", pd->mode_offset); diff -puN include/linux/pktcdvd.h~packet-writing-reporting-fix include/linux/pktcdvd.h --- 25/include/linux/pktcdvd.h~packet-writing-reporting-fix Tue Aug 17 16:01:35 2004 +++ 25-akpm/include/linux/pktcdvd.h Tue Aug 17 16:02:38 2004 @@ -232,8 +232,8 @@ struct pktcdvd_device struct packet_settings settings; struct packet_stats stats; int refcnt; /* Open count */ - __u8 write_speed; /* current write speed */ - __u8 read_speed; /* current read speed */ + int write_speed; /* current write speed, kB/s */ + int read_speed; /* current read speed, kB/s */ unsigned long offset; /* start offset */ __u8 mode_offset; /* 0 / 8 */ __u8 type; _