File: //usr/share/doc/scsitools/kpatch.sraw
*** 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 */