From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pat LaVarre Subject: Re: [PATCH 2.4] rewritable USB DVD-RAM vs. mode sense op choice Date: 23 Aug 2004 16:45:03 -0600 Sender: linux-scsi-owner@vger.kernel.org Message-ID: <1093301103.3626.5.camel@patlinux.iomegacorp.com> References: <1092673789.4297.7.camel@patlinux.iomegacorp.com><2004082315485 0.GC2301@suse.de><2004082317 1253.GD24089@suse.de> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Return-path: Received: from email-out2.iomega.com ([147.178.1.83]:65219 "EHLO email.iomega.com") by vger.kernel.org with ESMTP id S267989AbUHWWqd (ORCPT ); Mon, 23 Aug 2004 18:46:33 -0400 In-Reply-To: <20040823171253.GD24089@suse.de> List-Id: linux-scsi@vger.kernel.org To: Jens Axboe Cc: linux-scsi@vger.kernel.org, Paul Smith > add a fallback to issue MODE_SENSE_10 when _6 fails, ... > should be golden. Jens A: This 2.4 patch, as you suggested, makes sr_mod try op x5A MODE_SENSE_10 if op x1A MODE_SENSE fails in any way. As you know, the 2.4.27 sr_mod without this patch complains "scsi-1 drive", rather than discovering "scsi3-mmc drive: ... dvd-ram ...", if plugged into a USB DVD-RAM drive that implements only SFF/ MMC x5A and not SPC x1A. Do you like this patch? Want people to run any tests in particular? Already, with rewritable DVD-RAM discs, in dd of= rewritability and USB CDB traces, I see this makes the USB DVD-RAM "HL-DT-ST" "DVDRAM" "A100" rewritable and has no effect on the USB DVD-RAM "MATSHITA" "DVD-RAM" "A111". Pat LaVarre --- linux-2.4.27/drivers/scsi/sr.c 2003-06-13 08:51:36.000000000 -0600 +++ linux-2.4.27-pel/drivers/scsi/sr.c 2004-08-23 14:07:49.000000000 -0600 @@ -689,9 +689,42 @@ void get_sectorsize(int i) scsi_free(buffer, 512); } -void get_capabilities(int i) +static int sr_mode_sense_10(int * n, + int i, unsigned char * buffer, unsigned buflength, + int quiet, int readwrite, struct request_sense * sense) +{ + unsigned char cmd[16]; + int rc; + memset(cmd, '\0', sizeof cmd); + cmd[0] = MODE_SENSE_10; + cmd[1] = (scsi_CDs[i].device->scsi_level <= SCSI_2) ? + ((scsi_CDs[i].device->lun << 5) & 0xe0) : 0; + cmd[2] = 0x2a; + cmd[8] = 128; + rc = sr_do_ioctl(i, cmd, buffer, buflength, quiet, readwrite, sense); + *n = 8 + ((buffer[6] << 8) | buffer[7]); + return rc; +} + +static int sr_mode_sense_6(int * n, + int i, unsigned char * buffer, unsigned buflength, + int quiet, int readwrite, struct request_sense * sense) { unsigned char cmd[6]; + int rc; + cmd[0] = MODE_SENSE; + cmd[1] = (scsi_CDs[i].device->scsi_level <= SCSI_2) ? + ((scsi_CDs[i].device->lun << 5) & 0xe0) : 0; + cmd[2] = 0x2a; + cmd[4] = 128; + cmd[3] = cmd[5] = 0; + rc = sr_do_ioctl(i, cmd, buffer, buflength, quiet, readwrite, sense); + *n = buffer[3] + 4; + return rc; +} + +void get_capabilities(int i) +{ unsigned char *buffer; int rc, n; @@ -713,13 +746,18 @@ void get_capabilities(int i) printk(KERN_ERR "sr: out of memory.\n"); return; } - cmd[0] = MODE_SENSE; - cmd[1] = (scsi_CDs[i].device->scsi_level <= SCSI_2) ? - ((scsi_CDs[i].device->lun << 5) & 0xe0) : 0; - cmd[2] = 0x2a; - cmd[4] = 128; - cmd[3] = cmd[5] = 0; - rc = sr_do_ioctl(i, cmd, buffer, 128, 1, SCSI_DATA_READ, NULL); + + /* SFF/ MMC op x5A MODE_SENSE_10 should work, + * and SPC op x1A MODE_SENSE might work, + * so we try both except we try x1A first to match Linux 2.4.27. + */ + + rc = sr_mode_sense_6(&n, + i, buffer, 128, 1, SCSI_DATA_READ, NULL); + if (rc) { + rc = sr_mode_sense_10(&n, + i, buffer, 128, 1, SCSI_DATA_READ, NULL); + } if (rc) { /* failed, drive doesn't have capabilities mode page */ @@ -731,7 +769,6 @@ void get_capabilities(int i) printk("sr%i: scsi-1 drive\n", i); return; } - n = buffer[3] + 4; scsi_CDs[i].cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176; scsi_CDs[i].readcd_known = 1; scsi_CDs[i].readcd_cdda = buffer[n + 5] & 0x01;