* [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-02-12 19:00 John McKell
2004-02-13 16:07 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-02-12 19:00 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-scsi
Jens,
The patch submitted recently:
Subject:[PATCH]Allow random write for PDT 5 profile 2 Removable Disk
http://marc.theaimsgroup.com/?l=linux-scsi&m=107653753500466&w=2
was a composite patch. This corrects that (as well as a few other
small issues). Thanks for the help.
---John McKell
diff -Nurp linux-2.6.2-fix/include/linux/cdrom.h linux/include/linux/cdrom.h
--- linux-2.6.2-fix/include/linux/cdrom.h 2004-02-03 20:43:06.000000000 -0700
+++ linux/include/linux/cdrom.h 2004-02-12 09:18:19.000000000 -0700
@@ -721,7 +721,9 @@ struct request_sense {
/*
* feature profile
*/
-#define CDF_MRW 0x28
+#define CDF_RWRT 0x0020
+#define CDF_HWDM 0x0024
+#define CDF_MRW 0x0028
/*
* media status bits
@@ -770,6 +772,34 @@ struct mrw_feature_desc {
__u8 reserved5;
};
+/* cf. mmc4r02g.pdf 5.3.10 Random Writable Feature (0020h) pg 197 of 635 */
+struct rwrt_feature_desc {
+ __u16 feature_code;
+#if defined(__BIG_ENDIAN_BITFIELD)
+ __u8 reserved1 : 2;
+ __u8 feature_version : 4;
+ __u8 persistent : 1;
+ __u8 curr : 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+ __u8 curr : 1;
+ __u8 persistent : 1;
+ __u8 feature_version : 4;
+ __u8 reserved1 : 2;
+#endif
+ __u8 add_len;
+ __u32 last_lba;
+ __u32 block_size;
+ __u16 blocking;
+#if defined(__BIG_ENDIAN_BITFIELD)
+ __u8 reserved2 : 7;
+ __u8 page_present : 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+ __u8 page_present : 1;
+ __u8 reserved2 : 7;
+#endif
+ __u8 reserved3;
+};
+
typedef struct {
__u16 disc_information_length;
#if defined(__BIG_ENDIAN_BITFIELD)
@@ -1129,6 +1159,7 @@ struct media_event_desc {
extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
+extern int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write);
#endif /* End of kernel only stuff */
diff -Nurp linux-2.6.2-fix/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c
--- linux-2.6.2-fix/drivers/ide/ide-cd.c 2004-02-03 20:43:44.000000000 -0700
+++ linux/drivers/ide/ide-cd.c 2004-02-12 09:29:04.000000000 -0700
@@ -2911,6 +2911,8 @@ static int ide_cdrom_register (ide_drive
devinfo->mask |= CDC_MRW;
if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
devinfo->mask |= CDC_MRW_W;
+ if (!CDROM_CONFIG_FLAGS(drive)->ram)
+ devinfo->mask |= CDC_RAM;
return register_cdrom(devinfo);
}
@@ -2946,7 +2948,7 @@ int ide_cdrom_probe_capabilities (ide_dr
struct cdrom_info *info = drive->driver_data;
struct cdrom_device_info *cdi = &info->devinfo;
struct atapi_capabilities_page cap;
- int nslots = 1, mrw_write = 0;
+ int nslots = 1, mrw_write = 0, ram_write = 0;
if (drive->media == ide_optical) {
CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
@@ -2982,6 +2984,9 @@ int ide_cdrom_probe_capabilities (ide_dr
CDROM_CONFIG_FLAGS(drive)->ram = 1;
}
}
+ if (!cdrom_is_random_writable(cdi, &ram_write))
+ if (ram_write)
+ CDROM_CONFIG_FLAGS(drive)->ram = 1;
if (cap.lock == 0)
CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
diff -Nurp linux-2.6.2-fix/drivers/scsi/sr.c linux/drivers/scsi/sr.c
--- linux-2.6.2-fix/drivers/scsi/sr.c 2004-02-09 13:59:10.000000000 -0700
+++ linux/drivers/scsi/sr.c 2004-02-12 09:25:57.000000000 -0700
@@ -693,7 +693,7 @@ Enomem:
static void get_capabilities(struct scsi_cd *cd)
{
unsigned char *buffer;
- int rc, n, mrw_write = 0, mrw = 1;
+ int rc, n, mrw_write = 0, mrw = 1,ram_write=0;
struct scsi_mode_data data;
struct scsi_request *SRpnt;
unsigned char cmd[MAX_COMMAND_SIZE];
@@ -775,6 +775,11 @@ static void get_capabilities(struct scsi
if (!mrw_write)
cd->cdi.mask |= CDC_MRW_W;
+ if (cdrom_is_random_writable(&cd->cdi, &ram_write))
+ cd->cdi.mask |= CDC_RAM;
+ if (!ram_write)
+ cd->cdi.mask |= CDC_RAM;
+
n = data.header_length + data.block_descriptor_length;
cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
cd->readcd_known = 1;
@@ -824,7 +829,8 @@ static void get_capabilities(struct scsi
/*
* if DVD-RAM of MRW-W, we are randomly writeable
*/
- if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) != (CDC_DVD_RAM | CDC_MRW_W))
+ if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) !=
+ (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM))
cd->device->writeable = 1;
scsi_release_request(SRpnt);
diff -Nurp linux-2.6.2-fix/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
--- linux-2.6.2-fix/drivers/cdrom/cdrom.c 2004-02-09 13:58:21.000000000 -0700
+++ linux/drivers/cdrom/cdrom.c 2004-02-12 10:20:38.000000000 -0700
@@ -641,6 +641,80 @@ static int cdrom_mrw_set_lba_space(struc
return 0;
}
+int cdrom_get_random_writable(struct cdrom_device_info *cdi,
+ struct rwrt_feature_desc *rfd)
+{
+ struct cdrom_generic_command cgc;
+ char buffer[24];
+ struct feature_header *fh;
+ int ret;
+
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
+ cgc.cmd[3] = CDF_RWRT; /* often 0x0020 */
+ cgc.cmd[8] = sizeof(buffer); /* often 0x18 */
+ cgc.quiet = 1;
+
+ if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+ return ret;
+
+ fh = (struct feature_header *)&buffer[0];
+ if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+
+ sizeof(struct rwrt_feature_desc)))
+ memcpy(rfd, &buffer[sizeof(struct feature_header)],
+ sizeof (*rfd));
+ else
+ memset(rfd, 0, sizeof(*rfd));
+
+ return 0;
+}
+
+int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
+{
+ struct cdrom_generic_command cgc;
+ char buffer[16];
+ struct feature_header *fh;
+ __u16 *feature_code;
+ int ret;
+
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
+ cgc.cmd[3] = CDF_HWDM; /* often 0x0024 */
+ cgc.cmd[8] = sizeof(buffer); /* often 0x10 */
+ cgc.quiet = 1;
+
+ if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+ return ret;
+
+ fh = (struct feature_header *)&buffer[0];
+ ret = 1;
+ if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+8)) {
+ feature_code = (__u16 *)&buffer[sizeof(struct feature_header)];
+ if (CDF_HWDM == be16_to_cpu(*feature_code))
+ ret = 0;
+ }
+ return ret;
+}
+
+
+int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
+{
+ struct rwrt_feature_desc rfd;
+ int ret;
+
+ *write = 0;
+
+ if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+ return ret;
+
+ if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+ *write = 1;
+
+ return 0;
+}
+
static int cdrom_media_erasable(struct cdrom_device_info *cdi)
{
disc_information di;
@@ -695,6 +769,23 @@ static int cdrom_mrw_open_write(struct c
return ret;
}
+static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
+{
+ struct rwrt_feature_desc rfd;
+ int ret;
+
+ if ((ret = cdrom_has_defect_mgt(cdi)))
+ return ret;
+ else
+ if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+ return ret;
+ else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+ ret = !rfd.curr;
+
+ cdinfo(CD_OPEN, "can open for random write\n");
+ return ret;
+}
+
/*
* returns 0 for ok to open write, non-0 to disallow
*/
@@ -706,6 +797,9 @@ static int cdrom_open_write(struct cdrom
ret = cdrom_mrw_open_write(cdi);
else if (CDROM_CAN(CDC_DVD_RAM))
ret = cdrom_dvdram_open_write(cdi);
+ else if (CDROM_CAN(CDC_RAM) &&
+ !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW))
+ ret = cdrom_ram_open_write(cdi);
/*
* needs to really check whether media is writeable
*/
@@ -2644,6 +2738,7 @@ EXPORT_SYMBOL(cdrom_mode_sense);
EXPORT_SYMBOL(init_cdrom_command);
EXPORT_SYMBOL(cdrom_get_media_event);
EXPORT_SYMBOL(cdrom_is_mrw);
+EXPORT_SYMBOL(cdrom_is_random_writable);
#ifdef CONFIG_SYSCTL
@@ -2748,6 +2843,10 @@ int cdrom_sysctl_info(ctl_table *ctl, in
for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
+ pos += sprintf(info+pos, "\nCan write RAM:\t");
+ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+ pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
+
strcpy(info+pos,"\n\n");
return proc_dostring(ctl, write, filp, buffer, lenp);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
2004-02-12 19:00 John McKell
@ 2004-02-13 16:07 ` Jens Axboe
0 siblings, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2004-02-13 16:07 UTC (permalink / raw)
To: John McKell; +Cc: linux-scsi
On Thu, Feb 12 2004, John McKell wrote:
> Jens,
>
> The patch submitted recently:
> Subject:[PATCH]Allow random write for PDT 5 profile 2 Removable Disk
> http://marc.theaimsgroup.com/?l=linux-scsi&m=107653753500466&w=2
> was a composite patch. This corrects that (as well as a few other
> small issues). Thanks for the help.
Thanks, I've queued it for 2.6.4-pre.
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-06 17:16 Pat LaVarre
2004-03-07 11:45 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: Pat LaVarre @ 2004-03-06 17:16 UTC (permalink / raw)
To: mckellj; +Cc: linux-scsi
> queued it for 2.6.4-pre
Absent from 2.6.4-rc2, I think.
Perhaps if I knew what -pre meant that would be no surprise to me.
http://marc.theaimsgroup.com/?l=linux-scsi&s=random+write+pdt+5
does not yet enlighten me further, but I observe lk refusing to let Me
write:
$ uname -msrv
Linux 2.6.4-rc2 #1 SMP Sat Mar 6 09:58:43 MST 2004 i686
$
$ grep CDF_ include/linux/cdrom.h
#define CDF_MRW 0x28
$ grep -i HWDM include/linux/cdrom.h
$
$ sudo rrd scan
/dev/scd0 is Iomega RRD 06.3 rw
/dev/hdc is Iomega RRD 06.3 rw
$
$ sudo dd of=/dev/null if=/dev/scd0 bs=64K seek=0 skip=0 count=1
1+0 records in
1+0 records out
$ sudo dd of=/dev/null if=/dev/hdc bs=64K seek=0 skip=0 count=1
1+0 records in
1+0 records out
$
$ sudo dd of=/dev/scd0 if=/dev/zero bs=64K seek=0 skip=0 count=1
dd: opening `/dev/scd0': Read-only file system
$ sudo dd of=/dev/hdc if=/dev/zero bs=64K seek=0 skip=0 count=1
dd: opening `/dev/hdc': Read-only file system
$
Pat LaVarre
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
2004-03-06 17:16 Pat LaVarre
@ 2004-03-07 11:45 ` Jens Axboe
0 siblings, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2004-03-07 11:45 UTC (permalink / raw)
To: Pat LaVarre; +Cc: mckellj, linux-scsi
On Sat, Mar 06 2004, Pat LaVarre wrote:
> > queued it for 2.6.4-pre
>
> Absent from 2.6.4-rc2, I think.
Will most likely have to wait for 2.6.5-pre/rc
> Perhaps if I knew what -pre meant that would be no surprise to me.
I'm not sure how I can even express that any clearer...
> http://marc.theaimsgroup.com/?l=linux-scsi&s=random+write+pdt+5
> does not yet enlighten me further, but I observe lk refusing to let Me
> write:
>
> $ uname -msrv
> Linux 2.6.4-rc2 #1 SMP Sat Mar 6 09:58:43 MST 2004 i686
> $
> $ grep CDF_ include/linux/cdrom.h
> #define CDF_MRW 0x28
> $ grep -i HWDM include/linux/cdrom.h
> $
> $ sudo rrd scan
> /dev/scd0 is Iomega RRD 06.3 rw
> /dev/hdc is Iomega RRD 06.3 rw
> $
> $ sudo dd of=/dev/null if=/dev/scd0 bs=64K seek=0 skip=0 count=1
> 1+0 records in
> 1+0 records out
> $ sudo dd of=/dev/null if=/dev/hdc bs=64K seek=0 skip=0 count=1
> 1+0 records in
> 1+0 records out
> $
> $ sudo dd of=/dev/scd0 if=/dev/zero bs=64K seek=0 skip=0 count=1
> dd: opening `/dev/scd0': Read-only file system
> $ sudo dd of=/dev/hdc if=/dev/zero bs=64K seek=0 skip=0 count=1
> dd: opening `/dev/hdc': Read-only file system
> $
Is there some other point to the above than stating that the required
patch hasn't been merged? Feel free to resend.
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-08 18:07 John McKell
2004-03-08 19:20 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-03-08 18:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: Pat LaVarre, linux-scsi
Jens,
All of this discussion has left me a bit confused:
On Sunday, March 7, 2004, Jens Axboe wrote:
> On Sat, Mar 06 2004, Pat LaVarre wrote:
> > > queued it for 2.6.4-pre
> >
> > Absent from 2.6.4-rc2, I think.
>
> Will most likely have to wait for 2.6.5-pre/rc
What is the best indicator that I can use to monitor and know when a given
patch is to be inserted into the kernel? I monitor kernel.org at least
once a day, if not more, but I hope that there would be something a bit
more informative. If checking kernel.org frequently is the only way, then
I can deal with that.
---John
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
2004-03-08 18:07 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
@ 2004-03-08 19:20 ` Jens Axboe
2004-03-08 20:01 ` [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removabl e Disk Pat LaVarre
0 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2004-03-08 19:20 UTC (permalink / raw)
To: John McKell; +Cc: Pat LaVarre, linux-scsi
On Mon, Mar 08 2004, John McKell wrote:
> Jens,
>
> All of this discussion has left me a bit confused:
>
> On Sunday, March 7, 2004, Jens Axboe wrote:
> > On Sat, Mar 06 2004, Pat LaVarre wrote:
> > > > queued it for 2.6.4-pre
> > >
> > > Absent from 2.6.4-rc2, I think.
> >
> > Will most likely have to wait for 2.6.5-pre/rc
>
> What is the best indicator that I can use to monitor and know when a given
> patch is to be inserted into the kernel? I monitor kernel.org at least
> once a day, if not more, but I hope that there would be something a bit
> more informative. If checking kernel.org frequently is the only way, then
> I can deal with that.
You can check changes between last "released" (not 2.6.4, but also
2.6.4-pre2 for instance) kernel here:
http://www.kernel.org/pub/linux/kernel/v2.5/testing/cset/
that will show you what's queued for next sub-release.
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removabl e Disk
2004-03-08 19:20 ` Jens Axboe
@ 2004-03-08 20:01 ` Pat LaVarre
0 siblings, 0 replies; 9+ messages in thread
From: Pat LaVarre @ 2004-03-08 20:01 UTC (permalink / raw)
To: John McKell; +Cc: linux-scsi, Jens Axboe
// Jens A et al.:
Cogent, thank you, I now have new guesses of how I can help here.
// John M:
> > Feel free to resend.
If you choose to resend when kernel.org releases 2.6.4 ...
> +++ linux/include/linux/cdrom.h
> ...
> -#define CDF_MRW 0x28
> +#define CDF_RWRT 0x0020
> +#define CDF_HWDM 0x0024
> +#define CDF_MRW 0x0028
Then please consider linking this t10.org hex with the t10.org English:
-#define CDF_MRW 0x28
+#define CDF_RWRT 0x0020 /* "Random Writable" */
+#define CDF_HWDM 0x0024 /* "Hardware Defect Management" */
+#define CDF_MRW 0x0028
With those two comments added, I no longer trip at first glance over the
inscrutable RT of R W RT in the source (run time? real time? rather
'tochastic?) instead I see the R Wrt that I now imagine we intend.
Pat LaVarre
P.S. MRW I left unelaborated because MRW appears as "MRW" at t10.org
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
@ 2004-03-15 23:16 John McKell
2004-03-16 8:43 ` Jens Axboe
0 siblings, 1 reply; 9+ messages in thread
From: John McKell @ 2004-03-15 23:16 UTC (permalink / raw)
To: Jens Axboe; +Cc: Pat LaVarre, linux-scsi
On Sun, Mar 07 2004, Jens Axboe wrote:
> Will most likely have to wait for 2.6.5-pre/rc
...
> Feel free to resend.
Unfortunately, I can't quite decide if you are suggesting that the
question be rephrased, or that the patch be resent. Being so new to
kernel development, I am still unsure of all the steps that I must
follow. Am I to continue to provide patches for subsequent versions
of the linux kernel until it is accepted? I kind of doubt it, but
just in case, I am supplying a new version of this patch for lk 2.6.4.
I'd rather look foolish than uncooperative. This version does have the
comment changes that Pat L. requested.
diff -Nurp linux-2.6.4/include/linux/cdrom.h linux/include/linux/cdrom.h
-- linux-2.6.4/include/linux/cdrom.h 2004-03-15 11:50:41.000000000 -0700
+++ linux/include/linux/cdrom.h 2004-03-15 12:58:19.378649012 -0700
@@ -722,7 +722,9 @@ struct request_sense {
/*
* feature profile
*/
-#define CDF_MRW 0x28
+#define CDF_RWRT 0x0020 /* "Random Writable" */
+#define CDF_HWDM 0x0024 /* "Hardware Defect Management" */
+#define CDF_MRW 0x0028
/*
* media status bits
@@ -771,6 +773,34 @@ struct mrw_feature_desc {
__u8 reserved5;
};
+/* cf. mmc4r02g.pdf 5.3.10 Random Writable Feature (0020h) pg 197 of 635 */
+struct rwrt_feature_desc {
+ __u16 feature_code;
+#if defined(__BIG_ENDIAN_BITFIELD)
+ __u8 reserved1 : 2;
+ __u8 feature_version : 4;
+ __u8 persistent : 1;
+ __u8 curr : 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+ __u8 curr : 1;
+ __u8 persistent : 1;
+ __u8 feature_version : 4;
+ __u8 reserved1 : 2;
+#endif
+ __u8 add_len;
+ __u32 last_lba;
+ __u32 block_size;
+ __u16 blocking;
+#if defined(__BIG_ENDIAN_BITFIELD)
+ __u8 reserved2 : 7;
+ __u8 page_present : 1;
+#elif defined(__LITTLE_ENDIAN_BITFIELD)
+ __u8 page_present : 1;
+ __u8 reserved2 : 7;
+#endif
+ __u8 reserved3;
+};
+
typedef struct {
__u16 disc_information_length;
#if defined(__BIG_ENDIAN_BITFIELD)
@@ -1130,6 +1160,7 @@ struct media_event_desc {
extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
extern int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write);
+extern int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write);
#endif /* End of kernel only stuff */
diff -Nurp linux-2.6.4/drivers/ide/ide-cd.c linux/drivers/ide/ide-cd.c
-- linux-2.6.4/drivers/ide/ide-cd.c 2004-03-15 12:06:52.000000000 -0700
+++ linux/drivers/ide/ide-cd.c 2004-03-15 12:40:01.325968601 -0700
@@ -2930,6 +2930,8 @@ static int ide_cdrom_register (ide_drive
devinfo->mask |= CDC_MRW;
if (!CDROM_CONFIG_FLAGS(drive)->mrw_w)
devinfo->mask |= CDC_MRW_W;
+ if (!CDROM_CONFIG_FLAGS(drive)->ram)
+ devinfo->mask |= CDC_RAM;
return register_cdrom(devinfo);
}
@@ -2965,7 +2967,7 @@ int ide_cdrom_probe_capabilities (ide_dr
struct cdrom_info *info = drive->driver_data;
struct cdrom_device_info *cdi = &info->devinfo;
struct atapi_capabilities_page cap;
- int nslots = 1, mrw_write = 0;
+ int nslots = 1, mrw_write = 0, ram_write = 0;
if (drive->media == ide_optical) {
CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
@@ -3001,6 +3003,9 @@ int ide_cdrom_probe_capabilities (ide_dr
CDROM_CONFIG_FLAGS(drive)->ram = 1;
}
}
+ if (!cdrom_is_random_writable(cdi, &ram_write))
+ if (ram_write)
+ CDROM_CONFIG_FLAGS(drive)->ram = 1;
if (cap.lock == 0)
CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
diff -Nurp linux-2.6.4/drivers/scsi/sr.c linux/drivers/scsi/sr.c
-- linux-2.6.4/drivers/scsi/sr.c 2004-03-15 12:07:49.000000000 -0700
+++ linux/drivers/scsi/sr.c 2004-03-15 12:43:21.394889022 -0700
@@ -695,7 +695,7 @@ Enomem:
static void get_capabilities(struct scsi_cd *cd)
{
unsigned char *buffer;
- int rc, n, mrw_write = 0, mrw = 1;
+ int rc, n, mrw_write = 0, mrw = 1,ram_write=0;
struct scsi_mode_data data;
struct scsi_request *SRpnt;
unsigned char cmd[MAX_COMMAND_SIZE];
@@ -780,6 +780,11 @@ static void get_capabilities(struct scsi
if (!mrw_write)
cd->cdi.mask |= CDC_MRW_W;
+ if (cdrom_is_random_writable(&cd->cdi, &ram_write))
+ cd->cdi.mask |= CDC_RAM;
+ if (!ram_write)
+ cd->cdi.mask |= CDC_RAM;
+
n = data.header_length + data.block_descriptor_length;
cd->cdi.speed = ((buffer[n + 8] << 8) + buffer[n + 9]) / 176;
cd->readcd_known = 1;
@@ -829,8 +834,8 @@ static void get_capabilities(struct scsi
/*
* if DVD-RAM of MRW-W, we are randomly writeable
*/
- if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W)) !=
- (CDC_DVD_RAM | CDC_MRW_W)) {
+ if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) !=
+ (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM)) {
cd->device->writeable = 1;
set_disk_ro(cd->disk, 0);
}
diff -Nurp linux-2.6.4/drivers/cdrom/cdrom.c linux/drivers/cdrom/cdrom.c
-- linux-2.6.4/drivers/cdrom/cdrom.c 2004-03-15 11:50:36.000000000 -0700
+++ linux/drivers/cdrom/cdrom.c 2004-03-15 12:45:20.512684582 -0700
@@ -641,6 +641,80 @@ static int cdrom_mrw_set_lba_space(struc
return 0;
}
+int cdrom_get_random_writable(struct cdrom_device_info *cdi,
+ struct rwrt_feature_desc *rfd)
+{
+ struct cdrom_generic_command cgc;
+ char buffer[24];
+ struct feature_header *fh;
+ int ret;
+
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
+ cgc.cmd[3] = CDF_RWRT; /* often 0x0020 */
+ cgc.cmd[8] = sizeof(buffer); /* often 0x18 */
+ cgc.quiet = 1;
+
+ if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+ return ret;
+
+ fh = (struct feature_header *)&buffer[0];
+ if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+
+ sizeof(struct rwrt_feature_desc)))
+ memcpy(rfd, &buffer[sizeof(struct feature_header)],
+ sizeof (*rfd));
+ else
+ memset(rfd, 0, sizeof(*rfd));
+
+ return 0;
+}
+
+int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
+{
+ struct cdrom_generic_command cgc;
+ char buffer[16];
+ struct feature_header *fh;
+ __u16 *feature_code;
+ int ret;
+
+ init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
+
+ cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
+ cgc.cmd[3] = CDF_HWDM; /* often 0x0024 */
+ cgc.cmd[8] = sizeof(buffer); /* often 0x10 */
+ cgc.quiet = 1;
+
+ if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
+ return ret;
+
+ fh = (struct feature_header *)&buffer[0];
+ ret = 1;
+ if (be32_to_cpu(fh->data_len) >= (sizeof(struct feature_header)+8)) {
+ feature_code = (__u16 *)&buffer[sizeof(struct feature_header)];
+ if (CDF_HWDM == be16_to_cpu(*feature_code))
+ ret = 0;
+ }
+ return ret;
+}
+
+
+int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
+{
+ struct rwrt_feature_desc rfd;
+ int ret;
+
+ *write = 0;
+
+ if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+ return ret;
+
+ if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+ *write = 1;
+
+ return 0;
+}
+
static int cdrom_media_erasable(struct cdrom_device_info *cdi)
{
disc_information di;
@@ -724,6 +798,23 @@ static int mo_open_write(struct cdrom_de
return buffer[3] & 0x80;
}
+static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
+{
+ struct rwrt_feature_desc rfd;
+ int ret;
+
+ if ((ret = cdrom_has_defect_mgt(cdi)))
+ return ret;
+ else
+ if ((ret = cdrom_get_random_writable(cdi, &rfd)))
+ return ret;
+ else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
+ ret = !rfd.curr;
+
+ cdinfo(CD_OPEN, "can open for random write\n");
+ return ret;
+}
+
/*
* returns 0 for ok to open write, non-0 to disallow
*/
@@ -735,6 +826,9 @@ static int cdrom_open_write(struct cdrom
ret = cdrom_mrw_open_write(cdi);
else if (CDROM_CAN(CDC_DVD_RAM))
ret = cdrom_dvdram_open_write(cdi);
+ else if (CDROM_CAN(CDC_RAM) &&
+ !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW))
+ ret = cdrom_ram_open_write(cdi);
else if (CDROM_CAN(CDC_MO_DRIVE))
ret = mo_open_write(cdi);
@@ -2670,6 +2764,7 @@ EXPORT_SYMBOL(cdrom_mode_sense);
EXPORT_SYMBOL(init_cdrom_command);
EXPORT_SYMBOL(cdrom_get_media_event);
EXPORT_SYMBOL(cdrom_is_mrw);
+EXPORT_SYMBOL(cdrom_is_random_writable);
#ifdef CONFIG_SYSCTL
@@ -2774,6 +2869,10 @@ int cdrom_sysctl_info(ctl_table *ctl, in
for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
+ pos += sprintf(info+pos, "\nCan write RAM:\t");
+ for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
+ pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
+
strcpy(info+pos,"\n\n");
return proc_dostring(ctl, write, filp, buffer, lenp);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk
2004-03-15 23:16 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
@ 2004-03-16 8:43 ` Jens Axboe
0 siblings, 0 replies; 9+ messages in thread
From: Jens Axboe @ 2004-03-16 8:43 UTC (permalink / raw)
To: John McKell; +Cc: Pat LaVarre, linux-scsi
On Mon, Mar 15 2004, John McKell wrote:
> On Sun, Mar 07 2004, Jens Axboe wrote:
> > Will most likely have to wait for 2.6.5-pre/rc
> ...
> > Feel free to resend.
> Unfortunately, I can't quite decide if you are suggesting that the
> question be rephrased, or that the patch be resent. Being so new to
> kernel development, I am still unsure of all the steps that I must
> follow. Am I to continue to provide patches for subsequent versions
> of the linux kernel until it is accepted? I kind of doubt it, but
> just in case, I am supplying a new version of this patch for lk 2.6.4.
> I'd rather look foolish than uncooperative. This version does have the
> comment changes that Pat L. requested.
Thanks, I've forwarded the patch for inclusion.
--
Jens Axboe
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-03-16 9:35 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-08 18:07 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
2004-03-08 19:20 ` Jens Axboe
2004-03-08 20:01 ` [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removabl e Disk Pat LaVarre
-- strict thread matches above, loose matches on Subject: below --
2004-03-15 23:16 [PATCH]:Amended:Allow random write for PDT 5 profile 2 Removable Disk John McKell
2004-03-16 8:43 ` Jens Axboe
2004-03-06 17:16 Pat LaVarre
2004-03-07 11:45 ` Jens Axboe
2004-02-12 19:00 John McKell
2004-02-13 16:07 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox