#ifndef _SSERVICE_H
#define _SSERVICE_H
#ifdef __cplusplus
extern "C" {
#endif
typedef int(f_tt)(int, ...);
#define SS_GetAdapter 0
#define SS_GetPage 1
#define SS_GetSocket 2
#define SS_GetStatus 3
#define SS_GetWindow 4
#define SS_InquireAdapter 5
#define SS_InquireSocket 6
#define SS_InquireWindow 7
#define SS_ResetSocket 8
#define SS_SetPage 9
#define SS_SetAdapter 10
#define SS_SetSocket 11
#define SS_SetWindow 12
#define SS_SetIRQHandler 13
#define SS_ClearIRQHandler 14
#define CSGetActiveDip 98
#define CSInitDev 99
#define CSRegister 100
#define CSCISInit 101
#define CSUnregister 102
#define CISGetAddress 103
#define CISSetAddress 104
#define CSCardRemoved 105
#define CSGetCookiesAndDip 106
#define SUCCESS 0x00
#define BAD_ADAPTER 0x01
#define BAD_ATTRIBUTE 0x02
#define BAD_BASE 0x03
#define BAD_EDC 0x04
#define BAD_IRQ 0x06
#define BAD_OFFSET 0x07
#define BAD_PAGE 0x08
#define READ_FAILURE 0x09
#define BAD_SIZE 0x0a
#define BAD_SOCKET 0x0b
#define BAD_TYPE 0x0d
#define BAD_VCC 0x0e
#define BAD_VPP 0x0f
#define BAD_WINDOW 0x11
#define WRITE_FAILURE 0x12
#define NO_CARD 0x14
#define BAD_FUNCTION 0x15
#define BAD_MODE 0x16
#define BAD_SPEED 0x17
#define BUSY 0x18
#define NO_RESOURCE 0x20
#define PCE_CARD_REMOVAL 0
#define PCE_CARD_INSERT 1
#define PCE_CARD_READY 2
#define PCE_CARD_BATTERY_WARN 3
#define PCE_CARD_BATTERY_DEAD 4
#define PCE_CARD_STATUS_CHANGE 5
#define PCE_CARD_WRITE_PROTECT 6
#define PCE_CARD_RESET 7
#define PCE_CARD_UNLOCK 8
#define PCE_CLIENT_INFO 9
#define PCE_EJECTION_COMPLETE 10
#define PCE_EJECTION_REQUEST 11
#define PCE_ERASE_COMPLETE 12
#define PCE_EXCLUSIVE_COMPLETE 13
#define PCE_EXCLUSIVE_REQUEST 14
#define PCE_INSERTION_COMPLETE 15
#define PCE_INSERTION_REQUEST 16
#define PCE_REGISTRATION_COMPLETE 17
#define PCE_RESET_COMPLETE 18
#define PCE_RESET_PHYSICAL 19
#define PCE_RESET_REQUEST 20
#define PCE_TIMER_EXPIRED 21
#define PCE_PM_RESUME 22
#define PCE_PM_SUSPEND 23
#define PCE_SS_INIT_STATE 24
#define PCE_ADD_SOCKET 25
#define PCE_DROP_SOCKET 26
#define PCE_DEV_IDENT 30
#define PCE_INIT_DEV 31
#define PCE_E2M(event) (1 << (event))
#define CS_EVENT(event, socket, arg) (*pcmcia_cs_event) (event, socket, arg)
#define PCE_SS_STATE_INIT 0x0001
#define PCE_SS_STATE_DEINIT 0x0002
typedef struct csregister {
uint32_t cs_magic;
uint32_t cs_version;
int (*cs_card_services)(int, ...);
f_tt *cs_event;
} csregister_t;
typedef struct get_adapter {
unsigned state;
irq_t SCRouting;
} get_adapter_t;
#define IRQ_ENABLE 0x8000
typedef struct get_page {
unsigned window;
unsigned page;
unsigned state;
off_t offset;
} get_page_t;
#define PS_ATTRIBUTE 0x01
#define PS_ENABLED 0x02
#define PS_WP 0x04
#define PS_IO 0x08
typedef struct get_socket {
unsigned socket;
unsigned SCIntMask;
unsigned VccLevel;
unsigned Vpp1Level;
unsigned Vpp2Level;
unsigned state;
unsigned CtlInd;
irq_t IRQRouting;
unsigned IFType;
} get_socket_t;
typedef struct get_ss_status {
unsigned socket;
unsigned CardState;
unsigned SocketState;
unsigned CtlInd;
irq_t IRQRouting;
unsigned IFType;
} get_ss_status_t;
#define SBM_WP 0x01
#define SBM_LOCKED 0x02
#define SBM_EJECT 0x04
#define SBM_INSERT 0x08
#define SBM_BVD1 0x10
#define SBM_BVD2 0x20
#define SBM_RDYBSY 0x40
#define SBM_CD 0x80
#define SBM_LOCK 0x10
#define SBM_BATT 0x20
#define SBM_BUSY 0x40
#define SBM_XID 0x80
typedef uint32_t speed_t;
typedef struct get_window {
unsigned window;
unsigned socket;
unsigned size;
unsigned state;
uint_t speed;
uint_t base;
ddi_acc_handle_t handle;
} get_window_t;
#define WS_IO 0x01
#define WS_ENABLED 0x02
#define WS_16BIT 0x04
#define WS_PAGED 0x80
#define WS_EISA 0x10
#define WS_CENABLE 0x20
#define WS_EXACT_MAPIN 0x40
typedef struct inquire_adapter {
unsigned NumSockets;
unsigned NumWindows;
unsigned NumEDCs;
unsigned AdpCaps;
irq_t ActiveHigh;
irq_t ActiveLow;
int NumPower;
struct power_entry {
unsigned PowerLevel;
unsigned ValidSignals;
} *power_entry;
int NumInterrupts;
struct intr_entry {
int pri;
int intr;
} *AvailInterrupts;
uint_t ResourceFlags;
} inquire_adapter_t;
#define VCC 0x80
#define VPP1 0x40
#define VPP2 0x20
#define V_MASK (VCC|VPP1|VPP2)
#define RES_OWN_IRQ 0x0001
#define RES_OWN_IO 0x0002
#define RES_OWN_MEM 0x0004
#define RES_IRQ_NEXUS 0x0008
#define RES_IRQ_SHAREABLE 0x0010
typedef struct inquire_socket {
unsigned socket;
unsigned SCIntCaps;
unsigned SCRptCaps;
unsigned CtlIndCaps;
unsigned SocketCaps;
irq_t ActiveHigh;
irq_t ActiveLow;
} inquire_socket_t;
typedef struct memwin_char {
unsigned MemWndCaps;
baseaddr_t FirstByte;
baseaddr_t LastByte;
unsigned MinSize;
unsigned MaxSize;
unsigned ReqGran;
unsigned ReqBase;
unsigned ReqOffset;
unsigned Slowest;
unsigned Fastest;
} mem_win_char_t;
typedef struct iowin_char {
unsigned IOWndCaps;
baseaddr_t FirstByte;
baseaddr_t LastByte;
unsigned MinSize;
unsigned MaxSize;
unsigned ReqGran;
unsigned AddrLines;
unsigned EISASlot;
} iowin_char_t;
typedef struct inquire_window {
unsigned window;
unsigned WndCaps;
socket_enum_t Sockets;
mem_win_char_t mem_win_char;
iowin_char_t iowin_char;
} inquire_window_t;
#define IF_CARDBUS 0x00
#define IF_IO 0x01
#define IF_MEMORY 0x02
#define IF_TYPE_MASK 0x03
#define DREQ_MASK 0x0c
#define DREQ_NONE 0x00
#define DREQ_SPKR 0x04
#define DREQ_IOIS16 0x08
#define DREQ_INPACK 0x0c
#define DMA_CHAN_MASK 0xf0
#define DMA_GET_CHAN(x) (((x) >> 4) & 0xF)
#define DMA_SET_CHAN(x, y) (((x) & 0xF) | ((y) & ~DMA_CHAN_MASK))
#define IF_CB 0x04
#define IF_DMA 0x08
#define IF_VSKEY 0x10
#define IF_33VC 0x20
#define IF_XXVCC 0x40
#define PC_PAGESIZE 0x4000
#define WC_IO 0x0004
#define WC_WAIT 0x0080
#define WC_COMMON 0x0001
#define WC_ATTRIBUTE 0x0002
#define WC_BASE 0x0001
#define WC_SIZE 0x0002
#define WC_WENABLE 0x0004
#define WC_8BIT 0x0008
#define WC_16BIT 0x0010
#define WC_BALIGN 0x0020
#define WC_POW2 0x0040
#define WC_CALIGN 0x0080
#define WC_PAVAIL 0x0100
#define WC_PSHARED 0x0200
#define WC_PENABLE 0x0400
#define WC_WP 0x0800
#define WC_INPACK 0x0080
#define WC_EISA 0x0100
#define WC_CENABLE 0x0200
#define WC_IO_RANGE_PER_WINDOW 0x8000
typedef struct set_page {
unsigned window;
unsigned page;
unsigned state;
off_t offset;
} set_page_t;
typedef struct set_socket {
unsigned socket;
unsigned SCIntMask;
unsigned Vcontrol;
unsigned VccLevel;
unsigned Vpp1Level;
unsigned Vpp2Level;
unsigned State;
unsigned CtlInd;
irq_t IREQRouting;
unsigned IFType;
} set_socket_t;
#define VCTL_CISREAD 0x01
#define VCTL_OVERRIDE 0x02
typedef struct set_irq_handler {
unsigned socket;
unsigned irq;
unsigned handler_id;
f_tt *handler;
void *arg1;
void *arg2;
ddi_iblock_cookie_t *iblk_cookie;
ddi_idevice_cookie_t *idev_cookie;
} set_irq_handler_t;
#define IRQ_ANY 0x0
#define PRIORITY_LOW 0x00
#define PRIORITY_HIGH 0x10
typedef struct clear_irq_handler {
unsigned socket;
unsigned handler_id;
f_tt *handler;
} clear_irq_handler_t;
typedef struct set_window {
unsigned window;
unsigned socket;
unsigned WindowSize;
unsigned state;
unsigned speed;
uint_t base;
ddi_acc_handle_t handle;
dev_info_t *child;
ddi_device_acc_attr_t attr;
} set_window_t;
typedef
struct ss_make_device_node {
uint32_t flags;
dev_info_t *dip;
char *name;
char *slot;
char *busaddr;
int spec_type;
int minor_num;
char *node_type;
} ss_make_device_node_t;
#define SS_CSINITDEV_CREATE_DEVICE 0x01
#define SS_CSINITDEV_REMOVE_DEVICE 0x02
#define SS_CSINITDEV_USE_SLOT 0x04
#define SS_CSINITDEV_USE_BUSADDR 0x08
#define SS_CSINITDEV_MORE_DEVICES 0x10
#define SS_CSINITDEV_SEND_DEV_EVENT 0x10
typedef struct csss_adapter_info_t {
char name[MODMAXNAMELEN];
int major;
int minor;
int number;
int num_sockets;
int first_socket;
} csss_adapter_info_t;
typedef struct get_cookies_and_dip_t {
unsigned socket;
dev_info_t *dip;
ddi_iblock_cookie_t *iblock;
ddi_idevice_cookie_t *idevice;
csss_adapter_info_t adapter_info;
} get_cookies_and_dip_t;
#define RESET_MODE_FULL 0
#define RESET_MODE_CARD_ONLY 1
typedef
union sservice {
get_adapter_t get_adapter;
get_page_t get_page;
get_socket_t get_socket;
get_window_t get_window;
get_ss_status_t get_ss_status;
inquire_adapter_t inquire_adapter;
inquire_socket_t inquire_socket;
inquire_window_t inquire_window;
set_page_t set_page;
set_socket_t set_socket;
set_irq_handler_t set_irq_handler;
set_window_t set_window;
get_cookies_and_dip_t get_cookies;
ss_make_device_node_t make_device;
} sservice_t;
struct pcm_make_dev {
int socket;
int flags;
int op;
dev_t dev;
int type;
char driver[MODMAXNAMELEN];
char path[MAXPATHLEN];
};
#define PCM_EVENT_MORE 0x0001
#ifdef _KERNEL
#include <sys/sunndi.h>
int pcmcia_attach(dev_info_t *, struct pcmcia_adapter_nexus_private *);
int pcmcia_ctlops(dev_info_t *, dev_info_t *, ddi_ctl_enum_t, void *, void *);
int pcmcia_prop_op(dev_t, dev_info_t *, dev_info_t *, ddi_prop_op_t,
int, char *, caddr_t, int *);
int pcmcia_intr_ops(dev_info_t *dip, dev_info_t *rdip, ddi_intr_op_t intr_op,
ddi_intr_handle_impl_t *hdlp, void *result);
int pcmcia_open(dev_t *, int, int, cred_t *);
int pcmcia_close(dev_t, int, int, cred_t *);
int pcmcia_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
int pcmcia_power(dev_info_t *, int, int);
void pcmcia_begin_resume(dev_info_t *);
void pcmcia_wait_insert(dev_info_t *);
typedef struct ra_return {
uint_t ra_addr_hi;
uint_t ra_addr_lo;
uint_t ra_len;
} ra_return_t;
int pcmcia_alloc_mem(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
dev_info_t **);
int pcmcia_alloc_io(dev_info_t *, ndi_ra_request_t *, ra_return_t *,
dev_info_t **);
int pcmcia_free_mem(dev_info_t *, ra_return_t *);
int pcmcia_free_io(dev_info_t *, ra_return_t *);
int pcmcia_map_reg(dev_info_t *, dev_info_t *, ra_return_t *,
uint32_t, caddr_t *, ddi_acc_handle_t *,
ddi_device_acc_attr_t *, uint32_t);
int pcmcia_bus_map(dev_info_t *, dev_info_t *, ddi_map_req_t *,
off_t, off_t, caddr_t *);
#endif
#ifdef __cplusplus
}
#endif
#endif