#ifndef _SYS_ZSDEV_H
#define _SYS_ZSDEV_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/spl.h>
#include <sys/ksynch.h>
#include <sys/dditypes.h>
#include <sys/ser_zscc.h>
#ifdef _MACHDEP
#include <sys/zsmach.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _MACHDEP
#define ZSDELAY()
#define ZSFLUSH()
#define ZSNEXTPOLL(zscurr)
#endif
#define OUTLINE ((minor_t)1 << (NBITSMINOR32 - 1))
#define UNIT(x) (getminor(x) & ~OUTLINE)
#define ZSWR1_INIT (ZSWR1_SIE|ZSWR1_TIE|ZSWR1_RIE)
extern int zs_usec_delay;
#define ZS_REG_SIZE (2 * sizeof (struct zscc_device))
#define PCLK (19660800/4)
#define SDLCFLAG 0x7E
#define ZS_ON (ZSWR5_DTR|ZSWR5_RTS)
#define ZS_OFF 0
#define DMSET 0
#define DMBIS 1
#define DMBIC 2
#define DMGET 3
#define SCC_WRITEA(reg, val) { \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr | ZSOFF))->zscc_control = reg; \
ZSDELAY(); \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr | ZSOFF))->zscc_control = val; \
ZSDELAY(); \
zs->zs_wreg[reg] = val; \
}
#define SCC_WRITEB(reg, val) { \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr & ~ZSOFF))->zscc_control = reg; \
ZSDELAY(); \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr & ~ZSOFF))->zscc_control = val; \
ZSDELAY(); \
zs->zs_wreg[reg] = val; \
}
#define SCC_WRITE(reg, val) { \
zs->zs_addr->zscc_control = reg; \
ZSDELAY(); \
zs->zs_addr->zscc_control = val; \
ZSDELAY(); \
zs->zs_wreg[reg] = val; \
}
#define SCC_READA(reg, var) { \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr | ZSOFF))->zscc_control = reg; \
ZSDELAY(); \
var = ((struct zscc_device *) \
((uintptr_t)zs->zs_addr | ZSOFF))->zscc_control; \
ZSDELAY(); \
}
#define SCC_READB(reg, var) { \
((struct zscc_device *) \
((uintptr_t)zs->zs_addr & ~ZSOFF))->zscc_control = reg; \
ZSDELAY(); \
var = ((struct zscc_device *) \
((uintptr_t)zs->zs_addr & ~ZSOFF))->zscc_control; \
ZSDELAY(); \
}
#define SCC_READ(reg, var) { \
register struct zscc_device *tmp; \
tmp = zs->zs_addr; \
tmp->zscc_control = reg; \
ZSDELAY(); \
var = tmp->zscc_control; \
ZSDELAY(); \
}
#define SCC_BIS(reg, val) { \
zs->zs_addr->zscc_control = reg; \
ZSDELAY(); \
zs->zs_addr->zscc_control = zs->zs_wreg[reg] |= val; \
ZSDELAY(); \
}
#define SCC_BIC(reg, val) { \
zs->zs_addr->zscc_control = reg; \
ZSDELAY(); \
zs->zs_addr->zscc_control = zs->zs_wreg[reg] &= ~val; \
ZSDELAY(); \
}
#define SCC_WRITE0(val) { \
zs->zs_addr->zscc_control = val; \
ZSDELAY(); \
ZSFLUSH(); \
}
#define SCC_WRITEDATA(val) { \
zs->zs_addr->zscc_data = val; \
ZSDELAY(); \
ZSFLUSH(); \
}
#define SCC_READ0() zs->zs_addr->zscc_control
#define SCC_READDATA() zs->zs_addr->zscc_data
struct zsops {
void (*zsop_txint)();
void (*zsop_xsint)();
void (*zsop_rxint)();
void (*zsop_srint)();
int (*zsop_softint)();
int (*zsop_suspend)();
int (*zsop_resume)();
};
#define ZS_MAX_PRIV_STR 800
struct zscom {
void (*zs_txint)();
unsigned char *zs_wr_cur;
unsigned char *zs_wr_lim;
void (*zs_rxint)();
unsigned char *zs_rd_cur;
unsigned char *zs_rd_lim;
struct zscc_device *zs_addr;
void (*zs_xsint)();
void (*zs_srint)();
int (*zs_suspend)();
int (*zs_resume)();
uchar_t zs_wreg[16];
caddr_t zs_priv;
struct zsops *zs_ops;
dev_info_t *zs_dip;
dev_info_t *zs_hdlc_dip;
time_t zs_dtrlow;
short zs_unit;
uchar_t zs_suspended;
struct zs_prog *zs_prog_save;
struct zscom *zs_next;
struct zscom *zs_back;
kmutex_t *zs_excl_hi;
kmutex_t *zs_excl;
kmutex_t *zs_ocexcl;
kcondvar_t zs_flags_cv;
ulong_t zs_priv_str[ZS_MAX_PRIV_STR];
uint_t zs_flags;
kstat_t *intrstats;
timeout_id_t zs_timer;
};
#define ZS_NEEDSOFT 0x00000001
#define ZS_PROGRESS 0x00000002
#define ZS_CLOSING 0x00000004
#define ZS_CLOSED 0x00000008
#ifdef _KERNEL
#define ZS_H_LOG_MAX 0x8000
extern kmutex_t zs_soft_lock;
extern int zssoftpend;
extern ddi_softintr_t zs_softintr_id;
#define ZSSETSOFT(zs) { \
zs->zs_flags |= ZS_NEEDSOFT; \
if (!zssoftpend) { \
zssoftpend = 1; \
ddi_trigger_softintr(zs_softintr_id); \
} \
}
#endif
#define ZS_PL ipltospl(SPL3)
#define ZS_PL_HI ipltospl(SPLTTY)
struct zs_prog {
struct zscom *zs;
uchar_t flags;
uchar_t wr4;
uchar_t wr11;
uchar_t wr12;
uchar_t wr13;
uchar_t wr3;
uchar_t wr5;
uchar_t wr15;
};
#define ZSP_SYNC 01
#define ZSP_NRZI 02
#define ZSP_PLL 04
#define ZSP_LOOP 010
#define ZSP_PARITY_SPECIAL 020
#define ZSP_ECHO 040
extern void zsa_init(struct zscom *zs);
extern int zsmctl(struct zscom *zs, int bits, int how);
extern void zs_program(struct zs_prog *zspp);
extern void zsopinit(struct zscom *zs, struct zsops *zso);
extern void setzssoft(void);
extern dev_info_t *zs_get_dev_info(dev_t dev, int otyp);
extern char *zssoftCAR;
extern int nzs;
extern struct zscom *zscom;
extern struct zs_prog *zs_prog;
extern kmutex_t zs_curr_lock;
extern struct zsops zsops_null;
extern int zs_drain_check;
#ifdef __cplusplus
}
#endif
#endif