Files
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

188 lines
4.4 KiB
C

/*
* @(#)scsi.c 1.1 92/07/30 Copyright (c) 1988 by Sun Microsystems, Inc.
* Copyright (c) 1986 by Sun Microsystems, Inc.
*
* Contains SCSI probe routine to probe for host adapter.
*/
/*#define SCSI_DEBUG 1 /* Allow compiling of debug code */
#define REL4 /* Enable release 4.00 mods */
#ifdef REL4
#include <sys/types.h>
#include <mon/sunromvec.h>
#include <stand/saio.h>
#include <stand/scsi.h>
#include <mon/idprom.h>
#else REL4
#include "../h/types.h"
#include "../mon/sunromvec.h"
#include "../mon/idprom.h"
#include "saio.h"
#include "scsi.h"
#endif REL4
/* external routines */
#ifdef sun2
extern scopen();
#endif sun2
#ifdef sun3
extern siopen(), scopen(), se_open();
#endif sun2
#ifdef sun3x
extern siopen(), scopen(), se_open(), smopen();
#endif sun3x
#ifdef sun4
extern swopen(), smopen();
#endif sun4
#ifdef SCSI_DEBUG
int scsi_debug = SCSI_DEBUG; /* 0 = normal operation
* 1 = extended error info only
* 2 = debug and error info
* 3 = all status info
*/
/* Handy debugging 0, 1, and 2 argument printfs */
#define DPRINTF(str) \
if (scsi_debug > 1) printf(str)
#define DPRINTF1(str, arg1) \
if (scsi_debug > 1) printf(str,arg1)
#define DPRINTF2(str, arg1, arg2) \
if (scsi_debug > 1) printf(str,arg1,arg2)
/* Handy extended error reporting 0, 1, and 2 argument printfs */
#define EPRINTF(str) \
if (scsi_debug) printf(str)
#define EPRINTF1(str, arg1) \
if (scsi_debug) printf(str,arg1)
#define EPRINTF2(str, arg1, arg2) \
if (scsi_debug) printf(str,arg1,arg2)
#else SCSI_DEBUG
int scsi_debug = 0;
#define DPRINTF(str)
#define DPRINTF1(str, arg2)
#define DPRINTF2(str, arg1, arg2)
#define EPRINTF(str)
#define EPRINTF1(str, arg2)
#define EPRINTF2(str, arg1, arg2)
#endif SCSI_DEBUG
/*
* scsi reset flag
*/
int sc_reset = 0;
/*
* scsi CDB op code to command length decode table.
*/
u_char sc_cdb_size[] = {
CDB_GROUP0, /* Group 0, 6 byte cdb */
CDB_GROUP1, /* Group 1, 10 byte cdb */
CDB_GROUP2, /* Group 2, ? byte cdb */
CDB_GROUP3, /* Group 3, ? byte cdb */
CDB_GROUP4, /* Group 4, ? byte cdb */
CDB_GROUP5, /* Group 5, ? byte cdb */
CDB_GROUP6, /* Group 6, ? byte cdb */
CDB_GROUP7 /* Group 7, ? byte cdb */
};
/*
* Description: Probe for SCSI host adaptor interface.
*
* SI vme scsi host adaptor occupies 2K bytes in the vme address
* space. SC vme scsi host adaptor occupies 4K bytes in the vme
* address space. This difference is used to determine which host
* adapter is connected.
*
* The call to si_open will determine whether the system has a
* on-board si host adapter, or not. Similarly, scopen will
* determine whether the system has a multibus or VME bus.
*
* Synopsis: status = scsi_probe(sip)
* status :(int) 0 one of the host-adapter found
* -1 neither host-adapter found
* h_sip :(int *) pointer to host adapter structure
* Routines: scopen, siopen
*/
int
scsi_probe(h_sip)
register struct host_saioreq *h_sip;
{
#ifdef sun2
DPRINTF("scsi_probe: sc\n");
/* For Sun-2, there is only the SCSI-2 (sc). */
if (scopen(h_sip) == 0) {
EPRINTF("scsi_probe: using sc\n");
return (0);
}
#endif sun2
/*
* For Sun-3 and Sun-4, there are several choices:
* VME SCSI-3, onboard Sun-3 SCSI-3, onborad Sun-4 SCSI-3,
* and VME SCSI-2. Si takes care of all the SCSI-3 permutations.
* Sc takes care of SCSI-2.
*/
#ifdef sun4
DPRINTF("scsi_probe: sw\n");
/* Check for Sun-4/110 SCSI */
if (swopen(h_sip) == 0) {
EPRINTF("scsi_probe: using sw\n");
return (0);
}
/* last test for Emulex ESP controller */
/* Check for Sun-4 STINGRAY SCSI */
DPRINTF("scsi_probe: sm\n");
if (smopen(h_sip) == 0) {
EPRINTF("scsi_probe: using sm\n");
return (0);
}
#endif sun4
#if defined(sun3) || defined(sun3x) || defined(sun4)
/* Check for Sun-3 SCSI-3 */
DPRINTF("scsi_probe: si\n");
if (siopen(h_sip) == 0) {
EPRINTF("scsi_probe: using si\n");
return (0);
}
/* Check for Sun-3E SCSI */
DPRINTF("scsi_probe: se\n");
if (se_open(h_sip) == 0) {
EPRINTF("scsi_probe: using se\n");
return (0);
}
/* Check for Sun-2/3 SCSI-2 */
DPRINTF("scsi_probe: sc\n");
if (scopen(h_sip) == 0) {
EPRINTF("scsi_probe: using sc\n");
return (0);
}
#ifdef sun3x
/* last test for Emulex ESP controller */
/* Check for Sun-3x HYDRA SCSI */
DPRINTF("scsi_probe: sm\n");
if (smopen(h_sip) == 0) {
EPRINTF("scsi_probe: using sm\n");
return (0);
}
#endif sun3x
#endif sun3 || sun3x || sun4
#ifdef lint
scsi_debug = scsi_debug;
#endif lint
/* No host adapter found */
return (-1);
}