*** scsi_ioctl.c.~2~ Sat Sep 11 18:19:39 1993 --- scsi_ioctl.c Tue Sep 14 00:52:50 1993 *************** *** 214,219 **** --- 214,278 ---- #endif } + /* Only used for benchmarking the low-level scsi code. This will use + the ramdisk as the temporary buffer */ + + extern char * rd_start; + extern int rd_length; + + static int benchmark_ioctl_command(Scsi_Device *dev, void *buffer) + { + char * buf; + char cmd[12]; + char * cmd_in; + Scsi_Cmnd * SCpnt; + unsigned char opcode; + int inlen, outlen, cmdlen; + int needed; + int result; + + if (!buffer) + return -EINVAL; + + inlen = get_fs_long((unsigned long *) buffer); + outlen = get_fs_long( ((unsigned long *) buffer) + 1); + + cmd_in = (char *) ( ((int *)buffer) + 2); + opcode = get_fs_byte(cmd_in); + + needed = (inlen > outlen ? inlen : outlen); + if(needed) { + if(needed > rd_length) return -EINVAL; + buf = rd_start; + } else + buf = NULL; + + memcpy_fromfs ((void *) cmd, cmd_in, cmdlen = COMMAND_SIZE (opcode)); + memcpy_fromfs ((void *) buf, (void *) (cmd_in + cmdlen), inlen); + + cmd[1] = ( cmd[1] & 0x1f ) | (dev->lun << 5); + + SCpnt = allocate_device(NULL, dev->index, 1); + + scsi_do_cmd(SCpnt, cmd, buf, outlen, scsi_ioctl_done, MAX_TIMEOUT, + MAX_RETRIES); + + if (SCpnt->request.dev != 0xfffe){ + SCpnt->request.waiting = current; + current->state = TASK_UNINTERRUPTIBLE; + while (SCpnt->request.dev != 0xfffe) schedule(); + }; + + result = verify_area(VERIFY_WRITE, cmd_in, outlen); + if (result) + return result; + memcpy_tofs ((void *) cmd_in, buf, outlen); + result = SCpnt->result; + SCpnt->request.dev = -1; /* Mark as not busy */ + wake_up(&scsi_devices[SCpnt->index].device_wait); + return result; + } + /* *************** *** 236,241 **** --- 295,302 ---- return 0; case SCSI_IOCTL_PROBE_HOST: return ioctl_probe(dev->host, arg); + case SCSI_IOCTL_BENCHMARK_COMMAND: + return benchmark_ioctl_command((Scsi_Device *) dev, arg); case SCSI_IOCTL_SEND_COMMAND: return ioctl_command((Scsi_Device *) dev, arg); case SCSI_IOCTL_DOORLOCK: *** scsi_ioctl.h.~1~ Tue Sep 7 01:38:47 1993 --- scsi_ioctl.h Mon Sep 13 23:53:39 1993 *************** *** 4,9 **** --- 4,10 ---- #define SCSI_IOCTL_PROBE_HOST 0 #define SCSI_IOCTL_SEND_COMMAND 1 #define SCSI_IOCTL_TEST_UNIT_READY 2 + #define SCSI_IOCTL_BENCHMARK_COMMAND 3 /* The door lock/unlock constants are compatible with Sun constants for the cdrom */ #define SCSI_IOCTL_DOORLOCK 0x5380 /* lock the eject mechanism */