Date: Mon, 28 May 2001 09:53:50 +0200 (CEST) From: Søren Schmidt <sos@freebsd.dk> To: bpk@Hungry.COM Cc: freebsd-hackers@freebsd.org Subject: Re: Fix for ATAPI CDRW problem: MODE_SELECT_BIG - ILLEGAL REQUEST asc=1a Message-ID: <200105280755.f4S7tBW94826@freebsd.dk> In-Reply-To: <200105242223.f4OMNSm16593@starvation.hungry.com> "from bpk@Hungry.COM at May 24, 2001 03:23:28 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
It seems bpk@Hungry.COM wrote: Thanks for hunting this down! I have a semilar but differently implemented change for another problematic drive that I'll commit soon, I think that will help this too now that we know whats wrong... > > I recently acquired a new Yamaha 2100E ATAPI CDRW drive, and encountered > this error during the fixation stage with burncd on a FreeBSD 4.3 release > system: > > burncd: ioctl(CDRIOCCLOSEDISK): Input/output error > > and the kernel complains: > > acd0: MODE_SELECT_BIG - ILLEGAL REQUEST asc=1a ascq=00 error=00 > > After perusing the ATA/ATAPI-5 and MMC-3 specifications I realized that the > asc=1a error (PARAMETER LENGTH LIST ERROR) was telling me that the CDRW > drive wasn't happy with the length of the CLOSE DISK mode page that was > being sent to it. > > In atapi-cd.c the acd_close_disk() function is sending the write_param > mode page structure in the CLOSE DISK command to the drive. > > Upon examination of struct write_param in atapi-cd.h I noticed sure enough > the last four bytes of the page were commented out: > /* > u_int8_t vendor_specific_byte0; > u_int8_t vendor_specific_byte1; > u_int8_t vendor_specific_byte2; > u_int8_t vendor_specific_byte3; > */ > > I uncommented these lines, recompiled/rebooted, and tried burncd again. > This time it failed right away on the CDRIOCOPENDISK ioctl, with the kernel > error being something about an invalid parameter. > > So I reverted struct write_param back to the original commented version. > But I copied write_param to a new struct called full_write_param and > uncommented the last 4 bytes. I then changed acd_close_disk() to use the > full_write_param struct rather than the original write_param struct. > > Recompiled/rebooted. > > The result: success! > > The Yamaha 2100E doesn't want the last 4 bytes in the mode page for OPEN > DISK but does for CLOSE DISK. > > Here's a cvs diff off the FreeBSD 4.3 release files: > > Index: atapi-cd.h > =================================================================== > RCS file: /d1/FreeBSD/FreeBSD_CVS/src/sys/dev/ata/atapi-cd.h,v > retrieving revision 1.15.2.6 > diff -r1.15.2.6 atapi-cd.h > 269a270,338 > > /* > > CDROM Write Parameters Mode Page (Burners ONLY) > > Contains the last 4 vendor specific bytes. > > */ > > struct full_write_param { > > /* mode page data header */ > > u_int16_t data_length; > > u_int8_t medium_type; > > u_int8_t dev_spec; > > u_int8_t unused[2]; > > u_int16_t blk_desc_len; > > > > /* write parameters page */ > > u_int8_t page_code; > > #define ATAPI_CDROM_WRITE_PARAMETERS_PAGE 0x05 > > > > u_int8_t page_length; /* 0x32 */ > > u_int8_t write_type :4; /* write stream type */ > > #define CDR_WTYPE_PACKET 0x00 > > #define CDR_WTYPE_TRACK 0x01 > > #define CDR_WTYPE_SESSION 0x02 > > #define CDR_WTYPE_RAW 0x03 > > > > u_int8_t test_write :1; /* test write enable */ > > u_int8_t reserved2_5 :1; > > u_int8_t burnproof :1; /* BurnProof enable */ > > u_int8_t reserved2_7 :1; > > u_int8_t track_mode :4; /* track mode */ > > #define CDR_TMODE_AUDIO 0x00 > > #define CDR_TMODE_AUDIO_PREEMP 0x01 > > #define CDR_TMODE_ALLOW_COPY 0x02 > > #define CDR_TMODE_DATA 0x04 > > #define CDR_TMODE_QUAD_AUDIO 0x08 > > > > u_int8_t copy :1; /* generation stamp */ > > u_int8_t fp :1; /* fixed packet type */ > > u_int8_t session_type :2; /* session type */ > > #define CDR_SESS_NONE 0x00 > > #define CDR_SESS_FINAL 0x01 > > #define CDR_SESS_RESERVED 0x02 > > #define CDR_SESS_MULTI 0x03 > > > > u_int8_t datablock_type :4; /* data type code (see cdrio.h) */ > > u_int8_t reserved4_4567 :4; > > u_int8_t reserved5; > > u_int8_t reserved6; > > u_int8_t host_app_code :6; /* host application code */ > > u_int8_t reserved7_67 :2; > > u_int8_t session_format; /* session format */ > > #define CDR_SESS_CDROM 0x00 > > #define CDR_SESS_CDI 0x10 > > #define CDR_SESS_CDROM_XA 0x20 > > > > u_int8_t reserved9; > > u_int32_t packet_size; /* packet size in bytes */ > > u_int16_t audio_pause_length; /* audio pause length in secs */ > > u_int8_t media_catalog_number[16]; > > u_int8_t isr_code[16]; > > u_int8_t sub_hdr_byte0; > > u_int8_t sub_hdr_byte1; > > u_int8_t sub_hdr_byte2; > > u_int8_t sub_hdr_byte3; > > > > u_int8_t vendor_specific_byte0; > > u_int8_t vendor_specific_byte1; > > u_int8_t vendor_specific_byte2; > > u_int8_t vendor_specific_byte3; > > } __attribute__((packed)); > > > Index: atapi-cd.c > =================================================================== > RCS file: /d1/FreeBSD/FreeBSD_CVS/src/sys/dev/ata/atapi-cd.c,v > retrieving revision 1.48.2.10 > diff -r1.48.2.10 atapi-cd.c > 1371c1371 > < struct write_param param; > --- > > struct full_write_param param; > > > -- > Brian Koehmstedt > bpk@hungry.com > -Søren To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105280755.f4S7tBW94826>