public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Osterlund <petero2@telia.com>
To: linuxer@ever.mine.nu
Cc: linux-kernel@vger.kernel.org
Subject: Re: pktcdvd DVD+RW always writes at max drive speed (not media speed)
Date: 22 Feb 2006 23:28:21 +0100	[thread overview]
Message-ID: <m3ek1v58qi.fsf@telia.com> (raw)
In-Reply-To: <200602182335.k1INZFoi012487@rhodes.mine.nu>

linuxer@ever.mine.nu writes:

> Peter Osterlund <petero2@telia.com> writes:
>   > 
>   > linuxer@ever.mine.nu writes:
>   > 
>   > > In drivers/block/pktcdvd.c it appears that in the case of DVD
>   > > rewriting, pkt_open_write always sets the write speed to pkt_get_max_speed
>   > > (the maximum writing speed reported by the drive). 
>   > > 
>   > > In my case, I have a new drive capable of 8x re-writing. However, all of
>   > > my existing media is rated for only 4x rewrite speed. 
>   > > 
>   > > When attempting to rw mount these disks, pktcdvd reports:
>   > > 
>   > > Feb 18 00:09:52 ever kernel: pktcdvd: write speed 11080kB/s
>   > > Feb 18 00:09:54 ever kernel: pktcdvd: 54 01 00 00 00 00 00 00 00 00 00 00 -
>   > > sense 00.54.9c (No sense)
>   > > Feb 18 00:09:54 ever kernel: pktcdvd: pktcdvd0 Optimum Power Calibration failed
>   > > 
>   > > And then of course a huge heap of I/O errors on the disk. 
>   > 
>   > Have you verified that this is caused by the speed setting, ie does it
>   > work correctly if you hack the driver to write at 4x speed?
> 
> Correct. Adding a hard-coded manual setting of write_speed = 5540 to
> pkt_open_write results in functional operation (at least with 4x rated
> DVD+RW media).

Does this patch work for you?


pktcdvd: Don't try to write faster than the DVD media speed allows.

In theory the drive firmware should limit the speed to the fastest
allowed by the currently loaded media, but it doesn't always work in
practice.

Signed-off-by: Peter Osterlund <petero2@telia.com>
---

 drivers/block/pktcdvd.c |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index c1b8eae..94ff3ac 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -1780,7 +1780,7 @@ static char us_clv_to_speed[16] = {
 /*
  * reads the maximum media speed from ATIP
  */
-static int pkt_media_speed(struct pktcdvd_device *pd, unsigned *speed)
+static int pkt_cd_media_speed(struct pktcdvd_device *pd, unsigned *speed)
 {
 	struct packet_command cgc;
 	struct request_sense sense;
@@ -1852,6 +1852,33 @@ static int pkt_media_speed(struct pktcdv
 	}
 }
 
+static int pkt_dvd_media_speed(struct pktcdvd_device *pd, unsigned int *speed)
+{
+	struct packet_command cgc;
+	struct request_sense sense;
+	unsigned char buf[64];
+	int size, ret;
+
+	init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
+	cgc.sense = &sense;
+	cgc.cmd[0] = GPCMD_GET_PERFORMANCE;
+	cgc.cmd[8] = 0;
+	cgc.cmd[9] = 1;			    /* Number of descriptors */
+	cgc.cmd[10] = 0x03;		    /* Write speed */
+	ret = pkt_generic_packet(pd, &cgc);
+	if (ret) {
+		pkt_dump_sense(&cgc);
+		return ret;
+	}
+	size = be32_to_cpu(*(int*)&buf[0]) + 4;
+	if (size < 8 + 16)
+		return -1;
+
+	*speed = be32_to_cpu(*(int*)&buf[8 + 12]);
+	DPRINTK("pktcdvd: Max. media speed: %dkB/s\n",*speed);
+	return 0;
+}
+
 static int pkt_perform_opc(struct pktcdvd_device *pd)
 {
 	struct packet_command cgc;
@@ -1889,14 +1916,17 @@ static int pkt_open_write(struct pktcdvd
 
 	if ((ret = pkt_get_max_speed(pd, &write_speed)))
 		write_speed = 16 * 177;
+	DPRINTK("pktcdvd: Max drive write speed %ukB/s\n", write_speed);
 	switch (pd->mmc3_profile) {
 		case 0x13: /* DVD-RW */
 		case 0x1a: /* DVD+RW */
 		case 0x12: /* DVD-RAM */
+			if (pkt_dvd_media_speed(pd, &media_write_speed) == 0)
+				write_speed = min(write_speed, media_write_speed);
 			DPRINTK("pktcdvd: write speed %ukB/s\n", write_speed);
 			break;
 		default:
-			if ((ret = pkt_media_speed(pd, &media_write_speed)))
+			if ((ret = pkt_cd_media_speed(pd, &media_write_speed)))
 				media_write_speed = 16;
 			write_speed = min(write_speed, media_write_speed * 177);
 			DPRINTK("pktcdvd: write speed %ux\n", write_speed / 176);

-- 
Peter Osterlund - petero2@telia.com
http://web.telia.com/~u89404340

  parent reply	other threads:[~2006-02-22 22:28 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-02-18 20:23 pktcdvd DVD+RW always writes at max drive speed (not media speed) linuxer
2006-02-18 22:19 ` Peter Osterlund
2006-02-18 23:35   ` linuxer
2006-02-19 10:09     ` Peter Osterlund
2006-02-22 22:28     ` Peter Osterlund [this message]
2006-02-25  1:12       ` linuxer
2006-02-25 22:43         ` Peter Osterlund
2006-02-19  6:11 ` Phillip Susi
2006-02-19  6:46   ` linuxer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3ek1v58qi.fsf@telia.com \
    --to=petero2@telia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxer@ever.mine.nu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox