CD Writer mini-HOWTO
by Matt Cutts, [email protected]
v0.2, 17 Dec 1994

 1.  Introduction

 This is how I wrote a CD with Linux kernel v1.1.64, Philips CDD 521
 (although outside label was "Kodak PCD Writer 200 PLUS"), and an
 Adaptec 1542cf.  Your mileage may vary; not responsible if this
 causes your computer to explode; all trademarks are trademarks, etc.

 In particular, cdwrite supposedly only works with Philips writers,
 although to my knowledge no one has tested it on other writers.
 The first part is complete reconstruction of the process that I
 did to write a CD.  After everything is done once, you need only
 use mkisofs and cdwrite for each CD you write.

 1.1.  Feedback

 This document describes my experience in getting a CD writer to work.
 I may be able to answer some questions or comments about this test.
 Please feel free to mail Matt Cutts, at [email protected].  Let me know
 if this document helped, or if some other section would be helpful.
 Please point out any mistakes that you find as well.

 2.  The Process

 Here's a chronological recreation of what I did.  You may want to skip
 the steps that resulted in kernel panics 8-).  Note that much of this
 process will require you to be super-user on the machine.

 2.1.  shut down computer; hook CD writer to computer; reboot

 ---> causes a kernel panic

 2.2.  upgrade to 1.1.64 kernel

 ---> still causes a kernel panic

 2.3.  change 1542CF settings

 Mike McKenna (our local hardware guru) and I changed around quite
 a few settings, so I'm going to do a complete list of them.  One
 of them fixed everything.  I'm 90% sure that it was changing "Enable
 Disconnection" to "no" for the SCSI ID# corresponding to the CD writer,
 but I haven't written a CD since I've played with the settings.
 Try changing that first; if that doesn't work, try changing some
 of the other setting that I mentioned.  When you boot, hit <Ctrl><A>
 to get into the SCSI-Select utility.  Go into "Configure/View Host
 Adapter Settings".  Here are my working settings when I wrote the CD:

 Host Adapter IRQ Channel -> 11
 Host Adapter DMA Channel -> 5
 Host Adapter SCSI ID     -> 7
 [BIOS Revision:  2.02;  Base Address:  DC000h; Firmware:  Rev. B.0;
       Checksum:  A223h]
 (these should be irrelevant to you; DO NOT change the settings above)

 SCSI Parity Checking          Enabled
 DMA Transfer Rate             5.0 MB/sec
 Host Adapter SCSI Termination Enabled

 SCSI Device Configuration
 (note hard drive = #0, writer = #1, 1542 = #7)
                                #0   #1   #2   #3   #4   #5   #6   #7
 Enable Sync Negotiation        no   no   no   no   no   no   no   no
 Enable FAST SCSI               no   no   no   no   no   no   no   no
 Enable Disconnection           yes  no   yes  yes  yes  yes  yes  yes
 Send Start Unit Command        no   yes  no   no   no   no   no   no
 *(default is all yes for Enable Disconnection and all no for Send Start
       Unit Command)

 Advanced Configuration Options
 Floppy Controller I/O Port (AHA-1542CF only)                  3F0h-3F7h
 Reset SCSI Bus at Power-On                                    Enabled
 Host Adapter BIOS (Configuration Utility Reserves BIOS Space) Enabled
 System Boot (INT 19h) Controlled by Host Adapter BIOS         Enabled
 Extended BIOS Translation for DOS Drives > 1 GByte            Disabled
 *Support Removable Disks Under BIOS as Fixed Disks            Enabled
 Dynamically Scan SCSI Bus for BIOS Devices                    Disabled
 BIOS Support for More Than 2 Drives (MS-DOS(R) 5.0 and above) Disabled
 Immediate Return On Seek Command                              Enabled
 Display <Ctrl><A> Message During BIOS Initialization          Enabled
 *BIOS Support for Floptical Drives                            Enabled

 Items with an asterisk are different from the default.  Sorry to
 dump this whole options list for those who don't need it, but I
 figured a few SCSI novices might appreciate it.  REMEMBER:  I think
 that the only needed change is Enable Disconnection for the ID# of
 your CD Writer.  Make it "no" instead of "yes".

 The result:
 no panic; recognizes as CDROM drive (sr0); SCSI generic driver doesn't
 say anything either way, so couldn't tell if recognized

 2.4.  use mkisofs to produce binary image (I used mkisofs v1.00)

 e.g. "mkisofs -o /home/cd.image /home/dir_to_archive"
 [I used mkisofs1.00, from tsx-11.mit.edu, at
 /pub/linux/BETA/cdrom/mkisofs-1.00.tar.gz; version 1.01 is also
 available and would probably work even better].  Can also get
 iso9660-diagnose.tar.gz from the same directory, which is another
 cdrom tool (I haven't tried it).  See mkisofs usage in section 3.

 2.5.  make SCSI generic devices

 e.g. "/dev/MAKEDEV sg" (will create sga -> sgh; generic devices
 are allocated/assigned at boot time).

 2.6.  realize that the SCSI generic driver isn't reading things correctly.

 Joseph Julicher at Rose-Hulman suggested a kernel hack to
 process the SCSI inquiry byte (it needs a bitwise and with 0x1f).  I also
 changed the TYPE_WORM drive to be writeable; not sure that this is
 required for things to function correctly.  In fact, I made everything
 writable (tacky, but effective!).

 The original /usr/src/{linux-1.1.64/}linux/drivers/scsi/scsi.c
 (beginning around line 361)

     switch (type = scsi_result[0])
       {
       case TYPE_TAPE :
       case TYPE_DISK :
       case TYPE_MOD :
         SDpnt->writeable = 1;
         break;
       case TYPE_WORM :
       case TYPE_ROM :
         SDpnt->writeable = 0;
         break;
       default :

 I changed it to:

     switch (type = scsi_result[0] & 0x1f)
       {
       case TYPE_TAPE :
       case TYPE_DISK :
       case TYPE_MOD :
       case TYPE_WORM :
       case TYPE_ROM :       /* probably shouldn't be writeable :) */
         SDpnt->writeable = 1;
         break;
       default :

 2.7.  fix cdwrite (version that I changed was v1.3)
 [I obtained cdwrite from tsx-11.mit.edu, at
 /pub/linux/BETA/cdrom/private/mkisofs/cdwrite-1.3.tar.gz]
 original program had following code (beginning around line 439):

    set_timeout(fd, timeout);

    /* First make sure we know how to talk to this writer */
    inquiry (fd, &reply_len, &reply, &manufacturer[0], &model[0]);
    if(strcmp(manufacturer,"PHILLIPS")) {

 I changed program to following:
 (added the next two lines near the top)

   /* new #define from drivers/scsi/scsi.h; orig program had this defined */
   #define SG_SET_TIMEOUT      0x2201

 (Following code replaced orig. code around line 439)

    /*   set_timeout(fd, timeout);*/
    if (ioctl(fd, SG_SET_TIMEOUT, SG_SET_TIMEOUT, &timeout) < 0) {
       perror ("ioctl SG_SET_TIMEOUT");
       exit(5);
    }

    /* First make sure we know how to talk to this writer */
    inquiry (fd, &reply_len, &reply, &manufacturer[0], &model[0]);
    if(strcmp(manufacturer,"IMS")) {

 Note that the Philips CDD 521 returns "IMS" as its manufacturer, and that
 I used modified the newer program to set the timeout as the original
 program did.  When you untar cdwrite, the original program is in the "orig"
 directory.

 2.8.  recompile kernel and reboot for change to take effect

 Make sure to say yes to SCSI generic support, or else the generic driver
 won't be included in the kernel.  You must reboot for the new kernel to
 replace the currently running one.

 2.9.  write a CD!

 e.g. "cdwrite /dev/sgb < /home/cd.image"
 Note that sgb was the CD writer, i.e. SCSI generic device b (because the
 hard drive was generic device a), and that /home/cd.image is an ISO9660
 image produced by mkisofs.

 3.  After the First Time

 That should take you through the process of getting ready to write one
 CD.  After that things are trivially easy.  Make sure you have plenty o'
 space on your disk.  Then just do "mkisofs -o filename path", where path
 is the path of the directory tree to be copied into ISO9660 format, and
 filename is the name of the resulting binary image.  The mkisofs program
 has lots of other great options (like Rock Ridge extensions); check out
 the man page that Eric Youngdale included for his program.  Next, do
 "cdwrite scsi_device < cdrom_file", where scsi_device is the generic
 SCSI device and cdrom_file is the ISO9660 image.  The cdwrite program also
 has a few options, like -speed (to write single/double speed) and -dummy
 (to test everything without actually writing the disk).  Check the cdwrite.c
 program to see the options it has.

 4.  Thank you

 Thanks to all the people who wrote with suggestions for my problems; thanks
 also to Eric Youngdale for the mkisofs code, Adam Richter for the original
 cdwrite program, Joseph Julicher for noticing the SCSI generic problem,
 Mike McKenna for figuring out the 1542 settings, and my employers for
 paying me to explore with a neat toy.