diff options
author | Thomas Bushnell <thomas@gnu.org> | 1999-04-26 05:35:47 +0000 |
---|---|---|
committer | Thomas Bushnell <thomas@gnu.org> | 1999-04-26 05:35:47 +0000 |
commit | 3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0 (patch) | |
tree | 50b56b8570e175dbcff43b5f0d61103b6fea5906 /i386/i386at/gpl/linux/scsi/scsi_proc.c | |
parent | 002b9c7d51f7fdb0fe222d4a6023655687c6e501 (diff) | |
download | gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.tar.gz gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.tar.bz2 gnumach-3a4e8f5c1c60f87e1c9e0878ddb6cf7dac8c59c0.zip |
1998-11-06 OKUJI Yoshinori <okuji@kuicr.kyoto-u.ac.jp>
* i386/i386at/gpl/linux: Moved to ...
* linuxdev: ... here.
* i386/Makefrag: Linux drivers specific code moved to ...
* linuxdev/Makefrag: ... here.
* i386/Files: Recreated.
* i386/Subdirs: Likewise.
* linuxdev/drivers: New directory.
* linuxdev/arch: Likewise.
* linuxdev/arch/i386: Likewise.
* linuxdev/{block,scsi,net,pci}: Moved to ...
* linuxdev/drivers/{block,scsi,net,pci}: ... here.
* i386/{Drivers.in,device-drivers.h.in,driverlist.in}: Moved to ...
* linuxdev/{Drivers.in,device-drivers.h.in,driverlist.in}: ... here.
* linuxdev/{linux_emul.h,linux_*.c}: Moved to ...
* linuxdev/arch/i386/{linux_emul.h,linux_*.c}: ... here.
* linuxdev/arch/i386/linux_block.c: Include <linux_emul.h>, instead
of <i386at/gpl/linux/linux_emul.h>.
* linuxdev/arch/i386/linux_init.c: Likewise.
* linuxdev/arch/i386/linux_kmem.c: Likewise.
* linuxdev/arch/i386/linux_misc.c: Likewise.
* linuxdev/arch/i386/linux_net.c: Likewise.
* linuxdev/arch/i386/linux_sched.c: Likewise.
* device/ds_routines.c: Include <linuxdev/device-drivers.h>, instead
of <i386/device-drivers.h>.
* linuxdev/arch/i386/linux_init.c: Likewise.
* linuxdev/include/linux/autoconf.h: Likewise.
* Makefile.in: Include $(srcdir)/linuxdev/Makefrag.
* linuxdev/Drivers.in (AC_INIT): Use include/linux/autoconf.h,
instead of i386/i386asm.sym.
Diffstat (limited to 'i386/i386at/gpl/linux/scsi/scsi_proc.c')
-rw-r--r-- | i386/i386at/gpl/linux/scsi/scsi_proc.c | 317 |
1 files changed, 0 insertions, 317 deletions
diff --git a/i386/i386at/gpl/linux/scsi/scsi_proc.c b/i386/i386at/gpl/linux/scsi/scsi_proc.c deleted file mode 100644 index 6650cec9..00000000 --- a/i386/i386at/gpl/linux/scsi/scsi_proc.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * linux/drivers/scsi/scsi_proc.c - * - * The functions in this file provide an interface between - * the PROC file system and the SCSI device drivers - * It is mainly used for debugging, statistics and to pass - * information directly to the lowlevel driver. - * - * (c) 1995 Michael Neuffer neuffer@goofy.zdv.uni-mainz.de - * Version: 0.99.8 last change: 95/09/13 - * - * generic command parser provided by: - * Andreas Heilwagen <crashcar@informatik.uni-koblenz.de> - */ - -/* - * Don't import our own symbols, as this would severely mess up our - * symbol tables. - */ -#define _SCSI_SYMS_VER_ -#define __NO_VERSION__ -#include <linux/module.h> - -#include <linux/string.h> -#include <linux/mm.h> -#include <linux/malloc.h> -#include <linux/proc_fs.h> -#include <linux/errno.h> -#include <linux/stat.h> -#include <linux/blk.h> -#include "scsi.h" -#include "hosts.h" - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -extern int scsi_proc_info(char *, char **, off_t, int, int, int); - -struct scsi_dir { - struct proc_dir_entry entry; - char name[4]; -}; - - -/* generic_proc_info - * Used if the driver currently has no own support for /proc/scsi - */ -int generic_proc_info(char *buffer, char **start, off_t offset, - int length, int inode, int inout) -{ - int len, pos, begin; - - if(inout == TRUE) - return(-ENOSYS); /* This is a no-op */ - - begin = 0; - pos = len = sprintf(buffer, - "The driver does not yet support the proc-fs\n"); - if(pos < offset) { - len = 0; - begin = pos; - } - - *start = buffer + (offset - begin); /* Start of wanted data */ - len -= (offset - begin); - if(len > length) - len = length; - - return(len); -} - -/* dispatch_scsi_info is the central dispatcher - * It is the interface between the proc-fs and the SCSI subsystem code - */ -extern int dispatch_scsi_info(int ino, char *buffer, char **start, - off_t offset, int length, int func) -{ - struct Scsi_Host *hpnt = scsi_hostlist; - - if(ino == PROC_SCSI_SCSI) { - /* - * This is for the scsi core, rather than any specific - * lowlevel driver. - */ - return(scsi_proc_info(buffer, start, offset, length, 0, func)); - } - - while(hpnt) { - if (ino == (hpnt->host_no + PROC_SCSI_FILE)) { - if(hpnt->hostt->proc_info == NULL) - return generic_proc_info(buffer, start, offset, length, - hpnt->host_no, func); - else - return(hpnt->hostt->proc_info(buffer, start, offset, - length, hpnt->host_no, func)); - } - hpnt = hpnt->next; - } - return(-EBADF); -} - -void build_proc_dir_entries(Scsi_Host_Template *tpnt) -{ - struct Scsi_Host *hpnt; - - struct scsi_dir *scsi_hba_dir; - - proc_scsi_register(0, tpnt->proc_dir); - - hpnt = scsi_hostlist; - while (hpnt) { - if (tpnt == hpnt->hostt) { - scsi_hba_dir = scsi_init_malloc(sizeof(struct scsi_dir), GFP_KERNEL); - if(scsi_hba_dir == NULL) - panic("Not enough memory to register SCSI HBA in /proc/scsi !\n"); - memset(scsi_hba_dir, 0, sizeof(struct scsi_dir)); - scsi_hba_dir->entry.low_ino = PROC_SCSI_FILE + hpnt->host_no; - scsi_hba_dir->entry.namelen = sprintf(scsi_hba_dir->name,"%d", - hpnt->host_no); - scsi_hba_dir->entry.name = scsi_hba_dir->name; - scsi_hba_dir->entry.mode = S_IFREG | S_IRUGO | S_IWUSR; - proc_scsi_register(tpnt->proc_dir, &scsi_hba_dir->entry); - } - hpnt = hpnt->next; - } -} - -/* - * parseHandle *parseInit(char *buf, char *cmdList, int cmdNum); - * gets a pointer to a null terminated data buffer - * and a list of commands with blanks as delimiter - * in between. - * The commands have to be alphanumerically sorted. - * cmdNum has to contain the number of commands. - * On success, a pointer to a handle structure - * is returned, NULL on failure - * - * int parseOpt(parseHandle *handle, char **param); - * processes the next parameter. On success, the - * index of the appropriate command in the cmdList - * is returned, starting with zero. - * param points to the null terminated parameter string. - * On failure, -1 is returned. - * - * The databuffer buf may only contain pairs of commands - * options, separated by blanks: - * <Command> <Parameter> [<Command> <Parameter>]* - */ - -typedef struct -{ - char *buf, /* command buffer */ - *cmdList, /* command list */ - *bufPos, /* actual position */ - **cmdPos, /* cmdList index */ - cmdNum; /* cmd number */ -} parseHandle; - - -inline int parseFree (parseHandle *handle) /* free memory */ -{ - kfree (handle->cmdPos); - kfree (handle); - - return(-1); -} - - -parseHandle *parseInit(char *buf, char *cmdList, int cmdNum) -{ - char *ptr; /* temp pointer */ - parseHandle *handle; /* new handle */ - - if (!buf || !cmdList) /* bad input ? */ - return(NULL); - if ((handle = (parseHandle*) kmalloc(sizeof(parseHandle), 1)) == 0) - return(NULL); /* out of memory */ - if ((handle->cmdPos = (char**) kmalloc(sizeof(int), cmdNum)) == 0) { - kfree(handle); - return(NULL); /* out of memory */ - } - - handle->buf = handle->bufPos = buf; /* init handle */ - handle->cmdList = cmdList; - handle->cmdNum = cmdNum; - - handle->cmdPos[cmdNum = 0] = cmdList; - for (ptr = cmdList; *ptr; ptr++) { /* scan command string */ - if(*ptr == ' ') { /* and insert zeroes */ - *ptr++ = 0; - handle->cmdPos[++cmdNum] = ptr++; - } - } - return(handle); -} - - -int parseOpt(parseHandle *handle, char **param) -{ - int cmdIndex = 0, - cmdLen = 0; - char *startPos; - - if (!handle) /* invalid handle */ - return(parseFree(handle)); - /* skip spaces */ - for (; *(handle->bufPos) && *(handle->bufPos) == ' '; handle->bufPos++); - if (!*(handle->bufPos)) - return(parseFree(handle)); /* end of data */ - - startPos = handle->bufPos; /* store cmd start */ - for (; handle->cmdPos[cmdIndex][cmdLen] && *(handle->bufPos); handle->bufPos++) - { /* no string end? */ - for (;;) - { - if (*(handle->bufPos) == handle->cmdPos[cmdIndex][cmdLen]) - break; /* char matches ? */ - else - if (memcmp(startPos, (char*)(handle->cmdPos[++cmdIndex]), cmdLen)) - return(parseFree(handle)); /* unknown command */ - - if (cmdIndex >= handle->cmdNum) - return(parseFree(handle)); /* unknown command */ - } - - cmdLen++; /* next char */ - } - - /* Get param. First skip all blanks, then insert zero after param */ - - for (; *(handle->bufPos) && *(handle->bufPos) == ' '; handle->bufPos++); - *param = handle->bufPos; - - for (; *(handle->bufPos) && *(handle->bufPos) != ' '; handle->bufPos++); - *(handle->bufPos++) = 0; - - return(cmdIndex); -} - -#define MAX_SCSI_DEVICE_CODE 10 -const char *const scsi_dev_types[MAX_SCSI_DEVICE_CODE] = -{ - "Direct-Access ", - "Sequential-Access", - "Printer ", - "Processor ", - "WORM ", - "CD-ROM ", - "Scanner ", - "Optical Device ", - "Medium Changer ", - "Communications " -}; - -void proc_print_scsidevice(Scsi_Device *scd, char *buffer, int *size, int len) -{ - int x, y = *size; - - y = sprintf(buffer + len, - "Host: scsi%d Channel: %02d Id: %02d Lun: %02d\n Vendor: ", - scd->host->host_no, scd->channel, scd->id, scd->lun); - for (x = 0; x < 8; x++) { - if (scd->vendor[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", scd->vendor[x]); - else - y += sprintf(buffer + len + y," "); - } - y += sprintf(buffer + len + y, " Model: "); - for (x = 0; x < 16; x++) { - if (scd->model[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", scd->model[x]); - else - y += sprintf(buffer + len + y, " "); - } - y += sprintf(buffer + len + y, " Rev: "); - for (x = 0; x < 4; x++) { - if (scd->rev[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", scd->rev[x]); - else - y += sprintf(buffer + len + y, " "); - } - y += sprintf(buffer + len + y, "\n"); - - y += sprintf(buffer + len + y, " Type: %s ", - scd->type < MAX_SCSI_DEVICE_CODE ? - scsi_dev_types[(int)scd->type] : "Unknown " ); - y += sprintf(buffer + len + y, " ANSI" - " SCSI revision: %02x", (scd->scsi_level < 3)?1:2); - if (scd->scsi_level == 2) - y += sprintf(buffer + len + y, " CCS\n"); - else - y += sprintf(buffer + len + y, "\n"); - - *size = y; - return; -} - -/* - * Overrides for Emacs so that we get a uniform tabbing style. - * Emacs will notice this stuff at the end of the file and automatically - * adjust the settings for this buffer only. This must remain at the end - * of the file. - * --------------------------------------------------------------------------- - * Local variables: - * c-indent-level: 4 - * c-brace-imaginary-offset: 0 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * c-continued-statement-offset: 4 - * c-continued-brace-offset: 0 - * indent-tabs-mode: nil - * tab-width: 8 - * End: - */ |