Re: Incorrect data returned from dvd drive (firmware bug?)
Re: Incorrect data returned from dvd drive (firmware bug?)
- Subject: Re: Incorrect data returned from dvd drive (firmware bug?)
- From: Antoine Missout <email@hidden>
- Date: Fri, 5 Nov 2010 16:26:45 -0400
My mistake, please ignore this question and this whole thread.
The issue is irrelevant in normal usage (normal/data dvd-rom, dvd-video without arccos, and for those with, these sectors do not seem to be actually used).
I thought it was some sort of hardware bug. Turns out it's a normal bug.
- Antoine
On 2010-11-05, at 14:57, Antoine Missout wrote:
> I was able to trigger this error with the other drive as well, it just happens less often.
>
> So I'm not sure where the error lies, and what is the actual correct data since both drive are inconsistent.
>
> - Antoine
>
>
> On 2010-11-05, at 12:09, Antoine Missout wrote:
>
>> Hi,
>>
>> I've been working on a module to send scsi read commands directly to the dvd drive.
>> This has the advantage of being able to specify a shorter timeout than the default of 30 seconds.
>>
>> While debugging to make sure my output was identical to reading the drive using normal APIs (open/read),
>> I found out that the internal drive shipped by Apple returns incorrect data in an inconsistent manner.
>>
>> On another drive, the data returned is consistent. See the code for details.
>>
>> I've tried sending kSCSICmd_SYNCHRONIZE_CACHE prior to any read, but that doesn't change anything (I guess it doesn't flush the cache as I would expect).
>> Is there any workaround I could do to have consistent data on this drive (any scsi command I could send) ?
>>
>> This should be fairly easy to reproduce with any arccos protected dvd, but I could ship the one I have if needed.
>>
>> Regards,
>> Antoine Missout
>>
>>
>>
>> /*
>> // DVD used is THE_KARATE_KID, 8,539,996,160 bytes
>> // it has a bad sector at sector 203824 (among other places)
>> // this bad sector is not due to a scratch
>> // and has been engineered (arccos)
>>
>> // USING MATSHITA DVD-R UJ-868 Firmware Revision KB19
>>
>> 11:25:12:~/temp $ ./read_error
>> expected: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> first read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x66, 0x35
>> read error as expected
>> error read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> second read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>>
>> 11:25:16:~/temp $ ./read_error
>> expected: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> first read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> read error as expected
>> error read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x66, 0x35
>> second read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x66, 0x35
>>
>> // USING HL-DT-ST BDDVDRW CH08LS10 Firmware Revision 1.00
>>
>> 11:54:28:~/temp $ ./read_error
>> expected: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> first read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> read error as expected
>> error read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> second read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>>
>> 11:56:56:~/temp $ ./read_error
>> expected: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> first read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> read error as expected
>> error read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> second read: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d
>> */
>>
>> #include <fcntl.h>
>> #include <unistd.h>
>> #include <stdio.h>
>> #include <sys/errno.h>
>> #include <strings.h>
>>
>> unsigned char sector[2048 * 256];
>>
>> int error(const char *e)
>> {
>> printf("failed: %s\n", e);
>> return 2;
>> }
>>
>> void dump(const char *m)
>> {
>> printf("%s: 0xx", m, sector[0]);
>> int i; for (i = 1; i < 8; i++) printf(", 0xx", sector[i]);
>> printf("\n");
>> }
>>
>> int main(int argc, const char *argv[])
>> {
>> int fd = open("/dev/rdisk1", 0); // put proper rdisk here
>> if (!fd) return error("cannot open");
>>
>> off_t target = 203803 * 2048;
>>
>> printf("expected: 0x00, 0x00, 0x01, 0xba, 0x44, 0x03, 0x5f, 0x7d\n");
>>
>> {
>> off_t r = lseek(fd, target, SEEK_SET);
>> if (r != target) return error("cannot seek");
>>
>> memset(sector, 0, 2048 * 256);
>> r = read(fd, §or, 2048);
>> if (r != 2048) return error("cannot read");
>>
>> dump("first read");
>> }
>>
>> {
>> off_t r = lseek(fd, target, SEEK_SET);
>> if (r != target) return error("cannot seek");
>>
>> memset(sector, 0, 2048 * 256);
>> r = read(fd, §or, 2048 * 256);
>> if (r == -1 && errno == EIO)
>> printf("read error as expected\n");
>> else
>> printf("unexpected read: %d %d\n", (int)r, errno);
>>
>> dump("error read");
>> }
>>
>> {
>> off_t r = lseek(fd, target, SEEK_SET);
>> if (r != target) return error("cannot seek");
>>
>> memset(sector, 0, 2048 * 256);
>> r = read(fd, §or, 2048);
>> if (r != 2048) return error("cannot read");
>>
>> dump("second read");
>> }
>>
>> close(fd);
>> return 0;
>> }
>>
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Darwin-kernel mailing list (email@hidden)
>> Help/Unsubscribe/Update your Subscription:
>>
>> This email sent to email@hidden
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Darwin-kernel mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-kernel mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden