diff -uNr scsi.org/sr.c scsi/sr.c --- scsi.org/sr.c Sat Jan 16 07:41:04 1999 +++ scsi/sr.c Mon Nov 1 13:41:15 1999 @@ -1050,6 +1050,7 @@ { int i; char name[6]; + extern int kme_poweron(int); blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST; blk_size[MAJOR_NR] = sr_sizes; @@ -1080,6 +1081,11 @@ scsi_CDs[i].cdi.dev = MKDEV(MAJOR_NR,i); scsi_CDs[i].cdi.mask = 0; scsi_CDs[i].cdi.capacity = 1; + if (strncmp(scsi_CDs[i].device->vendor, "MATSHITA", 8) == 0 + && strncmp(scsi_CDs[i].device->model, "KME CD-ROM07", 12) == 0){ + printk(KERN_INFO "KME CD-ROM07 found.\n"); + kme_poweron(i); + } get_capabilities(i); sr_vendor_init(i); diff -uNr scsi.org/sr_ioctl.c scsi/sr_ioctl.c --- scsi.org/sr_ioctl.c Fri Jul 9 12:14:00 1999 +++ scsi/sr_ioctl.c Mon Nov 1 13:40:33 1999 @@ -14,7 +14,7 @@ #include #include "sr.h" -#if 0 +#if 1 # define DEBUG #endif @@ -42,6 +42,60 @@ if (req->sem != NULL) { up(req->sem); } +} + +int kme_poweron(int target) +{ + unsigned char cmd[12]; + Scsi_Cmnd * SCpnt; + Scsi_Device * SDev; + int result, err = 0; + unsigned long flags; + + spin_lock_irqsave(&io_request_lock, flags); + SDev = scsi_CDs[target].device; + + SCpnt = scsi_allocate_device(NULL, scsi_CDs[target].device, 1); + SCpnt->cmd_len = 12; + cmd[0] = 0xe0; + cmd[1] = (scsi_CDs[target].device->lun << 5) & 0xe0; + cmd[2] = cmd[3] = cmd[4] = 0x00; + memcpy(cmd + 5, "TOMY01H", 7); + + spin_unlock_irqrestore(&io_request_lock, flags); + + if( !scsi_block_when_processing_errors(SDev) ) + return -ENODEV; + + { + struct semaphore sem = MUTEX_LOCKED; + SCpnt->request.sem = &sem; + spin_lock_irqsave(&io_request_lock, flags); + scsi_do_cmd(SCpnt, + (void *) cmd, NULL, 0, sr_ioctl_done, + IOCTL_TIMEOUT, 0); + spin_unlock_irqrestore(&io_request_lock, flags); + down(&sem); + SCpnt->request.sem = NULL; + } + + result = SCpnt->result; + + if(driver_byte(result) != 0) { + printk(KERN_ERR "sr%d: KME-CDROM power on error, command: ", target); + print_command(cmd); + print_sense("sr", SCpnt); + err = -EIO; + } + + spin_lock_irqsave(&io_request_lock, flags); + result = SCpnt->result; + /* Wake up a process waiting for device*/ + wake_up(&SCpnt->device->device_wait); + scsi_release_command(SCpnt); + SCpnt = NULL; + spin_unlock_irqrestore(&io_request_lock, flags); + return err; } /* We do our own retries because we want to know what the specific