home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1993 #2
/
Image.iso
/
os2
/
gtak212b.zip
/
SOURCE.ZIP
/
OS2-ADD
/
init.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-29
|
8KB
|
367 lines
/*****************************************************************************
* $Id: init.c,v 1.4 1992/09/29 09:35:20 ak Exp $
*****************************************************************************
* $Log: init.c,v $
* Revision 1.4 1992/09/29 09:35:20 ak
* Must allow multiple DrvOpen calls. dup() seems to reopen the driver.
*
* Revision 1.3 1992/09/26 19:30:17 ak
* Initialize <trace> - doppelt genaeht halt besser.
*
* Revision 1.2 1992/09/18 15:59:16 ak
* *** empty log message ***
*
* Revision 1.1.1.1 1992/09/02 18:58:19 ak
* Initial checkin of OS/2 ADD based SCSI tape device driver.
*
* Revision 1.1 1992/09/02 18:58:17 ak
* Initial revision
*
*****************************************************************************/
static char _far rcsid[] = "$Id: init.c,v 1.4 1992/09/29 09:35:20 ak Exp $";
#include "addtape.h"
#include <string.h>
#define TraceDEVTAB 3
static int adapter;
static int target;
static int type_code = UIB_TYPE_TAPE;
#ifdef DEBUG
static char * devbus[] = {
/* 0000 */ "?",
/* 0001 */ "ST506 CAM-I",
/* 0002 */ "ST506 CAM-II",
/* 0003 */ "ESDI",
/* 0004 */ "Floppy",
/* 0005 */ "SCSI-1",
/* 0006 */ "SCSI-2",
/* 0007 */ "SCSI-3",
};
static char * hostbus[] = {
/* 0000 */ "?",
/* 0001 */ "ISA",
/* 0002 */ "EISA",
/* 0003 */ "MCA",
};
static char * buswidth[] = {
/* 0000 */ "-?",
/* 0010 */ "-8",
/* 0020 */ "-16",
/* 0030 */ "-32",
/* 0040 */ "-64",
/* 0050 */ "-?",
/* 0060 */ "-?",
/* 0070 */ "-?",
};
static char * unittype[] = {
/* 0000 */ "disk",
/* 0001 */ "tape",
/* 0002 */ "printer",
/* 0003 */ "processor",
/* 0004 */ "WORM",
/* 0005 */ "CDROM",
/* 0006 */ "scanner",
/* 0007 */ "optical",
/* 0008 */ "changed",
/* 0009 */ "comm",
/* 000A */ "?",
/* 000B */ "?",
/* 000C */ "?",
/* 000D */ "?",
/* 000E */ "?",
/* 000F */ "?",
};
#endif
/*
* Handle device command line.
* Line is terminated by 0.
*/
int
cmdline(char _far *line)
{
byte *name;
/*
* Skip driver name up to first argument.
*/
for (; *line && *line != ' '; ++line) ;
for (; *line == ' '; ++line) ;
/*
* First argument is device name.
*/
name = header.name;
for (; *line && *line != ' '; ++line)
if (name < header.name+8)
*name++ = *line;
while (name < header.name+8)
*name++ = ' ';
/*
* Handle arguments.
*/
for (;;++line) {
switch (*line) {
default:
return 1;
case 0:
return 0;
case ' ':
continue;
case 'D': case 'd': /* debug level */
if (*++line < '0' || *line > '9')
return 1;
trace = *line - '0';
continue;
case 'A': case 'a': /* adapter number */
if (*++line < '0' || *line > '9')
return 1;
adapter = *line - '0';
continue;
case 'T': case 't': /* target ID */
if (*++line < '0' || *line > '9')
return 1;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
target = *line - '0';
continue;
case 'S': case 's': /* sense data mode */
if (*++line < '0' || *line > '9')
return 1;
senseMode = *line - '0';
continue;
case 'V':
video_address = 0xB8000; /* VGA output */
continue;
case 'C': /* type code */
if (*++line < '0' || *line > '9')
return 1;
type_code = *line - '0';
continue;
}
}
}
word
startup(void)
{
int driver_no;
unitinfo = NULL;
for (driver_no = 0; driver_no < dctbl->count; ++driver_no) {
DevClassTableEntry _far *dcent = &dctbl->entries[driver_no];
IORB_CONFIGURATION *iorb = (IORB_CONFIGURATION *)iorb1;
int adapter_no;
#ifdef DEBUG
if (trace >= TraceDEVTAB) {
puts("Driver ");
putd(driver_no);
puts(", name '");
puts(dcent->name);
putc('\'');
}
#endif
iorb->iorbh.Length = sizeof(IORB_CONFIGURATION);
iorb->iorbh.RequestControl = IORB_DISABLE_RETRY;
iorb->iorbh.CommandCode = IOCC_CONFIGURATION;
iorb->iorbh.CommandModifier = IOCM_GET_DEVICE_TABLE;
iorb->pDeviceTable = devtab;
iorb->DeviceTableLen = sizeof devtab_data;
dcent->entry(iorb);
if (iorb->iorbh.Status != IORB_DONE) {
#ifdef DEBUG
if (trace >= 1) {
puts(" -- Error ");
putx(iorb->iorbh.ErrorCode);
putc('\n');
continue;
}
#endif
}
#ifdef DEBUG
if (trace >= TraceDEVTAB) {
puts(", level ");
putd(devtab->ADDLevelMajor);
putc('.');
putd(devtab->ADDLevelMinor);
puts(", ");
putd(devtab->TotalAdapters);
puts(" adapters\n");
}
#endif
for (adapter_no = 0; adapter_no < devtab->TotalAdapters; ++adapter_no) {
ADAPTERINFO *adap = devtab->pAdapter[adapter_no];
int unit_no, i;
int scsi = (adap->AdapterDevBus & 7) >= AI_DEVBUS_SCSI_1;
#ifdef DEBUG
if (trace >= TraceDEVTAB) {
puts(" Adapter ");
putd(adapter_no);
puts(", name '");
puts(adap->AdapterName);
puts("', ");
putd(adap->AdapterUnits);
puts(" units\n");
puts(" ");
i = adap->AdapterDevBus;
puts(devbus[i & 7]);
if (i & AI_DEVBUS_FAST_SCSI)
puts("-fast");
if (i & AI_DEVBUS_8BIT)
puts("-8");
if (i & AI_DEVBUS_16BIT)
puts("-16");
if (i & AI_DEVBUS_32BIT)
puts("-32");
i = adap->AdapterIOAccess;
if (i & AI_IOACCESS_BUS_MASTER)
puts(", bus-master");
if (i & AI_IOACCESS_PIO)
puts(", programmed-i/o");
if (i & AI_IOACCESS_DMA_SLAVE)
puts(", DMA-slave");
if (i & AI_IOACCESS_MEMORY_MAP)
puts(", memory-mapped");
puts(", ");
puts(hostbus[adap->AdapterHostBus & 3]);
puts(buswidth[adap->AdapterHostBus >> 4 & 15]);
if (scsi) {
puts(", ID ");
putx(adap->AdapterSCSITargetID);
puts(", LUN ");
putx(adap->AdapterSCSILUN);
}
puts("\n S/G max ");
putd(adap->MaxHWSGList);
if (scsi) {
puts(", CDB max ");
putd(adap->MaxCDBTransferLength);
}
i = adap->AdapterFlags;
if (i & AF_16M)
puts(", > 16MB");
else
puts(", max 16MB");
if (i & AF_IBM_SCB)
puts(", IBM SCB");
if (i & AF_HW_SCATGAT)
puts(", hardware S/G");
if (i & AF_HW_SCATGAT)
puts(", CHS addressing");
putc('\n');
}
#endif
for (unit_no = 0; unit_no < adap->AdapterUnits; ++unit_no) {
UNITINFO *unit = &adap->UnitInfo[unit_no];
#ifdef DEBUG
if (trace >= TraceDEVTAB) {
puts(" Unit ");
putd(unit_no);
if (scsi) {
puts(", ID ");
putd(unit->UnitSCSITargetID);
puts(", LUN ");
putd(unit->UnitSCSILUN);
}
puts(", ");
puts(unittype[unit->UnitType]);
puts(" dev");
i = unit->UnitFlags;
if (i & UF_REMOVABLE)
puts(", removable");
if (i & UF_REMOVABLE)
puts(", changeline");
if (i & UF_PREFETCH)
puts(", prefetch");
if (i & UF_A_DRIVE)
puts(", drive A");
if (i & UF_B_DRIVE)
puts(", drive B");
if (i & UF_NODASD_SUPT)
puts(", no DASD");
if (i & UF_NOSCSI_SUPT)
puts(", no SCSI");
if (i & UF_DEFECTIVE)
puts(", defective");
puts(", queuing ");
putd(unit->QueuingCount);
putc('\n');
}
#endif
if (scsi
&& unit->UnitType == type_code
&& !(unit->UnitFlags & UF_NOSCSI_SUPT)
&& adapter_no == adapter
&& unit->UnitSCSITargetID == target) {
PUTS(TraceDEVTAB, " Matched\n");
callADD = dcent->entry;
unitinfo = unit;
if (trace < TraceDEVTAB)
goto found;
}
}
}
}
if (!unitinfo || !callADD) {
PUTS(1, "No such tape device found\n");
return ERROR+DONE+GeneralFailure;
}
found: return DONE;
}
word
DrvInitBase(char _far *line)
{
int driver_no;
#ifndef __ZTC__
_STI_d2debug();
#endif
trace = 0;
open_count = 0;
devtab = (DEVICETABLE *)devtab_data;
memset(iorb1, 0, MAX_IORB_SIZE);
memset(iorb2, 0, MAX_IORB_SIZE);
((IORBH *)iorb2)->Status = DONE;
paddr_iorb1 = VirtToPhys(iorb1);
paddr_sglist = VirtToPhys(sglist);
blocksize = 512;
if (cmdline(line)) {
PUTS(1, "SCSITAPE command line error\n");
return ERROR+DONE+GeneralFailure;
}
dctbl = GetDOSVar(DosVar_DeviceClassTable, 1);
if (dctbl == NULL) {
PUTS(1, "GetDOSVar failed\n");
return ERROR+DONE+GeneralFailure;
}
startup();
return DONE;
}