Files
Arquivotheca.AIX-4.1.3/bos/kernel/sys/POWER/mpqpdd.h
seta75D d6fe8fe829 Init
2021-10-11 22:19:34 -03:00

803 lines
31 KiB
C

/* @(#)46 1.48.1.5 src/bos/kernel/sys/POWER/mpqpdd.h, sysxmpqp, bos411, 9434B411a 8/22/94 16:35:37 */
#ifndef _H_MPQPDD
#define _H_MPQPDD
/*---------------------------------------------------------------------------
*
* COMPONENT_NAME: (MPQP) Multiprotocol Quad Port Device Driver
*
* FUNCTIONS: mpqpdd.h - MPQP device driver internal header file
*
* ORIGINS: 27
*
* IBM CONFIDENTIAL -- (IBM Confidential Restricted when
* combined with the aggregated modules for this product)
* SOURCE MATERIALS
* (C) COPYRIGHT International Business Machines Corp. 1990
* All Rights Reserved
*
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*
*---------------------------------------------------------------------------
*/
#include <sys/listmgr.h>
#include <sys/intr.h>
#include <sys/types.h>
#include <sys/listmgr.h>
#include <sys/lockl.h>
#ifdef _POWER_MP
#include <sys/lock_def.h>
#include <sys/lock_alloc.h>
#include <sys/lockname.h>
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ Define the locking MACROs for the MPQP Device Driver ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
#define MPQP_LOCK_DISABLE(lvl,lock) lvl=disable_lock(INTCLASS1, lock)
#define MPQP_UNLOCK_ENABLE(lvl,lock) unlock_enable(lvl, lock)
#define MPQP_SIMPLE_LOCK(lock) simple_lock(lock)
#define MPQP_SIMPLE_UNLOCK(lock) simple_unlock(lock)
#endif /* _POWER_MP */
/**************************************************************************
* Multi Protocol Quad Port Device Driver Defines *
**************************************************************************/
#define ACMD_ACQ (unsigned short)0
#define IO_SEG_REG 0x000c0020
#define MAX_ADAPTERS 8 /* number of adapters supported */
#define NUM_PORTS 4 /* number of ports supported */
#define NUM_SLOTS 8 /* number of slots supported */
#define MAX_BUSES 2 /* number of buses supported */
#define NUM_MPQP_TCWS 64 /* number of TCWs per MPQP adapter */
#define NUM_RECV_TCWS 16 /* number of receive TCWs per MPQP */
#define NUM_XMIT_TCWS 48 /* number of transmit TCWs per MPQP */
#define NUM_PORT_TCWS 12 /* number of xmit TCWs per port */
#define N_TXFREE 52 /* */
#define TX_SHORT_MAX 48 /* max # bytes in TX SHORT */
#define POS0 0x100 /* POS Register 0 IOCC offset */
#define P0_F 0x70 /* POS Card ID low, MPQP */
#define POS1 0x101 /* POS Register 1 IOCC offset */
#define P1_F 0x8F /* POS1 Card ID high, MPQP */
#define POS2 0x102 /* POS Register 2 IOCC offset */
#define P2_ENABLE 0x01 /* -sleep/+ENABLE */
#define P2_INT3 0x00 /* interrupt level 3 mask */
#define P2_INT4 0x02 /* interrupt level 4 mask */
#define P2_INT7 0x04 /* interrupt level 7 mask */
#define P2_INT9 0x06 /* interrupt level 9 mask */
#define P2_INT10 0x08 /* interrupt level 10 mask */
#define P2_INT11 0x0A /* interrupt level 11 mask */
#define P2_INT12 0x0C /* interrupt level 12 mask */
#define P2_SYNC_CHCK 0x80 /* Channel Check Mode = Sync */
#define POS3 0x103 /* POS Register 3 IOCC offset */
#define POS4 0x104 /* POS Register 4 IOCC offset */
#define P4_WSIZ_8K 0x00 /* POS4 Window Size 8K */
#define P4_WSIZ_16K 0x20 /* POS4 Window Size 16K */
#define P4_WSIZ_32K 0x40 /* POS4 Window Size 32K */
#define P4_WSIZ_64K 0x60 /* POS4 Window Size 64K */
#define P4_WSIZ_128K 0x80 /* POS4 Window Size 128K */
#define P4_WSIZ_512K 0xA0 /* POS4 Window Size 512K */
#define P4_WSIZ_1M 0xC0 /* POS4 Window Size 1M */
#define P4_WSIZ_2M 0xE0 /* POS4 Window Size 2M */
#define POS5 0x105 /* POS Register 5 IOCC offset */
#define P5_FAIRNESS 0x01 /* POS5 Fairness Enable */
#define P5_PAREN 0x20 /* POS5 Data Parity Enable */
#define P5_CHCKS 0x40 /* POS5 I/O Channel Check Status */
#define P5_CHCKI 0x80 /* POS5 I/O Channel Check Indicator */
#define POS6 0x106 /* POS Register 6 IOCC offset */
#define POS7 0x107 /* POS Register 7 IOCC offset */
#define WINDOW_SIZE 0x10000 /* adapter window size, 64K */
/*******************************************************************
* I/O Register Offsets from start of I/O Memory or DREG Values *
******************************************************************/
#define LOCREG0 0x00 /* Location Register 0 (LOCREG0) */
#define LOCREG1 0x01 /* Location Register 1 (LOCREG1) */
#define PTRREG 0x02 /* Pointer Register (PTRREG) */
#define DREG 0x03 /* Data Register (DREG) */
#define TASKREG 0x04 /* Mailbox Register (TASKREG) */
#define CPUPAGE 0x05 /* CPU Page Register (CPUPAGE) */
#define COMREG 0x06 /* Command Register (COMREG) */
#define PROCSYNC 0x07 /* Processor Ownership Register */
#define INITREG2 0x08 /* Init. Register 2 (INITREG2) */
#define INTCOM 0x09 /* Adapter Interrupt (INTREG) */
#define PCPAR0 0x0A /* Parity Register 0 (PCPAR0) */
#define PCPAR1 0x0B /* Parity Register 1 (PCPAR1) */
#define GAID 0x0F /* Gate Array ID (GAID) */
#define INITREG1 0x10 /* Init. Register 1 (INITREG1) */
#define PCPAR2 0x11 /* Parity Register 2 (PCPAR2) */
#define INITREG0 0x12 /* Init. Register 0 (INITREG0) */
#define INITREG3 0x13 /* Init. Register 3 (INITREG3) */
#define PCCSTAT 0x14 /* CHCK Status Reg. (PCCSTAT) */
#define CAD_EN 0x15 /* Host Reset Enable (CAD_EN) */
/**************************************************************************
* MPQP PCPAR2 VALUES *
**************************************************************************/
#define PCP2_SYNC_CHCK 0x40 /* Synchronous IOCHCK .PCPAR2 */
#define PCP2_EN_CHCK 0x20 /* Enable IOCHCK .PCPAR2 */
/**************************************************************************
* MPQP GAID VALUES *
**************************************************************************/
#define GA_CNTNDR_3 0x80 /* GAID, Contender 3 .GAID */
#define GA_CNTNDR_4 0x81 /* GAID, Contender 4 .GAID */
#define GA_CNTNDR_5 0x82 /* GAID, Contender 5 .GAID */
/**************************************************************************
* MPQP COMREG VALUES *
**************************************************************************/
#define COM_RC 0x01 /* Reset Card .COMREG */
#define COM_IE 0x10 /* Interrupt Enable .COMREG */
#define COM_IP 0x20 /* Interrupt Pending .COMREG */
/**************************************************************************
* MPQP TASKREG VALUES *
**************************************************************************/
#define TR_ARQ_I (unsigned char)0x00 /* ARQ Now non-empty (int) */
#define TR_TXFL (unsigned char)0x01 /* Tx Free List non-empty */
#define TR_DMA0 (unsigned char)0x80 /* DMA TX Ack, Port 0 */
#define TR_DMA1 (unsigned char)0x81 /* DMA TX Ack, Port 1 */
#define TR_DMA2 (unsigned char)0x82 /* DMA TX Ack, Port 2 */
#define TR_DMA3 (unsigned char)0x83 /* DMA TX Ack, Port 3 */
#define TR_WDE (unsigned char)0xFE /* Watchdog timer expired */
#define TR_NOI (unsigned char)0xFF /* No interrupt pending */
/***************************************************************************
* Internal Port States...see port_state variable in dds device section *
***************************************************************************/
#define DORMANT_STATE 0x00 /* initial state */
#define OPEN_REQUESTED 0x01 /* Open in progress */
#define OPEN 0x02 /* Port opened */
#define START_REQUESTED 0x03 /* Start in progress */
#define STARTED 0x04 /* Port started */
#define DATA_XFER 0x04 /* Data tranfer state */
#define HALT_REQUESTED 0x05 /* Halt in progress */
#define HALTED 0x02 /* Port halted */
#define CLOSE_REQUESTED 0x07 /* Close requested */
#define CLOSED 0x00 /* Port closed */
/**************************************************************************
* MPQP TRACE HOOK CONSTANTS *
**************************************************************************/
#define PORT_NOT_OPEN 0xfe /* Port State != OPEN */
#define PORT_NOT_STARTED 0xff /* Port State != STARTED */
#define PIN_CODE_FAIL 0x100 /* pincode attempt failed */
#define ADD_ENTRY_FAIL 0x101 /* */
#define PORT_ALRDY_OPEN 0x102 /* */
#define POS_REG_FAIL 0xfa /* */
/**************************************************************************
* MPQP MEMORY PAGE 0 OFFSETS *
**************************************************************************/
#define PCSEL 0x440
#define MAXTASK 0x444
#define MAXPRI 0x445
#define MAXQUEUE 0x446
#define MAXTIME 0x447
#define BCB 0x45A /* Buffer Control Block offset */
#define PSB 0x47C /* Primary Status Byte offset */
/**************************************************************************
* MPQP PSB BIT DEFINITIONS *
**************************************************************************/
#define LOADED (unsigned char)0x01 /* PSB "LOADED" bit */
#define BUSY (unsigned char)0x40 /* PSB "BUSY" bit */
/**************************************************************************
* MPQP POWER ON SELF TEST DEFINITIONS *
**************************************************************************/
#define IF_BLK 0x400 /* Page 0 address, Interface Block*/
#define ERRLOG_PTR 0x14 /* Offset, Error Log for POST */
#define STATOFF 0x7c /* Offset, primary & secondary stat */
#define ROSREADY 0x40 /* ROS Ready Bit, INITREG1 */
/* Port Control Commands */
#define XMIT_SHORT 0x10 /* Transmit Short */
#define XMIT_LONG 0x11 /* Transmit Long */
#define XMIT_GATHER 0x12 /* Transmit Gather */
#define RCV_BUF_INDC 0x13 /* Receive Buffer Indicate */
#define SET_PARAM 0x21 /* Set Parameters */
#define START_PORT 0x22 /* Start Port */
#define STOP_PORT 0x23 /* Stop Port */
#define TERM_PORT 0x24 /* Terminate Port */
#define FLUSH_PORT 0x25 /* Flush Port */
#define QURY_MDM_INT 0x2a /* Query Modem Interrupts */
#define STRT_AUTO_RSP 0x2b /* Start Auto Response */
#define STOP_AUTO_RSP 0x2c /* Stop Auto Response */
#define CHG_PARAM 0x2d /* Change Parameters */
/* Port Command Modifiers */
#define ADAP_TX_ACK 0x80 /* Tx ack for Transmit command */
#define ADAP_TRANSP 0x40 /* Transparent mode */
#define ADAP_DMA_ACK 0x01 /* DMA ack for Transmit command */
/* Adapter Commands */
# define HALT_RECV 0x30 /* Halt frame reception */
# define START_RECV 0x31 /* Start frame reception */
/* Adapter Constants */
#define ADAP_TX_AREA 0x50000 /* Adapter TX buffer area */
#define ADAP_BUF_SIZE 4096 /* Size of TX and RX buffers */
/*------------------------------------------------------------------------*/
/* Adapter Reset: */
/*------------------------------------------------------------------------*/
# define RESET_TIMEOUT 8 /* eight seconds */
# define DL_DELAY_REG 0xE0 /* hardware delay register */
/* Adapter States: */
# define UNKNOWN 0 /* adapter is in an unknown state */
# define RESET 1 /* adapter has been reset */
# define INITIALIZED 2 /* adapter is reset and initialized */
# define RESETTING 3 /* adapter is being reset */
# define SUSPENDED 0x80 /* adapter is waiting for command blocks */
/*------------------------------------------------------------------------*/
/* MPQP Threshold Defaults */
/*------------------------------------------------------------------------*/
# define ERRTHRESH 1 /* log every error */
# define THRESHPERCENT 0 /* log every error */
/*------------------------------------------------------------------------*/
/* Queue definitions: */
/*------------------------------------------------------------------------*/
typedef struct {
unsigned char length; /* length of queue */
unsigned char end; /* last element of queue */
unsigned char out; /* first item to remove */
unsigned char in; /* last item inserted */
unsigned long q_elem[ 1 ]; /* queue elements */
} queue_t;
typedef queue_t long_queue_t;
typedef struct {
unsigned char length; /* length of queue */
unsigned char end; /* last element of queue */
unsigned char out; /* first item to remove */
unsigned char in; /* last item inserted */
unsigned char q_elem[ 1 ]; /* queue elements */
} byte_queue_t;
/*------------------------------------------------------------------------*/
/* Transmit/Receive Map definition: */
/*------------------------------------------------------------------------*/
typedef struct {
struct mbuf *p_mbuf; /* pointer to associated mbuf */
char *p_data; /* data starts here */
unsigned long bus_addr; /* bus address of data */
} recv_map_t;
typedef struct {
int map_free; /* TRUE if map is free */
unsigned long write_id; /* write ID of last write */
struct mbuf *m; /* mbuf to free */
char *dma_addr; /* page to DMA */
unsigned long bus_addr; /* bus address page */
unsigned long flags; /* saved write flags */
} xmit_map_t;
/*------------------------------------------------------------------------*/
/* Device Definitions Structure: */
/*------------------------------------------------------------------------*/
typedef struct MPQDDS
{
struct DDS_HDW
{
unsigned int slot_num; /* slot number of adapter */
unsigned int bus_intr_lvl; /* interrupt level */
unsigned short intr_priority; /* interrupt priority */
unsigned short dma_lvl; /* this is the bus arbitration level */
/* for this adapter */
unsigned int bus_io_addr; /* base of Bus I/O area for this */
/* adapter */
unsigned int bus_mem_addr; /* base of Bus Memory "Shared" */
/* addressability for this adapter */
unsigned int tcw_bus_mem_addr; /* base of Bus Memory DMA */
/* addressability for this adapter */
unsigned long bus_id; /* bus id */
} dds_hdw;
struct DDS_DVC
{
unsigned char port_num; /* Port Number for this port */
unsigned char port_state; /* Port State */
unsigned short rdto; /* Receive Data Transfer Offset */
int net_id; /* Network ID */
unsigned short max_rx_bsiz; /* maximum receive buffer size */
} dds_dvc;
struct DDS_RAS
{
t_cio_stats cio_stats; /* threshold accumulators */
t_err_threshold err_thresh; /* threshold values - set by app. */
} dds_ras;
struct DDS_VPD
{
unsigned short card_id; /* Card ID...POS0 & POS1 */
unsigned short ver_num; /* Version Number */
char devname[16]; /* logical device name */
char adpt_name[16]; /* logical adpater name */
} dds_vpd;
struct DDS_WRK
{
/* transmit map table: */
xmit_map_t xmit_map_table[ NUM_PORT_TCWS ];
unsigned short xmit_enabled; /* transmit enable flag */
unsigned short cmd_seq_num; /* sequence number of command */
unsigned short cur_chan_num; /* current channel number */
unsigned char num_starts; /* number of starts issued on port */
/* incremented by successful ioctl */
/* with CIO_START operator. */
/* decremented by successful ioctl */
/* with CIO_HALT operator. */
unsigned char xmt_ld_flg; /* flag indicating that the transmit */
/* chain has been loaded... */
t_chan_info *p_chan_info[MAX_CHAN]; /* open/select info */
unsigned char modem_intr_mask;
unsigned char phys_link;
unsigned char field_select;
unsigned char dial_proto;
unsigned char dial_flags;
unsigned char data_proto;
unsigned char data_flags;
unsigned char modem_flags;
unsigned char poll_addr;
unsigned char select_addr;
unsigned char baud_rate;
unsigned char modem_status;
unsigned short rcv_timeout;
unsigned char cmd_avail_flag;
struct trb *ndelay_timer;
unsigned int ndelay_timer_pop;
int halt_sleep_event;
int sleep_on_halt;
int buff_ctr; /* rx buffer counter */
union
{
t_x21_data x21_data;
t_auto_data auto_data;
} t_dial;
} dds_wrk;
} t_mpqp_dds;
/*------------------------------------------------------------------------*/
/* Adapter Command Block definition: */
/*------------------------------------------------------------------------*/
typedef struct {
unsigned char type; /* Command Type */
unsigned char port; /* Port Number */
unsigned short sequence; /* Sequence Number */
unsigned short length; /* Length of data */
unsigned short flags; /* Control flags */
unsigned char *host_addr; /* Host address of data */
unsigned char *card_addr; /* Card address of data */
union { /* COMMAND SPECIFIC: */
/* TX Short Data */
unsigned char data[ TX_SHORT_MAX ];
struct { /* Set Parm */
unsigned char field_sel; /* field select */
unsigned char modem_int; /* modem interupt */
unsigned char phys_link; /* physical link */
unsigned char poll_addr; /* poll address */
unsigned char select_addr; /* select address */
unsigned char dial_proto; /* autodial protocol */
unsigned char dial_flags; /* dial flags */
unsigned char data_proto; /* data protocol */
unsigned short data_flags; /* data flags */
unsigned short recv_timer; /* receive timer */
unsigned short baud_rate; /* baud rate */
} set_parm;
struct autoresp { /* Auto Response */
unsigned char time_hi; /* Time, High */
unsigned char time_lo; /* Time, Low */
unsigned char address; /* TX/RX Address */
unsigned char xmit_ctrl; /* transmit control */
unsigned char recv_ctrl; /* receive control */
unsigned char unused;
} auto_resp;
struct autodial { /* Auto Dial */
unsigned char modem_flags; /* modem flags */
unsigned char unused;
unsigned short rdto; /* Rcvd Data Transfer Offset */
unsigned short connect_timer; /* time to wait for DSR */
unsigned short v25b_tx_timer; /* wait time to xfer data */
unsigned short max_rx_bsiz; /* Maximum receive buffer size*/
} auto_dial;
struct {
unsigned char parm; /* Command parameter */
unsigned char filler; /* Not used */
unsigned short RDTO; /* Receive data offset */
unsigned short filler1; /* time to wait for DSR */
unsigned short filler2; /* wait time to xfer data */
unsigned short max_rx_bsiz; /* Maximum receive buffer size*/
} start_port;
} cs;
} adap_cmd_t;
/*------------------------------------------------------------------------*/
/* Offlevel Interrupt definition: */
/*------------------------------------------------------------------------*/
typedef struct OFFL_INTR
{
struct intr offl_intr; /* system wide bit */
struct t_acb *p_acb_intr; /* pointer to acb for i_sched */
} t_offl_intr;
/*-----------------------------------------------------------------------*/
/* Junk definitions (to be thrown out) */
/*-----------------------------------------------------------------------*/
#define SET_CPUPAGE( p, s, v ) {\
if ( p->cpu_page != v )\
{\
p->cpu_page = v;\
PIO_PUTC( (unsigned long)(p->io_base) | s + CPUPAGE, v);\
}}
#define SET_ACMDREG( p, s, v ) {\
if ( p->adap_cmd_reg != v )\
{\
p->adap_cmd_reg = v;\
PIO_PUTS( (unsigned long)(p->p_adap_cmd_reg) | s, v );\
}}
/*
* Old MPQP Byte and Word queue structure types:
*/
typedef struct
{
unsigned char length; /* length of queue */
unsigned char end; /* last element of queue */
unsigned char out; /* first item to remove */
unsigned char in; /* last item inserted */
unsigned char bqueue[1]; /* byte queue elements */
}t_byte_queue;
typedef struct
{
unsigned char length; /* length of queue */
unsigned char end; /* last element of queue */
unsigned char out; /* first item to remove */
unsigned char in; /* last item inserted */
unsigned int wqueue[1]; /* word queue elements */
}t_word_queue;
/*
* Old Adapter Command Block
*/
typedef struct ADCMDB
{
unsigned char cmd_typ; /* diagnostic command */
unsigned char port_nmbr; /* port number for command */
unsigned short seq_num; /* command sequence number */
unsigned short rsrvd_1; /* filler */
unsigned char lngth; /* byte length for data */
unsigned char cntrl; /* control information */
char *p_edrr; /* pointer to response region */
unsigned int rsrvd_2; /* filler */
union
{
struct
{
char data[48]; /* data area associated with */
/* this command. */
}d_ovl;
struct
{
unsigned int tst_addr;
unsigned short tst_length;
unsigned char cntl;
unsigned char fyller[41];
}c_ovl;
}u_data_area;
}t_adap_cmd;
/*------------------------------------------------------------------------*/
/* Adapter Control Block definition: */
/*------------------------------------------------------------------------*/
typedef struct ACB
{
struct intr slih_intr; /* interrupt handler structure */
t_offl_intr offl; /* offlevel interrupt structure */
t_offl_intr dmaoffl; /* dma offlevel intr structure */
int rasw_sleep; /* reload adapter software sleep cell */
char *p_dma_tst_buf; /* pointer to test for bus master dma */
unsigned int arb_lvl; /* MicroChannel Arbitration Level */
unsigned int int_lvl; /* interrupt level this adapter */
/* responds to */
unsigned int int_pri; /* interrupt priority */
unsigned int offl_lvl; /* offlevel level for interrupts */
/* from this adapter */
unsigned int offl_pri; /* offlevel priority */
int txfl_event_lst; /* transmit free list event list */
unsigned char pos0; /* POS Register 0 Value */
unsigned char pos1; /* POS Register 1 Value */
unsigned char pos2; /* POS Register 2 Value */
unsigned char pos3; /* POS Register 3 Value */
unsigned char pos4; /* POS Register 4 Value */
unsigned char pos5; /* POS Register 5 Value */
unsigned char pos6; /* POS Register 6 Value */
unsigned char pos7; /* POS Register 7 Value */
unsigned char slot_num; /* slot number adapter is in */
unsigned char adapter_state; /* 0 - uninitialized */
/* 1 - initialization begun */
/* 2 - initialization complete */
/* 3 - reset requested */
/* 0x80 - Suspended: Or Mask */
unsigned char diag_flag; /* 0 - no diagnostic mode */
/* 1 - diagnostic open requested*/
/* 2 - opened for diagnostics */
/* Note: value of 1 set in */
/* mpqmpx on request for open */
/* and value of two set in */
/* mpqopen upon successful open */
/* for diagnostics. */
unsigned char asw_load_flag; /* 0 - Adapter software is not */
/* loaded */
/* 1 - Load completed */
/* 0xff - locked */
unsigned char cur_intr_val; /* current interrupt value */
unsigned char n_cfg_ports; /* number of ports configured */
/* on this adapter */
unsigned char n_open_ports; /* number of ports opened on */
/* this adapter */
unsigned char ds_base_page; /* CPUPAGE value for data struct-*/
/* ures on adapter */
unsigned char cpu_page; /* BUSIO Addr - 5 */
/* cpu_page is a copy of the */
/* last value written in shared */
/* memory of the adapter. */
unsigned char num_starts; /* aggregate number of starts */
/* on this adapter. incremented */
/* on successful start, decremented */
/* on successful halt. used to */
/* determine when to allocate and */
/* deallocate receive mbuf/tcw(s)*/
unsigned char rcv_buf_ind_snt;/* receive buffer indicates sent */
/* to the adapter...this flag */
/* should be set when the first */
/* successful start port takes */
/* place and reset when adapter */
/* software is reloaded */
unsigned char adap_cmd_que_in;/* index to the next place to */
/* receive a command number in */
/* the adapter command queue */
lock_t cmd_queue_lock; /* lock to access cmd queue */
unsigned short adap_cmd_reg; /* adap_cmd_reg is a copy of the */
/* last value written in shared */
/* memory of the adapter. */
int dma_channel_id; /* DMA Channel ID returned from */
/* d_init call */
unsigned long io_base; /* base io address */
unsigned long mem_base; /* base memory address */
unsigned long dma_base; /* base address of bus memory */
/* for this adapter, set in */
/* mpqconfig */
unsigned long io_segreg_val; /* Segment register value for */
/* io space indicator */
unsigned long iocc_segreg_val;/* Segment register value for */
/* iocc space indicator */
t_mpqp_dds *p_port_dds[NUM_PORTS]; /* an array of pointers to */
/* device data structures */
/* for all the ports for */
/* this current adapter */
t_byte_queue *p_txfree_q; /* pointer to the transmit free */
/* buffer queue data structure */
t_byte_queue *p_adap_cmd_que; /* pointer to the adapter com- */
/* mand queue data structure */
t_word_queue *p_adap_rsp_que; /* pointer to the adapter re- */
/* sponse queue data structure */
unsigned short *p_adap_cmd_reg; /* pointer the the adapter command */
/* register */
unsigned short *p_num_cmd; /* pointer to number of commands */
unsigned short *p_num_rcv_buf; /* pointer to number of receive */
/* buffers */
unsigned short *p_rcv_buf_siz; /* pointer to receive buffer size */
unsigned short *p_rcv_buf_para_num; /* pointer to receive buffer */
/* paragraph number (addr) */
unsigned short *p_num_xmit_buf; /* pointer to number of xmit */
/* buffers */
unsigned short *p_xmit_buf_siz; /* pointer to xmit buffer size */
unsigned short *p_xmit_buf_para_num; /* pointer to xmit buffer */
/* paragraph number (addr) */
/* Per port pointer to extended */
unsigned char *p_edrr[NUM_PORTS];
/* diagnostic response region */
unsigned char *p_adap_trc_data; /* pointer to adapter trace data */
/* pointer to port trace data */
unsigned char *p_port_trc_data[NUM_PORTS];
t_adap_cmd *p_cmd_blk; /* pointer to an array of adapter */
/* command block data structures */
/* local TX free buffer queue */
t_byte_queue *p_lcl_txfree_buf_q;
/* Receive map table */
recv_map_t recv_map_table[ NUM_RECV_TCWS ];
unsigned short recv_enabled; /* receive enable flag */
struct mbreq mbuf_req; /* mbuf requirements */
unsigned int c_rcv; /* receive count */
unsigned long c_intr_rcvd; /* interrupt counter */
unsigned char dma_sched; /* flag for dma sched pending */
unsigned char arq_sched; /* flag for arq sched pending */
struct trb *sleep_timer; /* timer structure for sleep */
unsigned int sleep_timer_pop;/* timer pop flag */
unsigned short halt_complete; /* indicator if HALT sequence */
/* is completed any port */
} t_acb;
/**************************************************************************
* MPQP MACRO DEFINITIONS *
**************************************************************************/
/* Little Endian <--> Big Endian conversion: */
# define SWAPSHORT(x) (((((unsigned short)(x)) & 0xFF) << 8) | \
(((unsigned short)(x)) >> 8))
# define SWAPLONG(x) (((((unsigned long)(x)) & 0xFF) << 24) | \
((((unsigned long)(x)) & 0xFF00) << 8) | \
((((unsigned long)(x)) & 0xFF0000) >> 8) | \
((((unsigned long)(x)) & 0xFF000000) >> 24))
/*----------------------------------------------------------------------*/
/* M_INPAGE for checking funky mbufs */
/* This macro determines if the data portion of an mbuf resides within */
/* one page -- if TRUE is returned, the data does not cross a page */
/* boundary. If FALSE is returned, the data does cross a page */
/* boundary and cannot be d_mastered. */
/*----------------------------------------------------------------------*/
# define M_INPAGE(m) ((((int)MTOD((m), uchar *) \
& ~(PAGESIZE - 1)) + PAGESIZE) > \
((int)MTOD((m), uchar *) + (m)->m_len))
/*------------------------------------------------------------------------*/
/* DDS Accessors: */
/*------------------------------------------------------------------------*/
# define DVC p_dds->dds_dvc
# define HDW p_dds->dds_hdw
# define WRK p_dds->dds_wrk
/*------------------------------------------------------------------------*/
/* Receive/Transmit Map Definitions: */
/*------------------------------------------------------------------------*/
# define XMITMAP (WRK.xmit_map_table)
# define RECVMAP (p_acb->recv_map_table)
/*------------------------------------------------------------------------*/
/* RQE definitions: */
/*------------------------------------------------------------------------*/
/* RQE Types: */
# define XMIT_COMPLETE 0x0 /* Transmit complete */
# define RECV_COMPLETE_DMA 0x1 /* Receive complete, DMA */
# define COMMAND_SUCCESS 0x2 /* Command complete, success */
# define SOL_STATUS 0x3 /* Solicited status */
# define FATAL_ERROR 0x6 /* Adapter error, fatal */
# define XMIT_ERROR 0x8 /* Transmit error */
# define RECV_COMPLETE 0x9 /* Recv complete, no DMA */
# define COMMAND_FAILURE 0xA /* Command complete, failure */
# define UNSOL_STATUS 0xB /* Unsolicited status */
# define RECOV_ERROR 0xE /* Adapter error, recoverable */
# define DIAGNOSTIC_ERROR 0xF /* Diagnostic error */
/* These RQE field accessors are to be used on RQE's that have */
/* already been swapped during read from the adapter (as done */
/* by the adapter queue routines): */
# define RQE_TYPE(rqe) (((rqe) >> 4 ) & 0x0F)
# define RQE_PORT(rqe) ((rqe) & 0x0F)
# define RQE_COMMAND(rqe) ((unsigned char)((rqe) >> 8))
# define RQE_SEQUENCE(rqe) ((unsigned short)((rqe) >> 16))
# define RQE_STATUS(rqe) ((unsigned short)((rqe) >> 16))
# define RQE_XESTATUS(rqe) ((unsigned char)((rqe) >> 8))
/*------------------------------------------------------------------------*/
/* These BUS accessors are PIO-recovery versions of the original BUS */
/* accessor macros. The essential difference is that retries are */
/* performed if pio errors occur; if the retry limit is exceeded, a -1 */
/* is returned (hence all return an int value). In the cases of */
/* PIO_GETL and PIO_GETLR, the -1 is indistinguishable from all FF's so */
/* some heuristic must be used to determine if it is an error (i.e., is */
/* all FF's a legitimate read value?). */
/*------------------------------------------------------------------------*/
# define C 1 /* Character type of PIO access */
# define S 2 /* Short type of PIO access */
# define SR 3 /* Short-reversed type of PIO access */
# define L 4 /* Long type of PIO access */
# define LR 5 /* Long-reverse type of PIO access */
# define PIO_GETC( a ) ((int) PioGet( a, C ))
# define PIO_GETS( a ) ((int) PioGet( a, S ))
# define PIO_GETL( a ) ((int) PioGet( a, L ))
# define PIO_GETSR( a ) ((int) PioGet( a, SR ))
# define PIO_GETLR( a ) ((int) PioGet( a, LR ))
# define PIO_PUTC( a, v ) ((int) PioPut( a, v, C ))
# define PIO_PUTS( a, v ) ((int) PioPut( a, v, S ))
# define PIO_PUTL( a, v ) ((int) PioPut( a, v, L ))
# define PIO_PUTSR( a, v ) ((int) PioPut( a, v, SR ))
# define PIO_PUTLR( a, v ) ((int) PioPut( a, v, LR ))
# define PIO_GETSTR( d, s, l ) ((int) PioBusCopy( d, s, l ))
# define PIO_PUTSTR( d, s, l ) ((int) PioBusCopy( d, s, l ))
# define PIO_XCHGC( a, v ) ((int) PioXchgC( a, v ))
# define PIO_RETRY_COUNT 3
/*------------------------------------------------------------------------*/
/* Queue Macros: */
/*------------------------------------------------------------------------*/
# define NEXT_IN( p_q ) \
(((p_q)->in == ((p_q)->end)) ? 0 : ((p_q)->in + 1))
# define NEXT_OUT( p_q ) \
(((p_q)->out == ((p_q)->end)) ? 0 : ((p_q)->out + 1))
# define Q_FULL( p_q ) \
((p_q)->out == NEXT_IN( p_q ))
# define Q_EMPTY( p_q ) \
((p_q)->out == (p_q)->in)
#endif /* _H_MPQPDD */