freebsd-nq/sys/i386/scsi/btreg.h

150 lines
5.0 KiB
C
Raw Normal View History

/*
* Written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems for use under the MACH(2.5) operating system.
*
* TRW Financial Systems, in accordance with their agreement with Carnegie
* Mellon University, makes this software available to CMU to distribute
* or use in any manner that they see fit as long as this message is kept with
* the software. For this reason TFS also grants any other persons or
* organizations permission to use or modify this software.
*
* TFS supplies this software to be publicly redistributed
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
* $Id$
*/
#ifndef _BTREG_H_
#define _BTREG_H_
#include "bt.h"
/*
* Mail box defs etc.
* these could be bigger but we need the bt_data to fit on a single page..
*/
#define BT_MBX_SIZE 32 /* mail box size (MAX 255 MBxs) */
/* don't need that many really */
#define BT_CCB_MAX 32 /* store up to 32CCBs at any one time */
/* in bt742a H/W ( Not MAX ? ) */
#define CCB_HASH_SIZE 32 /* when we have a physical addr. for */
/* a ccb and need to find the ccb in */
/* space, look it up in the hash table */
#define BT_NSEG 33 /*
* Number of SG segments per command
* Max of 2048???
*/
typedef unsigned long int physaddr;
struct bt_scat_gath {
unsigned long seg_len;
physaddr seg_addr;
};
typedef struct bt_mbx_out {
physaddr ccb_addr;
unsigned char dummy[3];
unsigned char cmd;
} BT_MBO;
typedef struct bt_mbx_in {
physaddr ccb_addr;
unsigned char btstat;
unsigned char sdstat;
unsigned char dummy;
unsigned char stat;
} BT_MBI;
struct bt_mbx {
BT_MBO mbo[BT_MBX_SIZE];
#define BT_MBO_FREE 0x0 /* MBO intry is free */
#define BT_MBO_START 0x1 /* MBO activate entry */
#define BT_MBO_ABORT 0x2 /* MBO abort entry */
BT_MBI mbi[BT_MBX_SIZE];
#define BT_MBI_FREE 0x0 /* MBI entry is free */
#define BT_MBI_OK 0x1 /* completed without error */
#define BT_MBI_ABORT 0x2 /* aborted ccb */
#define BT_MBI_UNKNOWN 0x3 /* Tried to abort invalid CCB */
#define BT_MBI_ERROR 0x4 /* Completed with error */
BT_MBO *tmbo; /* Target Mail Box out */
BT_MBI *tmbi; /* Target Mail Box in */
};
struct bt_ccb {
unsigned char opcode;
#define BT_INITIATOR_CCB 0x00 /* SCSI Initiator CCB */
#define BT_TARGET_CCB 0x01 /* SCSI Target CCB */
#define BT_INIT_SCAT_GATH_CCB 0x02 /* SCSI Initiator w/sg */
#define BT_RESET_CCB 0x81 /* SCSI Bus reset */
unsigned char:3, data_in:1, data_out:1,:3;
unsigned char scsi_cmd_length;
unsigned char req_sense_length;
unsigned long data_length;
physaddr data_addr;
unsigned char dummy[2];
unsigned char host_stat;
#define BT_OK 0x00 /* cmd ok */
#define BT_LINK_OK 0x0a /* Link cmd ok */
#define BT_LINK_IT 0x0b /* Link cmd ok + int */
#define BT_SEL_TIMEOUT 0x11 /* Selection time out */
#define BT_OVER_UNDER 0x12 /* Data over/under run */
#define BT_BUS_FREE 0x13 /* Bus dropped at unexpected time */
#define BT_INV_BUS 0x14 /* Invalid bus phase/sequence */
#define BT_BAD_MBO 0x15 /* Incorrect MBO cmd */
#define BT_BAD_CCB 0x16 /* Incorrect ccb opcode */
#define BT_BAD_LINK 0x17 /* Not same values of LUN for links */
#define BT_INV_TARGET 0x18 /* Invalid target direction */
#define BT_CCB_DUP 0x19 /* Duplicate CCB received */
#define BT_INV_CCB 0x1a /* Invalid CCB or segment list */
#define BT_ABORTED 42 /* pseudo value from driver */
unsigned char target_stat;
unsigned char target;
unsigned char lun;
unsigned char scsi_cmd[12]; /* 12 bytes (bytes only) */
unsigned char dummy2[1];
unsigned char link_id;
physaddr link_addr;
physaddr sense_ptr;
struct scsi_sense_data scsi_sense;
struct bt_scat_gath scat_gath[BT_NSEG];
struct bt_ccb *next;
struct scsi_xfer *xfer; /* the scsi_xfer for this cmd */
struct bt_mbx_out *mbx; /* pointer to mail box */
int flags;
#define CCB_FREE 0
#define CCB_ACTIVE 1
#define CCB_ABORTED 2
struct bt_ccb *nexthash; /* if two hash the same */
physaddr hashkey; /*physaddr of this ccb */
};
struct bt_data {
int bt_base; /* base port for each board */
struct bt_mbx bt_mbx; /* all our mailboxes */
struct bt_ccb *bt_ccb_free; /* list of free CCBs */
struct bt_ccb *ccbhash[CCB_HASH_SIZE]; /* phys to kv hash */
int bt_int; /* int. read off board */
int bt_dma; /* DMA channel read of board */
int bt_scsi_dev; /* adapters scsi id */
int numccbs; /* how many we have malloc'd */
int bt_bounce; /* should we bounce? */
int unit; /* The zero in bt0 */
struct scsi_link sc_link; /* prototype for devs */
};
extern struct bt_data *btdata[NBT];
extern u_long bt_unit;
struct bt_data *bt_alloc __P((int unit, u_long iobase));
void bt_free __P((struct bt_data *bt));
void bt_intr __P((void *arg));
int bt_init __P((struct bt_data *bt));
int bt_attach __P((struct bt_data *bt));
#endif /* _BT_H_ */