Update from Wolfgang Stanglemeier.

This commit is contained in:
mycroft 1994-10-01 06:27:56 +00:00
parent 0e28696023
commit 6ddbe860c2
7 changed files with 3711 additions and 1548 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/**************************************************************************
**
** $Id: ncr_reg.h,v 1.1 1994/08/09 22:20:49 mycroft Exp $
** $Id: ncr_reg.h,v 1.2 1994/10/01 06:28:01 mycroft Exp $
**
** Device driver for the NCR 53C810 PCI-SCSI-Controller.
**
@ -42,24 +42,6 @@
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
**-------------------------------------------------------------------------
**
** $Log: ncr_reg.h,v $
** Revision 1.1 1994/08/09 22:20:49 mycroft
** Add NCR 53c8XX driver, originally from Wolfgang Stanglmeier.
**
** Revision 2.0.0.4 94/08/09 23:10:10 wolf
** new message.
**
** Revision 2.0.0.3 94/07/24 08:59:19 wolf
** bits of sstat0 defined.
**
** Revision 2.0 94/07/10 15:53:27 wolf
** FreeBSD release.
**
** Revision 1.0 94/06/07 20:02:21 wolf
** Beta release.
**
***************************************************************************
*/
#ifndef __NCR_REG_H__
@ -75,18 +57,32 @@
struct ncr_reg {
/*00*/ u_char nc_scntl0; /* full arb., ena parity, par->ATN */
/*01*/ u_char nc_scntl1; /* no reset */
#define ISCON 0x10 /* connected to scsi */
#define CRST 0x08 /* force reset */
/*02*/ u_char nc_scntl2; /* no disconnect expected */
#define SDU 0x80 /* cmd: disconnect will raise error */
#define CHM 0x40 /* sta: chained mode */
#define WSS 0x08 /* sta: wide scsi send [W]*/
#define WSR 0x01 /* sta: wide scsi received [W]*/
/*03*/ u_char nc_scntl3; /* cnf system clock dependent */
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define EWS 0x08 /* cmd: enable wide scsi [W]*/
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define RRE 0x40 /* r/w:e enable response to resel. */
#define SRE 0x20 /* r/w:e enable response to select */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*09*/ u_char nc_socl;
#define CREQ 0x80 /* r/w: SCSI-REQ */
#define CACK 0x40 /* r/w: SCSI-ACK */
@ -96,8 +92,11 @@ struct ncr_reg {
#define CMSG 0x04 /* r/w: SCSI-MSG */
#define CC_D 0x02 /* r/w: SCSI-C_D */
#define CI_O 0x01 /* r/w: SCSI-I_O */
/*0a*/ u_char nc_ssid;
/*0b*/ u_char nc_sbcl;
/*0c*/ u_char nc_dstat;
#define DFE 0x80 /* sta: dma fifo empty */
#define MDPE 0x40 /* int: master data parity error */
@ -106,20 +105,28 @@ struct ncr_reg {
#define SSI 0x08 /* int: script: single step */
#define SIR 0x04 /* int: script: interrupt instruct. */
#define IID 0x01 /* int: script: illegal instruct. */
/*0d*/ u_char nc_sstat0;
#define ILF 0x80 /* sta: data in SIDL register */
#define ORF 0x40 /* sta: data in SODR register */
#define OLF 0x20 /* sta: data in SODL register */
#define ILF 0x80 /* sta: data in SIDL register lsb */
#define ORF 0x40 /* sta: data in SODR register lsb */
#define OLF 0x20 /* sta: data in SODL register lsb */
#define AIP 0x10 /* sta: arbitration in progress */
#define LOA 0x08 /* sta: arbitration lost */
#define WOA 0x04 /* sta: arbitration won */
#define IRST 0x02 /* sta: scsi reset signal */
#define SDP 0x01 /* sta: scsi parity signal */
/*0e*/ u_char nc_sstat1;
#define FF3210 0xf0 /* sta: bytes in the scsi fifo */
/*0f*/ u_char nc_sstat2;
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define ILF1 0x80 /* sta: data in SIDL register msb[W]*/
#define ORF1 0x40 /* sta: data in SODR register msb[W]*/
#define OLF1 0x20 /* sta: data in SODL register msb[W]*/
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define CABRT 0x80 /* cmd: abort current operation */
#define SRST 0x40 /* mod: reset chip */
#define SIGP 0x20 /* r/w: message from host to ncr */
@ -128,36 +135,46 @@ struct ncr_reg {
#define INTF 0x04 /* sta: int on the fly (reset by wr)*/
#define SIP 0x02 /* sta: scsi-interupt */
#define DIP 0x01 /* sta: host/script interupt */
/*15*/ u_char nc_15_;
/*16*/ u_char nc_16_;
/*17*/ u_char nc_17_;
/*18*/ u_char nc_ctest0;
/*19*/ u_char nc_ctest1;
/*1a*/ u_char nc_ctest2;
#define CSIGP 0x40
/*1b*/ u_char nc_ctest3;
#define CLF 0x04 /* clear scsi fifo */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*20*/ u_char nc_dfifo;
/*21*/ u_char nc_ctest4;
/*22*/ u_char nc_ctest5;
/*23*/ u_char nc_ctest6;
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*34*/ u_long nc_scratcha; /* ??? Temporary register a */
/*38*/ u_char nc_dmode;
/*39*/ u_char nc_dien;
/*3a*/ u_char nc_dwt;
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
#define SSM 0x10 /* mod: single step mode */
#define STD 0x04 /* cmd: start dma mode */
#define NOCOM 0x01 /* cmd: protect sfbr while reselect */
/*3c*/ u_long nc_adder;
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
#define STO 0x0400/* sta: timeout (select) */
#define GEN 0x0200/* sta: timeout (general) */
#define HTH 0x0100/* sta: timeout (handshake) */
@ -169,34 +186,33 @@ struct ncr_reg {
#define UDC 0x04 /* sta: unexpected disconnect */
#define RST 0x02 /* sta: scsi bus reset detected */
#define PAR 0x01 /* sta: scsi parity error */
/*44*/ u_char nc_slpar;
/*45*/ u_char nc_45_;
/*45*/ u_char nc_swide;
/*46*/ u_char nc_macntl;
/*47*/ u_char nc_gpcntl;
/*48*/ u_char nc_stime0; /* cmd: timeout for select&handshake*/
/*49*/ u_char nc_stime1; /* cmd: timeout user defined */
/*4a*/ u_char nc_respid; /* sta: Reselect-IDs */
/*4b*/ u_char nc_4b_;
/*4a*/ u_short nc_respid; /* sta: Reselect-IDs */
/*4c*/ u_char nc_stest0;
/*4d*/ u_char nc_stest1;
/*4e*/ u_char nc_stest2;
#define ROF 0x40 /* reset scsi offset (after gross error!) */
#define EXT 0x02 /* extended filtering */
/*4f*/ u_char nc_stest3;
#define TE 0x80 /* c: tolerAnt enable */
#define CSF 0x02 /* c: clear scsi fifo */
/*50*/ u_char nc_sidl; /* Lowlevel: latched from scsi data */
/*51*/ u_char nc_51_;
/*52*/ u_char nc_52_;
/*53*/ u_char nc_53_;
/*54*/ u_char nc_sodl; /* Lowlevel: data out to scsi data */
/*55*/ u_char nc_55_;
/*56*/ u_char nc_56_;
/*57*/ u_char nc_57_;
/*58*/ u_char nc_sbdl; /* Lowlevel: data from scsi data */
/*59*/ u_char nc_59_;
/*5a*/ u_char nc_5a_;
/*5b*/ u_char nc_5b_;
/*50*/ u_short nc_sidl; /* Lowlevel: latched from scsi data */
/*52*/ u_short nc_52_;
/*54*/ u_short nc_sodl; /* Lowlevel: data out to scsi data */
/*56*/ u_short nc_56_;
/*58*/ u_short nc_sbdl; /* Lowlevel: data from scsi data */
/*5a*/ u_short nc_5a_;
/*5c*/ u_char nc_scr0; /* Working register B */
/*5d*/ u_char nc_scr1; /* */
/*5e*/ u_char nc_scr2; /* */
@ -368,14 +384,17 @@ struct scr_tblsel {
**-----------------------------------------------------------
*/
#define SCR_REG_OFS(ofs) ((ofs) << 16ul)
#define SCR_SFBR_REG(reg,op,data) \
(0x68000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_SFBR(reg,op,data) \
(0x70000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_REG(reg,op,data) \
(0x78000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_LOAD 0x00000000
#define SCR_SHL 0x01000000
@ -502,9 +521,12 @@ struct scr_tblsel {
#define M_SIMPLE_TAG (0x20)
#define M_HEAD_TAG (0x21)
#define M_ORDERED_TAG (0x22)
#define M_IGN_RESIDUE (0x23)
#define M_IDENTIFY (0x80)
#define M_X_SDTR (0x01)
#define M_X_MODIFY_DP (0x00)
#define M_X_SYNC_REQ (0x01)
#define M_X_WIDE_REQ (0x03)
/*
** Status
@ -520,5 +542,6 @@ struct scr_tblsel {
#define S_TERMINATED (0x20)
#define S_QUEUE_FULL (0x28)
#define S_ILLEGAL (0xff)
#define S_SENSE (0x80)
#endif /*__NCR_REG_H__*/

View File

@ -1,6 +1,6 @@
/**************************************************************************
**
** $Id: ncrstat.c,v 1.2 1994/08/11 04:54:13 mycroft Exp $
** $Id: ncrstat.c,v 1.3 1994/10/01 06:28:02 mycroft Exp $
**
** Utility for NCR 53C810 device driver.
**
@ -43,39 +43,6 @@
**
**
**-------------------------------------------------------------------------
**
** $Log: ncrstat.c,v $
** Revision 1.2 1994/08/11 04:54:13 mycroft
** Make this work.
**
** Revision 2.0.0.6 94/08/10 19:36:32 wolf
** Multiple "-s" options per line supported.
** Ported to NetBSD.
**
** Revision 2.0.0.5 94/08/09 23:10:20 wolf
** new message.
**
** Revision 2.0.0.4 94/08/08 19:10:28 wolf
** struct script left outside struct ncb.
** (must fit in one physical page)
**
** Revision 2.0.0.3 94/08/05 18:44:43 wolf
** adapted to ncr.c 2.0.0.8
** (script now inside control structure)
**
** Revision 2.0.0.2 94/07/22 16:57:34 wolf
** New option "-n#": get the script label of an address.
**
** Revision 2.0.0.1 94/07/19 22:25:05 wolf
** hexadecimal args.
**
** Revision 2.0 94/07/10 19:01:30 wolf
** FreeBSD release.
**
** Revision 1.1 94/06/25 17:18:11 wolf
** Initial revision
**
***************************************************************************
*/
#include <sys/file.h>
@ -88,24 +55,20 @@
#include <errno.h>
#include <paths.h>
#include <limits.h>
#include <kvm.h>
#include <i386/pci/ncr.c>
/*
** used external functions
*/
#ifdef __NetBSD__
#include <kvm.h>
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
kvm_t *kvm;
#define KVM_NLIST(n) (kvm_nlist(kvm, (n)) >= 0)
#define KVM_READ(o, p, l) (kvm_read(kvm, (o), (p), (l)) == (l))
#define KVM_READ(o, p, l) (kvm_read(kvm, (o), (void*)(p), (l)) == (l))
#else
extern int kvm_openfiles();
extern int kvm_nlist();
extern char* kvm_geterr();
extern int kvm_read();
#define KVM_NLIST(n) (kvm_nlist((n)) >= 0)
#define KVM_READ(o, p, l) (kvm_read((o), (p), (l)) == (l))
#define KVM_READ(o, p, l) (kvm_read((void*)(o), (p), (l)) == (l))
#endif
extern void exit();
@ -176,7 +139,7 @@ read_ccb(u_long base)
{
ccb_base = base;
if (!KVM_READ (
(void*)base,
base,
&ccb,
sizeof (struct ccb))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, base);
@ -188,7 +151,7 @@ read_lcb(u_long base)
{
lcb_base = base;
if (!KVM_READ (
(void*)base,
base,
&lcb,
sizeof (struct lcb))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, base);
@ -199,7 +162,7 @@ read_lcb(u_long base)
read_ncr()
{
if (!KVM_READ (
(void*)ncr_base,
ncr_base,
&ncr,
sizeof (ncr))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, ncr_base);
@ -211,13 +174,13 @@ void open_kvm(int flags)
{
int i;
u_long kernel_version;
#ifdef __NetBSD__
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
char errbuf[_POSIX2_LINE_MAX];
#endif
if (kvm_isopen) return;
#ifdef __NetBSD__
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
kvm = kvm_openfiles(vmunix, kmemf, NULL, flags, errbuf);
if (kvm == NULL) {
fprintf(stderr, "%s: kvm_openfiles: %s\n", prog, errbuf);
@ -244,7 +207,7 @@ void open_kvm(int flags)
}
if (!KVM_READ (
(void*)nl[N_NCR_VERSION].n_value,
nl[N_NCR_VERSION].n_value,
&kernel_version,
sizeof (kernel_version))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -260,7 +223,7 @@ void open_kvm(int flags)
#ifdef __NetBSD__
if (!KVM_READ (
(void*)nl[N_NCRCD].n_value,
nl[N_NCRCD].n_value,
&ncrcd,
sizeof (ncrcd))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -274,7 +237,7 @@ void open_kvm(int flags)
};
if (!KVM_READ (
(void*)ncrcd.cd_devs+4*ncr_unit,
ncrcd.cd_devs+4*ncr_unit,
&ncr_base,
sizeof (ncr_base))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -290,7 +253,7 @@ void open_kvm(int flags)
#else /* !__NetBSD__ */
if (!KVM_READ (
(void*)nl[N_NNCR].n_value,
nl[N_NNCR].n_value,
&ncr_units,
sizeof (ncr_units))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -304,7 +267,7 @@ void open_kvm(int flags)
};
if (!KVM_READ (
(void*)nl[N_NCRP].n_value+4*ncr_unit,
nl[N_NCRP].n_value+4*ncr_unit,
&ncr_base,
sizeof (ncr_base))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -379,7 +342,7 @@ do_info(void)
set_target_mask();
printf ("T:L Vendor Device Rev Speed Max Tags\n");
printf ("T:L Vendor Device Rev Speed Max Wide Tags\n");
for (t=0; t<MAX_TARGET;t++) {
if (!((target_mask>>t)&1)) continue;
tip = &ncr.target[t];
@ -426,6 +389,20 @@ do_info(void)
};
read_lcb ((u_long) tip->lp[l]);
switch (tip->widedone) {
case 1:
printf (" 8");
break;
case 2:
printf (" 16");
break;
case 3:
printf (" 32");
break;
default:
printf (" ?");
};
if (lcb.usetags)
printf ("%5d", lcb.actlink);
else
@ -681,7 +658,7 @@ u_char in (u_char reg)
{
u_char res;
if (!KVM_READ (
(void*)(ncr.vaddr + reg),
(ncr.vaddr + reg),
&res,
1)) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -710,7 +687,7 @@ void do_set (char * arg)
for (i=3; i; i--) {
if (!KVM_READ (
(void*)(addr),
(addr),
&user,
sizeof (user))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -734,6 +711,8 @@ void do_set (char * arg)
"sync=value: set the maximal synchronous transfer rate (MHz).\n"
"fast: set FAST SCSI-2.\n"
"\n"
"wide=value: set the bus width (0=8bit 1=16bit).\n"
"\n"
"tags=value: use this number of tags.\n"
"orderedtag: use ordered tags only.\n"
"simpletag: use simple tags only.\n"
@ -762,6 +741,14 @@ void do_set (char * arg)
};
};
if (!strncmp(arg, "wide=", 5)) {
u_char t = strtoul (arg+5, (char**)0, 0);
if (t<=1) {
user.data = t;
user.cmd = UC_SETWIDE;
};
};
if (!strncmp(arg, "tags=", 5)) {
u_char t = strtoul (arg+5, (char**)0, 0);
if (t<=SCSI_NCR_MAX_TAGS) {
@ -770,6 +757,14 @@ void do_set (char * arg)
};
};
if (!strncmp(arg, "flags=", 6)) {
u_char t = strtoul (arg+6, (char**)0, 0);
if (t<=0xff) {
user.data = t;
user.cmd = UC_SETFLAG;
};
};
if (!strncmp(arg, "debug=", 6)) {
user.data = strtoul (arg+6, (char**)0, 0);
user.cmd = UC_SETDEBUG;
@ -784,12 +779,12 @@ void do_set (char * arg)
user.data = M_SIMPLE_TAG;
user.cmd = UC_SETORDER;
};
if (!strcmp(arg, "orderedwrite")) {
user.data = 0;
user.cmd = UC_SETORDER;
};
if (user.cmd) {
openkernelwritefile();
@ -920,7 +915,7 @@ static const char * sn (u_long a)
if ((d=a-offsetof(struct script, msg_sdtr))<m) m=d, s="<msg_sdtr>";
if ((d=a-offsetof(struct script, complete))<m) m=d, s="<complete>";
if ((d=a-offsetof(struct script, cleanup))<m) m=d, s="<cleanup>";
if ((d=a-offsetof(struct script, savepos))<m) m=d, s="<savepos>";
if ((d=a-offsetof(struct script, cleanup0))<m) m=d, s="<cleanup>";
if ((d=a-offsetof(struct script, signal))<m) m=d, s="<signal>";
if ((d=a-offsetof(struct script, save_dp))<m) m=d, s="<save_dp>";
if ((d=a-offsetof(struct script, restore_dp))<m) m=d, s="<restore_dp>";
@ -1221,7 +1216,7 @@ static void dump_lcb (u_long base)
printf ("----------------------\n");
if (!KVM_READ (
(void*)base,
base,
&l,
sizeof (struct lcb))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1242,7 +1237,7 @@ static void dump_lcb (u_long base)
cn++;
printf ("ccb #%d:\n", cn);
if (!KVM_READ (
(void*)cp,
cp,
&c,
sizeof (struct ccb))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1273,10 +1268,12 @@ static void dump_tip (struct tcb * tip)
printf (" transfers:%10d.\n", tip->transfers);
printf (" bytes:%10d.\n", tip->bytes );
printf (" user limits: usrsync=%d usrtags=%d.\n",
tip->usrsync, tip->usrtags);
printf (" user limits: usrsync=%d usrwide=%d usrtags=%d.\n",
tip->usrsync, tip->usrwide, tip->usrtags);
printf (" sync: minsync=%d, maxoffs=%d, period=%d ns, sval=%x.\n",
tip->minsync, tip->maxoffs, tip->period, tip->sval);
printf (" wide: widedone=%d, wval=%x.\n",
tip->widedone, tip->wval);
printf (" hold_cp: %x\n", tip->hold_cp);
dump_link (" jump_tcb", &tip->jump_tcb);
@ -1320,7 +1317,7 @@ static void dump_ncr (void)
struct ncr_reg reg;
if (!KVM_READ (
(void*)ncr.vaddr,
ncr.vaddr,
&reg,
sizeof (reg))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1356,7 +1353,7 @@ static void dump_ncr (void)
u_long startpos;
if (!KVM_READ (
(void*)((u_long)ncr.script
((u_long)ncr.script
+offsetof(struct script, startpos)),
&startpos,
sizeof (startpos))) {
@ -1456,7 +1453,7 @@ do_debug(char * arg)
if (strchr (debug_opt, 'r')) {
struct ncr_reg reg;
if (!KVM_READ (
(void*)ncr.vaddr,
ncr.vaddr,
&reg,
sizeof (reg))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1571,10 +1568,10 @@ void main(argc, argv)
case 'i':
do_info();
break;
case 's':
do_set(optarg);
break;
case 'd':
do_debug(optarg);
break;

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/**************************************************************************
**
** $Id: ncr_reg.h,v 1.1 1994/08/09 22:20:49 mycroft Exp $
** $Id: ncr_reg.h,v 1.2 1994/10/01 06:28:01 mycroft Exp $
**
** Device driver for the NCR 53C810 PCI-SCSI-Controller.
**
@ -42,24 +42,6 @@
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
**-------------------------------------------------------------------------
**
** $Log: ncr_reg.h,v $
** Revision 1.1 1994/08/09 22:20:49 mycroft
** Add NCR 53c8XX driver, originally from Wolfgang Stanglmeier.
**
** Revision 2.0.0.4 94/08/09 23:10:10 wolf
** new message.
**
** Revision 2.0.0.3 94/07/24 08:59:19 wolf
** bits of sstat0 defined.
**
** Revision 2.0 94/07/10 15:53:27 wolf
** FreeBSD release.
**
** Revision 1.0 94/06/07 20:02:21 wolf
** Beta release.
**
***************************************************************************
*/
#ifndef __NCR_REG_H__
@ -75,18 +57,32 @@
struct ncr_reg {
/*00*/ u_char nc_scntl0; /* full arb., ena parity, par->ATN */
/*01*/ u_char nc_scntl1; /* no reset */
#define ISCON 0x10 /* connected to scsi */
#define CRST 0x08 /* force reset */
/*02*/ u_char nc_scntl2; /* no disconnect expected */
#define SDU 0x80 /* cmd: disconnect will raise error */
#define CHM 0x40 /* sta: chained mode */
#define WSS 0x08 /* sta: wide scsi send [W]*/
#define WSR 0x01 /* sta: wide scsi received [W]*/
/*03*/ u_char nc_scntl3; /* cnf system clock dependent */
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define EWS 0x08 /* cmd: enable wide scsi [W]*/
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define RRE 0x40 /* r/w:e enable response to resel. */
#define SRE 0x20 /* r/w:e enable response to select */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*09*/ u_char nc_socl;
#define CREQ 0x80 /* r/w: SCSI-REQ */
#define CACK 0x40 /* r/w: SCSI-ACK */
@ -96,8 +92,11 @@ struct ncr_reg {
#define CMSG 0x04 /* r/w: SCSI-MSG */
#define CC_D 0x02 /* r/w: SCSI-C_D */
#define CI_O 0x01 /* r/w: SCSI-I_O */
/*0a*/ u_char nc_ssid;
/*0b*/ u_char nc_sbcl;
/*0c*/ u_char nc_dstat;
#define DFE 0x80 /* sta: dma fifo empty */
#define MDPE 0x40 /* int: master data parity error */
@ -106,20 +105,28 @@ struct ncr_reg {
#define SSI 0x08 /* int: script: single step */
#define SIR 0x04 /* int: script: interrupt instruct. */
#define IID 0x01 /* int: script: illegal instruct. */
/*0d*/ u_char nc_sstat0;
#define ILF 0x80 /* sta: data in SIDL register */
#define ORF 0x40 /* sta: data in SODR register */
#define OLF 0x20 /* sta: data in SODL register */
#define ILF 0x80 /* sta: data in SIDL register lsb */
#define ORF 0x40 /* sta: data in SODR register lsb */
#define OLF 0x20 /* sta: data in SODL register lsb */
#define AIP 0x10 /* sta: arbitration in progress */
#define LOA 0x08 /* sta: arbitration lost */
#define WOA 0x04 /* sta: arbitration won */
#define IRST 0x02 /* sta: scsi reset signal */
#define SDP 0x01 /* sta: scsi parity signal */
/*0e*/ u_char nc_sstat1;
#define FF3210 0xf0 /* sta: bytes in the scsi fifo */
/*0f*/ u_char nc_sstat2;
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define ILF1 0x80 /* sta: data in SIDL register msb[W]*/
#define ORF1 0x40 /* sta: data in SODR register msb[W]*/
#define OLF1 0x20 /* sta: data in SODL register msb[W]*/
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define CABRT 0x80 /* cmd: abort current operation */
#define SRST 0x40 /* mod: reset chip */
#define SIGP 0x20 /* r/w: message from host to ncr */
@ -128,36 +135,46 @@ struct ncr_reg {
#define INTF 0x04 /* sta: int on the fly (reset by wr)*/
#define SIP 0x02 /* sta: scsi-interupt */
#define DIP 0x01 /* sta: host/script interupt */
/*15*/ u_char nc_15_;
/*16*/ u_char nc_16_;
/*17*/ u_char nc_17_;
/*18*/ u_char nc_ctest0;
/*19*/ u_char nc_ctest1;
/*1a*/ u_char nc_ctest2;
#define CSIGP 0x40
/*1b*/ u_char nc_ctest3;
#define CLF 0x04 /* clear scsi fifo */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*20*/ u_char nc_dfifo;
/*21*/ u_char nc_ctest4;
/*22*/ u_char nc_ctest5;
/*23*/ u_char nc_ctest6;
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*34*/ u_long nc_scratcha; /* ??? Temporary register a */
/*38*/ u_char nc_dmode;
/*39*/ u_char nc_dien;
/*3a*/ u_char nc_dwt;
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
#define SSM 0x10 /* mod: single step mode */
#define STD 0x04 /* cmd: start dma mode */
#define NOCOM 0x01 /* cmd: protect sfbr while reselect */
/*3c*/ u_long nc_adder;
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
#define STO 0x0400/* sta: timeout (select) */
#define GEN 0x0200/* sta: timeout (general) */
#define HTH 0x0100/* sta: timeout (handshake) */
@ -169,34 +186,33 @@ struct ncr_reg {
#define UDC 0x04 /* sta: unexpected disconnect */
#define RST 0x02 /* sta: scsi bus reset detected */
#define PAR 0x01 /* sta: scsi parity error */
/*44*/ u_char nc_slpar;
/*45*/ u_char nc_45_;
/*45*/ u_char nc_swide;
/*46*/ u_char nc_macntl;
/*47*/ u_char nc_gpcntl;
/*48*/ u_char nc_stime0; /* cmd: timeout for select&handshake*/
/*49*/ u_char nc_stime1; /* cmd: timeout user defined */
/*4a*/ u_char nc_respid; /* sta: Reselect-IDs */
/*4b*/ u_char nc_4b_;
/*4a*/ u_short nc_respid; /* sta: Reselect-IDs */
/*4c*/ u_char nc_stest0;
/*4d*/ u_char nc_stest1;
/*4e*/ u_char nc_stest2;
#define ROF 0x40 /* reset scsi offset (after gross error!) */
#define EXT 0x02 /* extended filtering */
/*4f*/ u_char nc_stest3;
#define TE 0x80 /* c: tolerAnt enable */
#define CSF 0x02 /* c: clear scsi fifo */
/*50*/ u_char nc_sidl; /* Lowlevel: latched from scsi data */
/*51*/ u_char nc_51_;
/*52*/ u_char nc_52_;
/*53*/ u_char nc_53_;
/*54*/ u_char nc_sodl; /* Lowlevel: data out to scsi data */
/*55*/ u_char nc_55_;
/*56*/ u_char nc_56_;
/*57*/ u_char nc_57_;
/*58*/ u_char nc_sbdl; /* Lowlevel: data from scsi data */
/*59*/ u_char nc_59_;
/*5a*/ u_char nc_5a_;
/*5b*/ u_char nc_5b_;
/*50*/ u_short nc_sidl; /* Lowlevel: latched from scsi data */
/*52*/ u_short nc_52_;
/*54*/ u_short nc_sodl; /* Lowlevel: data out to scsi data */
/*56*/ u_short nc_56_;
/*58*/ u_short nc_sbdl; /* Lowlevel: data from scsi data */
/*5a*/ u_short nc_5a_;
/*5c*/ u_char nc_scr0; /* Working register B */
/*5d*/ u_char nc_scr1; /* */
/*5e*/ u_char nc_scr2; /* */
@ -368,14 +384,17 @@ struct scr_tblsel {
**-----------------------------------------------------------
*/
#define SCR_REG_OFS(ofs) ((ofs) << 16ul)
#define SCR_SFBR_REG(reg,op,data) \
(0x68000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_SFBR(reg,op,data) \
(0x70000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_REG(reg,op,data) \
(0x78000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_LOAD 0x00000000
#define SCR_SHL 0x01000000
@ -502,9 +521,12 @@ struct scr_tblsel {
#define M_SIMPLE_TAG (0x20)
#define M_HEAD_TAG (0x21)
#define M_ORDERED_TAG (0x22)
#define M_IGN_RESIDUE (0x23)
#define M_IDENTIFY (0x80)
#define M_X_SDTR (0x01)
#define M_X_MODIFY_DP (0x00)
#define M_X_SYNC_REQ (0x01)
#define M_X_WIDE_REQ (0x03)
/*
** Status
@ -520,5 +542,6 @@ struct scr_tblsel {
#define S_TERMINATED (0x20)
#define S_QUEUE_FULL (0x28)
#define S_ILLEGAL (0xff)
#define S_SENSE (0x80)
#endif /*__NCR_REG_H__*/

View File

@ -1,6 +1,6 @@
/**************************************************************************
**
** $Id: ncrreg.h,v 1.1 1994/08/09 22:20:49 mycroft Exp $
** $Id: ncrreg.h,v 1.2 1994/10/01 06:28:01 mycroft Exp $
**
** Device driver for the NCR 53C810 PCI-SCSI-Controller.
**
@ -42,24 +42,6 @@
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
**-------------------------------------------------------------------------
**
** $Log: ncrreg.h,v $
** Revision 1.1 1994/08/09 22:20:49 mycroft
** Add NCR 53c8XX driver, originally from Wolfgang Stanglmeier.
**
** Revision 2.0.0.4 94/08/09 23:10:10 wolf
** new message.
**
** Revision 2.0.0.3 94/07/24 08:59:19 wolf
** bits of sstat0 defined.
**
** Revision 2.0 94/07/10 15:53:27 wolf
** FreeBSD release.
**
** Revision 1.0 94/06/07 20:02:21 wolf
** Beta release.
**
***************************************************************************
*/
#ifndef __NCR_REG_H__
@ -75,18 +57,32 @@
struct ncr_reg {
/*00*/ u_char nc_scntl0; /* full arb., ena parity, par->ATN */
/*01*/ u_char nc_scntl1; /* no reset */
#define ISCON 0x10 /* connected to scsi */
#define CRST 0x08 /* force reset */
/*02*/ u_char nc_scntl2; /* no disconnect expected */
#define SDU 0x80 /* cmd: disconnect will raise error */
#define CHM 0x40 /* sta: chained mode */
#define WSS 0x08 /* sta: wide scsi send [W]*/
#define WSR 0x01 /* sta: wide scsi received [W]*/
/*03*/ u_char nc_scntl3; /* cnf system clock dependent */
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define EWS 0x08 /* cmd: enable wide scsi [W]*/
/*04*/ u_char nc_scid; /* cnf host adapter scsi address */
#define RRE 0x40 /* r/w:e enable response to resel. */
#define SRE 0x20 /* r/w:e enable response to select */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*05*/ u_char nc_sxfer; /* ### Sync speed and count */
/*06*/ u_char nc_sdid; /* ### Destination-ID */
/*07*/ u_char nc_gpreg; /* ??? IO-Pins */
/*08*/ u_char nc_sfbr; /* ### First byte in phase */
/*09*/ u_char nc_socl;
#define CREQ 0x80 /* r/w: SCSI-REQ */
#define CACK 0x40 /* r/w: SCSI-ACK */
@ -96,8 +92,11 @@ struct ncr_reg {
#define CMSG 0x04 /* r/w: SCSI-MSG */
#define CC_D 0x02 /* r/w: SCSI-C_D */
#define CI_O 0x01 /* r/w: SCSI-I_O */
/*0a*/ u_char nc_ssid;
/*0b*/ u_char nc_sbcl;
/*0c*/ u_char nc_dstat;
#define DFE 0x80 /* sta: dma fifo empty */
#define MDPE 0x40 /* int: master data parity error */
@ -106,20 +105,28 @@ struct ncr_reg {
#define SSI 0x08 /* int: script: single step */
#define SIR 0x04 /* int: script: interrupt instruct. */
#define IID 0x01 /* int: script: illegal instruct. */
/*0d*/ u_char nc_sstat0;
#define ILF 0x80 /* sta: data in SIDL register */
#define ORF 0x40 /* sta: data in SODR register */
#define OLF 0x20 /* sta: data in SODL register */
#define ILF 0x80 /* sta: data in SIDL register lsb */
#define ORF 0x40 /* sta: data in SODR register lsb */
#define OLF 0x20 /* sta: data in SODL register lsb */
#define AIP 0x10 /* sta: arbitration in progress */
#define LOA 0x08 /* sta: arbitration lost */
#define WOA 0x04 /* sta: arbitration won */
#define IRST 0x02 /* sta: scsi reset signal */
#define SDP 0x01 /* sta: scsi parity signal */
/*0e*/ u_char nc_sstat1;
#define FF3210 0xf0 /* sta: bytes in the scsi fifo */
/*0f*/ u_char nc_sstat2;
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define ILF1 0x80 /* sta: data in SIDL register msb[W]*/
#define ORF1 0x40 /* sta: data in SODR register msb[W]*/
#define OLF1 0x20 /* sta: data in SODL register msb[W]*/
/*10*/ u_long nc_dsa; /* --> Base page */
/*14*/ u_char nc_istat; /* --> Main Command and status */
#define CABRT 0x80 /* cmd: abort current operation */
#define SRST 0x40 /* mod: reset chip */
#define SIGP 0x20 /* r/w: message from host to ncr */
@ -128,36 +135,46 @@ struct ncr_reg {
#define INTF 0x04 /* sta: int on the fly (reset by wr)*/
#define SIP 0x02 /* sta: scsi-interupt */
#define DIP 0x01 /* sta: host/script interupt */
/*15*/ u_char nc_15_;
/*16*/ u_char nc_16_;
/*17*/ u_char nc_17_;
/*18*/ u_char nc_ctest0;
/*19*/ u_char nc_ctest1;
/*1a*/ u_char nc_ctest2;
#define CSIGP 0x40
/*1b*/ u_char nc_ctest3;
#define CLF 0x04 /* clear scsi fifo */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*1c*/ u_long nc_temp; /* ### Temporary stack */
/*20*/ u_char nc_dfifo;
/*21*/ u_char nc_ctest4;
/*22*/ u_char nc_ctest5;
/*23*/ u_char nc_ctest6;
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*24*/ u_long nc_dbc; /* ### Byte count and command */
/*28*/ u_long nc_dnad; /* ### Next command register */
/*2c*/ u_long nc_dsp; /* --> Script Pointer */
/*30*/ u_long nc_dsps; /* --> Script pointer save/opcode#2 */
/*34*/ u_long nc_scratcha; /* ??? Temporary register a */
/*38*/ u_char nc_dmode;
/*39*/ u_char nc_dien;
/*3a*/ u_char nc_dwt;
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
/*3b*/ u_char nc_dcntl; /* --> Script execution control */
#define SSM 0x10 /* mod: single step mode */
#define STD 0x04 /* cmd: start dma mode */
#define NOCOM 0x01 /* cmd: protect sfbr while reselect */
/*3c*/ u_long nc_adder;
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
/*40*/ u_short nc_sien; /* -->: interupt enable */
/*42*/ u_short nc_sist; /* <--: interupt status */
#define STO 0x0400/* sta: timeout (select) */
#define GEN 0x0200/* sta: timeout (general) */
#define HTH 0x0100/* sta: timeout (handshake) */
@ -169,34 +186,33 @@ struct ncr_reg {
#define UDC 0x04 /* sta: unexpected disconnect */
#define RST 0x02 /* sta: scsi bus reset detected */
#define PAR 0x01 /* sta: scsi parity error */
/*44*/ u_char nc_slpar;
/*45*/ u_char nc_45_;
/*45*/ u_char nc_swide;
/*46*/ u_char nc_macntl;
/*47*/ u_char nc_gpcntl;
/*48*/ u_char nc_stime0; /* cmd: timeout for select&handshake*/
/*49*/ u_char nc_stime1; /* cmd: timeout user defined */
/*4a*/ u_char nc_respid; /* sta: Reselect-IDs */
/*4b*/ u_char nc_4b_;
/*4a*/ u_short nc_respid; /* sta: Reselect-IDs */
/*4c*/ u_char nc_stest0;
/*4d*/ u_char nc_stest1;
/*4e*/ u_char nc_stest2;
#define ROF 0x40 /* reset scsi offset (after gross error!) */
#define EXT 0x02 /* extended filtering */
/*4f*/ u_char nc_stest3;
#define TE 0x80 /* c: tolerAnt enable */
#define CSF 0x02 /* c: clear scsi fifo */
/*50*/ u_char nc_sidl; /* Lowlevel: latched from scsi data */
/*51*/ u_char nc_51_;
/*52*/ u_char nc_52_;
/*53*/ u_char nc_53_;
/*54*/ u_char nc_sodl; /* Lowlevel: data out to scsi data */
/*55*/ u_char nc_55_;
/*56*/ u_char nc_56_;
/*57*/ u_char nc_57_;
/*58*/ u_char nc_sbdl; /* Lowlevel: data from scsi data */
/*59*/ u_char nc_59_;
/*5a*/ u_char nc_5a_;
/*5b*/ u_char nc_5b_;
/*50*/ u_short nc_sidl; /* Lowlevel: latched from scsi data */
/*52*/ u_short nc_52_;
/*54*/ u_short nc_sodl; /* Lowlevel: data out to scsi data */
/*56*/ u_short nc_56_;
/*58*/ u_short nc_sbdl; /* Lowlevel: data from scsi data */
/*5a*/ u_short nc_5a_;
/*5c*/ u_char nc_scr0; /* Working register B */
/*5d*/ u_char nc_scr1; /* */
/*5e*/ u_char nc_scr2; /* */
@ -368,14 +384,17 @@ struct scr_tblsel {
**-----------------------------------------------------------
*/
#define SCR_REG_OFS(ofs) ((ofs) << 16ul)
#define SCR_SFBR_REG(reg,op,data) \
(0x68000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_SFBR(reg,op,data) \
(0x70000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_REG_REG(reg,op,data) \
(0x78000000 | (REG(reg) << 16ul) | (op) | ((data)<<8ul))
(0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
#define SCR_LOAD 0x00000000
#define SCR_SHL 0x01000000
@ -502,9 +521,12 @@ struct scr_tblsel {
#define M_SIMPLE_TAG (0x20)
#define M_HEAD_TAG (0x21)
#define M_ORDERED_TAG (0x22)
#define M_IGN_RESIDUE (0x23)
#define M_IDENTIFY (0x80)
#define M_X_SDTR (0x01)
#define M_X_MODIFY_DP (0x00)
#define M_X_SYNC_REQ (0x01)
#define M_X_WIDE_REQ (0x03)
/*
** Status
@ -520,5 +542,6 @@ struct scr_tblsel {
#define S_TERMINATED (0x20)
#define S_QUEUE_FULL (0x28)
#define S_ILLEGAL (0xff)
#define S_SENSE (0x80)
#endif /*__NCR_REG_H__*/

View File

@ -1,6 +1,6 @@
/**************************************************************************
**
** $Id: ncrstat.c,v 1.2 1994/08/11 04:54:13 mycroft Exp $
** $Id: ncrstat.c,v 1.3 1994/10/01 06:28:02 mycroft Exp $
**
** Utility for NCR 53C810 device driver.
**
@ -43,39 +43,6 @@
**
**
**-------------------------------------------------------------------------
**
** $Log: ncrstat.c,v $
** Revision 1.2 1994/08/11 04:54:13 mycroft
** Make this work.
**
** Revision 2.0.0.6 94/08/10 19:36:32 wolf
** Multiple "-s" options per line supported.
** Ported to NetBSD.
**
** Revision 2.0.0.5 94/08/09 23:10:20 wolf
** new message.
**
** Revision 2.0.0.4 94/08/08 19:10:28 wolf
** struct script left outside struct ncb.
** (must fit in one physical page)
**
** Revision 2.0.0.3 94/08/05 18:44:43 wolf
** adapted to ncr.c 2.0.0.8
** (script now inside control structure)
**
** Revision 2.0.0.2 94/07/22 16:57:34 wolf
** New option "-n#": get the script label of an address.
**
** Revision 2.0.0.1 94/07/19 22:25:05 wolf
** hexadecimal args.
**
** Revision 2.0 94/07/10 19:01:30 wolf
** FreeBSD release.
**
** Revision 1.1 94/06/25 17:18:11 wolf
** Initial revision
**
***************************************************************************
*/
#include <sys/file.h>
@ -88,24 +55,20 @@
#include <errno.h>
#include <paths.h>
#include <limits.h>
#include <kvm.h>
#include <i386/pci/ncr.c>
/*
** used external functions
*/
#ifdef __NetBSD__
#include <kvm.h>
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
kvm_t *kvm;
#define KVM_NLIST(n) (kvm_nlist(kvm, (n)) >= 0)
#define KVM_READ(o, p, l) (kvm_read(kvm, (o), (p), (l)) == (l))
#define KVM_READ(o, p, l) (kvm_read(kvm, (o), (void*)(p), (l)) == (l))
#else
extern int kvm_openfiles();
extern int kvm_nlist();
extern char* kvm_geterr();
extern int kvm_read();
#define KVM_NLIST(n) (kvm_nlist((n)) >= 0)
#define KVM_READ(o, p, l) (kvm_read((o), (p), (l)) == (l))
#define KVM_READ(o, p, l) (kvm_read((void*)(o), (p), (l)) == (l))
#endif
extern void exit();
@ -176,7 +139,7 @@ read_ccb(u_long base)
{
ccb_base = base;
if (!KVM_READ (
(void*)base,
base,
&ccb,
sizeof (struct ccb))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, base);
@ -188,7 +151,7 @@ read_lcb(u_long base)
{
lcb_base = base;
if (!KVM_READ (
(void*)base,
base,
&lcb,
sizeof (struct lcb))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, base);
@ -199,7 +162,7 @@ read_lcb(u_long base)
read_ncr()
{
if (!KVM_READ (
(void*)ncr_base,
ncr_base,
&ncr,
sizeof (ncr))) {
fprintf (stderr, "%s: bad kvm read at %x.\n", prog, ncr_base);
@ -211,13 +174,13 @@ void open_kvm(int flags)
{
int i;
u_long kernel_version;
#ifdef __NetBSD__
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
char errbuf[_POSIX2_LINE_MAX];
#endif
if (kvm_isopen) return;
#ifdef __NetBSD__
#if defined(__NetBSD__) || (__FreeBSD__ >= 2)
kvm = kvm_openfiles(vmunix, kmemf, NULL, flags, errbuf);
if (kvm == NULL) {
fprintf(stderr, "%s: kvm_openfiles: %s\n", prog, errbuf);
@ -244,7 +207,7 @@ void open_kvm(int flags)
}
if (!KVM_READ (
(void*)nl[N_NCR_VERSION].n_value,
nl[N_NCR_VERSION].n_value,
&kernel_version,
sizeof (kernel_version))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -260,7 +223,7 @@ void open_kvm(int flags)
#ifdef __NetBSD__
if (!KVM_READ (
(void*)nl[N_NCRCD].n_value,
nl[N_NCRCD].n_value,
&ncrcd,
sizeof (ncrcd))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -274,7 +237,7 @@ void open_kvm(int flags)
};
if (!KVM_READ (
(void*)ncrcd.cd_devs+4*ncr_unit,
ncrcd.cd_devs+4*ncr_unit,
&ncr_base,
sizeof (ncr_base))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -290,7 +253,7 @@ void open_kvm(int flags)
#else /* !__NetBSD__ */
if (!KVM_READ (
(void*)nl[N_NNCR].n_value,
nl[N_NNCR].n_value,
&ncr_units,
sizeof (ncr_units))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -304,7 +267,7 @@ void open_kvm(int flags)
};
if (!KVM_READ (
(void*)nl[N_NCRP].n_value+4*ncr_unit,
nl[N_NCRP].n_value+4*ncr_unit,
&ncr_base,
sizeof (ncr_base))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -379,7 +342,7 @@ do_info(void)
set_target_mask();
printf ("T:L Vendor Device Rev Speed Max Tags\n");
printf ("T:L Vendor Device Rev Speed Max Wide Tags\n");
for (t=0; t<MAX_TARGET;t++) {
if (!((target_mask>>t)&1)) continue;
tip = &ncr.target[t];
@ -426,6 +389,20 @@ do_info(void)
};
read_lcb ((u_long) tip->lp[l]);
switch (tip->widedone) {
case 1:
printf (" 8");
break;
case 2:
printf (" 16");
break;
case 3:
printf (" 32");
break;
default:
printf (" ?");
};
if (lcb.usetags)
printf ("%5d", lcb.actlink);
else
@ -681,7 +658,7 @@ u_char in (u_char reg)
{
u_char res;
if (!KVM_READ (
(void*)(ncr.vaddr + reg),
(ncr.vaddr + reg),
&res,
1)) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -710,7 +687,7 @@ void do_set (char * arg)
for (i=3; i; i--) {
if (!KVM_READ (
(void*)(addr),
(addr),
&user,
sizeof (user))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -734,6 +711,8 @@ void do_set (char * arg)
"sync=value: set the maximal synchronous transfer rate (MHz).\n"
"fast: set FAST SCSI-2.\n"
"\n"
"wide=value: set the bus width (0=8bit 1=16bit).\n"
"\n"
"tags=value: use this number of tags.\n"
"orderedtag: use ordered tags only.\n"
"simpletag: use simple tags only.\n"
@ -762,6 +741,14 @@ void do_set (char * arg)
};
};
if (!strncmp(arg, "wide=", 5)) {
u_char t = strtoul (arg+5, (char**)0, 0);
if (t<=1) {
user.data = t;
user.cmd = UC_SETWIDE;
};
};
if (!strncmp(arg, "tags=", 5)) {
u_char t = strtoul (arg+5, (char**)0, 0);
if (t<=SCSI_NCR_MAX_TAGS) {
@ -770,6 +757,14 @@ void do_set (char * arg)
};
};
if (!strncmp(arg, "flags=", 6)) {
u_char t = strtoul (arg+6, (char**)0, 0);
if (t<=0xff) {
user.data = t;
user.cmd = UC_SETFLAG;
};
};
if (!strncmp(arg, "debug=", 6)) {
user.data = strtoul (arg+6, (char**)0, 0);
user.cmd = UC_SETDEBUG;
@ -784,12 +779,12 @@ void do_set (char * arg)
user.data = M_SIMPLE_TAG;
user.cmd = UC_SETORDER;
};
if (!strcmp(arg, "orderedwrite")) {
user.data = 0;
user.cmd = UC_SETORDER;
};
if (user.cmd) {
openkernelwritefile();
@ -920,7 +915,7 @@ static const char * sn (u_long a)
if ((d=a-offsetof(struct script, msg_sdtr))<m) m=d, s="<msg_sdtr>";
if ((d=a-offsetof(struct script, complete))<m) m=d, s="<complete>";
if ((d=a-offsetof(struct script, cleanup))<m) m=d, s="<cleanup>";
if ((d=a-offsetof(struct script, savepos))<m) m=d, s="<savepos>";
if ((d=a-offsetof(struct script, cleanup0))<m) m=d, s="<cleanup>";
if ((d=a-offsetof(struct script, signal))<m) m=d, s="<signal>";
if ((d=a-offsetof(struct script, save_dp))<m) m=d, s="<save_dp>";
if ((d=a-offsetof(struct script, restore_dp))<m) m=d, s="<restore_dp>";
@ -1221,7 +1216,7 @@ static void dump_lcb (u_long base)
printf ("----------------------\n");
if (!KVM_READ (
(void*)base,
base,
&l,
sizeof (struct lcb))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1242,7 +1237,7 @@ static void dump_lcb (u_long base)
cn++;
printf ("ccb #%d:\n", cn);
if (!KVM_READ (
(void*)cp,
cp,
&c,
sizeof (struct ccb))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1273,10 +1268,12 @@ static void dump_tip (struct tcb * tip)
printf (" transfers:%10d.\n", tip->transfers);
printf (" bytes:%10d.\n", tip->bytes );
printf (" user limits: usrsync=%d usrtags=%d.\n",
tip->usrsync, tip->usrtags);
printf (" user limits: usrsync=%d usrwide=%d usrtags=%d.\n",
tip->usrsync, tip->usrwide, tip->usrtags);
printf (" sync: minsync=%d, maxoffs=%d, period=%d ns, sval=%x.\n",
tip->minsync, tip->maxoffs, tip->period, tip->sval);
printf (" wide: widedone=%d, wval=%x.\n",
tip->widedone, tip->wval);
printf (" hold_cp: %x\n", tip->hold_cp);
dump_link (" jump_tcb", &tip->jump_tcb);
@ -1320,7 +1317,7 @@ static void dump_ncr (void)
struct ncr_reg reg;
if (!KVM_READ (
(void*)ncr.vaddr,
ncr.vaddr,
&reg,
sizeof (reg))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1356,7 +1353,7 @@ static void dump_ncr (void)
u_long startpos;
if (!KVM_READ (
(void*)((u_long)ncr.script
((u_long)ncr.script
+offsetof(struct script, startpos)),
&startpos,
sizeof (startpos))) {
@ -1456,7 +1453,7 @@ do_debug(char * arg)
if (strchr (debug_opt, 'r')) {
struct ncr_reg reg;
if (!KVM_READ (
(void*)ncr.vaddr,
ncr.vaddr,
&reg,
sizeof (reg))) {
fprintf (stderr, "%s: bad kvm read.\n", prog);
@ -1571,10 +1568,10 @@ void main(argc, argv)
case 'i':
do_info();
break;
case 's':
do_set(optarg);
break;
case 'd':
do_debug(optarg);
break;