/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1989-1994,1997-1998,2000 by Sun Microsystems, Inc.
* All rights reserved.
*/
#ifndef _SYS_FDVAR_H
#define _SYS_FDVAR_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef OTYPCNT
#define OTYPCNT 5
#endif
#ifndef NDKMAP
#define NDKMAP 8
#endif
/*
* Compile with our without high level interrupt in trap window
*/
/* #define NO_TRAPWIN_INTR */
/*
* Macros for partition/unit from floppy device number,
* plus other manifest defines....
*/
#define FDUNITSHIFT (3)
#define FDINSTSHIFT (2 + FDUNITSHIFT)
#define FDPARTITION(x) (getminor(x) & 0x7)
#define FDUNIT(x) ((getminor(x) >> FDUNITSHIFT) & 0x3)
#define FDCTLR(x) (getminor(x) >> FDINSTSHIFT) /* instance */
/*
* Structure definitions for the floppy driver.
*/
/*
* floppy disk command and status block.
*
* Needed to execute a command. Since the floppy chip is
* single threaded with respect to having only one drive
* active at a time, this block of information is only
* valid for the length of a commnand and gets rewritten
* for each command.
*/
#ifndef _ASM
struct fdcsb {
caddr_t csb_addr; /* Data buffer address */
uint_t csb_len; /* Data buffer Length */
caddr_t csb_raddr; /* modified data buffer address */
uint_t csb_rlen; /* modified data buffer len (resid) */
uchar_t csb_opmode; /* Current operating mode */
uchar_t csb_unit; /* floppy slave unit number */
uchar_t csb_ncmds; /* how many command bytes to send */
uchar_t csb_nrslts; /* number of result bytes gotten */
uchar_t csb_opflags; /* opflags, see below */
uchar_t csb_maxretry; /* maximum retries this opertion */
uchar_t csb_retrys; /* how may retrys done so far */
uchar_t csb_status; /* status returned from hwintr */
uchar_t csb_cmdstat; /* if 0 then success, else failure */
uchar_t csb_cmds[10]; /* commands to send to chip */
uchar_t csb_rslt[10]; /* results from chip */
uchar_t csb_dcsr_rslt; /* set to 1 if there's an error in the DCSR */
uchar_t csb_dma_rslt; /* set to 1 if there's an error with the DMA */
ddi_dma_cookie_t csb_dmacookie; /* DMA cookie */
uint_t csb_ccount; /* no. of DMA cookies for current window */
uint_t csb_nwin; /* no. of DMA windows */
uint_t csb_windex; /* DMA window currently in use */
uint_t csb_read; /* indicates read or write */
};
#endif /* !_ASM */
/*
* defines for csb_opflags
*/
#define CSB_OFIMMEDIATE 0x01 /* grab results immediately */
#define CSB_OFSEEKOPS 0x02 /* seek/recal type cmd */
#define CSB_OFXFEROPS 0x04 /* read/write type cmd */
#define CSB_OFRAWIOCTL 0x10 /* raw ioctl - no recovery */
#define CSB_OFNORESULTS 0x20 /* no results at all */
#define CSB_OFTIMEIT 0x40 /* timeout (timer) */
#define CSB_CMDTO 0x01
/*
* csb_read flags
*/
#define CSB_NULL 0x0
#define CSB_READ 0x1
#define CSB_WRITE 0x2
#ifndef _ASM
#ifndef _GENASSYM
/*
* Define a structure to hold the packed default labels,
* based on the real dk_label structure - but shorter
* than 512 bytes. Now only used to define default info
*/
struct packed_label {
char dkl_vname[128]; /* for ascii compatibility */
unsigned short dkl_rpm; /* rotations per minute */
unsigned short dkl_pcyl; /* # physical cylinders */
unsigned short dkl_apc; /* alternates per cylinder */
unsigned short dkl_intrlv; /* interleave factor */
unsigned short dkl_ncyl; /* # of data cylinders */
unsigned short dkl_acyl; /* # of alternate cylinders */
unsigned short dkl_nhead; /* # of heads in this partition */
unsigned short dkl_nsect; /* # of 512 byte sectors per track */
struct dk_map32 dkl_map[NDKMAP]; /* partition map, see dkio.h */
struct dk_vtoc dkl_vtoc; /* vtoc stuff from AT&T SVr4 */
};
/*
* Per drive data
*/
struct fdunit {
/*
* Packed label for this unit
*/
struct dk_label un_label;
/*
* Pointer to iostat statistics
*/
struct kstat *un_iostat; /* iostat numbers */
/*
* Layered open counters
*/
uint_t un_lyropen[NDKMAP];
/*
* Regular open type flags. If
* NDKMAP gets > 8, change the
* uchar_t type.
*
* Open types BLK, MNT, CHR, SWP
* assumed to be values 0-3.
*/
uchar_t un_regopen[OTYPCNT - 1];
/*
* Exclusive open flags (per partition).
*
* The rules are that in order to open
* a partition exclusively, the partition
* must be completely closed already. Once
* any partition of the device is opened
* exclusively, no other open on that
* partition may succeed until the partition
* is closed.
*
* If NDKMAP gets > 8, this must change.
*/
uchar_t un_exclmask; /* set to indicate exclusive open */
struct fd_char *un_chars; /* ptr to diskette characteristics */
char un_curfdtype; /* current driver characteristics */
/* type. If -1, then it was set */
/* via an ioctl. Note that a close */
/* and then and open loses the */
/* ioctl set characteristics. */
struct fd_drive *un_drive; /* ptr to drive characteristics */
int un_unit_no; /* drive id number */
uchar_t un_flags; /* state information */
clock_t un_media_timeout; /* media detection timeout */
timeout_id_t un_media_timeout_id; /* media detection timeout id */
enum dkio_state un_media_state; /* up-to-date media state */
int un_ejected;
short un_state; /* Current power level of drive */
};
/* unit flags (state info) */
#define FDUNIT_DRVCHECKED 0x01 /* this is drive present */
#define FDUNIT_DRVPRESENT 0x02 /* this is drive present */
/* (the presence of a diskette is another matter) */
#define FDUNIT_CHAROK 0x04 /* characteristics are known */
#define FDUNIT_UNLABELED 0x10 /* no label using default */
#define FDUNIT_CHANGED 0x20 /* diskette was changed after open */
#define FDUNIT_MEDIUM 0x40 /* fd drive is in medium density */
#define FDUNIT_SET_SPEED 0x80 /* Flag to force updating the */
/* registers with current speed */
#endif /* !_GENASSYM */
/* unit flags for power (un_power) */
#define FD_STATE_NORMAL 0x0 /* Normal running state */
#define FD_STATE_SUSPENDED 0x1 /* Device suspended for cpr */
#define FD_STATE_STOPPED 0x2 /* Device is stopped, can be turned off */
/*
* --------| fd_detach:DDI_SUSPEND ncmds may be != 0 |-----------|
* |running|------------------------------------------>| |
* |NORMAL | fd_attach:DDI_RESUME | |
* | |<------------------------------------------| SUSPENDED |
* | | | |
* | | -------------
* | | ^
* | | |DDI_SUSPEND
* | | |
* | | fd_power: PM_LEVEL_OFF, ncmds == 0 -------------
* | |------------------------------------------->|STOPPED |
* | | fd_power: PM_LEVEL_ON | |
* | |<-------------------------------------------| |
* -------- ------------|
*
* running => FD_STATE_NORMAL
*
*/
/* flags for power levels for auto power management */
#define PM_LEVEL_ON 0x1 /* Changes the state to FD_STATE_STOPPED */
#define PM_LEVEL_OFF 0x0 /* Changes the state to FD_STATE_NORMAL */
/* a place to keep some statistics on what's going on */
struct fdstat {
/* first operations */
int rd; /* count reads */
int wr; /* count writes */
int recal; /* count recalibrates */
int form; /* count format_tracks */
int other; /* count other ops */
/* then errors */
int reset; /* count resets */
int to; /* count timeouts */
int run; /* count overrun/underrun */
int de; /* count data errors */
int bfmt; /* count bad format errors */
};
/*
* Per controller data
*/
struct fdctlr {
struct fdctlr *c_next; /* next in a linked list */
union fdcreg *c_reg; /* controller registers */
volatile uchar_t *c_control; /* addr of c_reg->fdc_control */
uchar_t *c_fifo; /* addr of c_reg->fdc_fifo */
uchar_t *c_dor; /* addr of c_reg->fdc_dor (077) */
uchar_t *c_dir; /* addr of c_reg->fdc_dir (077) */
caddr_t *c_dma_regs; /* DMA engine registers */
uint_t c_fdtype; /* type of ctlr */
uint_t *c_hiintct; /* for convenience.. */
uint_t c_softic; /* for use by hi level interrupt */
uchar_t c_fasttrap; /* 1 if fast traps enabled, else 0 */
struct fdcsb c_csb; /* current csb */
kmutex_t c_hilock; /* high level mutex */
kmutex_t c_lolock; /* low level mutex */
kcondvar_t c_iocv; /* condition var for I/O done */
kcondvar_t c_csbcv; /* condition var for owning csb */
kcondvar_t c_motoncv; /* condition var for motor on */
kcondvar_t c_statecv; /* condition var for media state */
kcondvar_t c_suspend_cv; /* Cond Var on power management */
ksema_t c_ocsem; /* sem for serializing opens/closes */
ddi_iblock_cookie_t c_block; /* returned from ddi_add_fastintr */
ddi_softintr_t c_softid; /* returned from ddi_add_softintr */
dev_info_t *c_dip; /* controller's dev_info node */
timeout_id_t c_timeid; /* watchdog timer id */
timeout_id_t c_mtimeid; /* motor off timer id */
struct fdunit *c_un; /* unit on controller */
struct buf *c_actf; /* head of wait list */
struct buf *c_actl; /* tail of wait list */
struct buf *c_current; /* currently active buf */
struct kstat *c_intrstat; /* interrupt stats pointer */
struct fdstat fdstats; /* statistics */
uchar_t c_flags; /* state information */
caddr_t c_auxiova; /* auxio virtual address */
uchar_t c_auxiodata; /* auxio data to enable TC */
uchar_t c_auxiodata2; /* auxio data to disable TC */
ddi_acc_handle_t c_handlep_cont;
/* data access handle for controller */
ddi_acc_handle_t c_handlep_dma; /* data access handle for DMA engine */
ddi_acc_handle_t c_handlep_aux; /* data access handle for aux regs */
ddi_dma_handle_t c_dmahandle; /* DMA handle */
uint_t *c_auxio_reg; /* auxio registers */
ddi_dma_attr_t c_fd_dma_lim; /* DMA limit structure */
caddr_t dma_buf; /* Temporary DMAble buffer */
ddi_acc_handle_t c_dma_buf_handle; /* DMA handle for dma_buf */
uint_t sb_dma_channel; /* 8237 dma channel no. */
uchar_t sb_dma_lock; /* Status of DMA lock by isadma */
};
#endif /* !_ASM */
/* types of controllers supported by this driver */
#define FDCTYPE_82072 0x0001
#define FDCTYPE_82077 0x0002
#define FDCTYPE_CTRLMASK 0x000f
/* types of io chips which indicates the type of auxio register */
#define FDCTYPE_MACHIO 0x0010
#define FDCTYPE_SLAVIO 0x0020
#define FDCTYPE_CHEERIO 0x0040
#define FDCTYPE_SB 0x0080
#define FDCTYPE_AUXIOMASK 0x00f0
/* Method used for transferring data */
#define FDCTYPE_DMA 0x1000 /* supports DMA for the floppy */
#define FDCTYPE_DMA8237 FDCTYPE_DMA /* 8237 DMA controller */
#define FDCTYPE_TRNSFER_MASTK 0xf000
/*
* Early revs of the 82077 have a bug by which they
* will not respond to the TC (Terminal count) signal.
* Because this behavior is exhibited on the clone machines
* for which the 077 code has been targeted, special workaround
* logic has had to implemented for read/write commands.
*/
#define FDCTYPE_TCBUG 0x0100
#define FDCTYPE_BUGMASK 0x0f00
/*
* Controller flags
*/
#define FDCFLG_BUSY 0x01 /* operation in progress */
#define FDCFLG_WANT 0x02 /* csb structure wanted */
#define FDCFLG_WAITING 0x04 /* waiting on I/O completion */
#define FDCFLG_TIMEDOUT 0x08 /* the current operation just timed out */
#ifndef _ASM
/*
* Miscellaneous
*/
#define FDREAD 1 /* for fdrw() flag */
#define FDWRITE 2 /* for fdrw() flag */
#define FD_CRETRY 1000000 /* retry while sending comand */
#define FD_RRETRY 1000000 /* retry while getting results */
#define FDXC_SLEEP 0x1 /* tell fdexec to sleep 'till done */
#define FDXC_CHECKCHG 0x2 /* tell fdexec to check disk chnged */
#define FD_SB_DMA_ALIGN 0x10000 /* DMA alignment for South Bridge */
/*
* flags/masks for error printing.
* the levels are for severity
*/
#define FDEP_L0 0 /* chatty as can be - for debug! */
#define FDEP_L1 1 /* best for debug */
#define FDEP_L2 2 /* minor errors - retries, etc. */
#define FDEP_L3 3 /* major errors */
#define FDEP_L4 4 /* catastophic errors, don't mask! */
#define FDEP_LMAX 4 /* catastophic errors, don't mask! */
#define FDERRPRINT(l, m, args) \
{ if (((l) >= fderrlevel) && ((m) & fderrmask)) cmn_err args; }
/*
* for each function, we can mask off its printing by clearing its bit in
* the fderrmask. Some functions (attach, ident) share a mask bit
*/
#define FDEM_IDEN 0x00000001 /* fdidentify */
#define FDEM_ATTA 0x00000001 /* fdattach */
#define FDEM_SIZE 0x00000002 /* fdsize */
#define FDEM_OPEN 0x00000004 /* fdopen */
#define FDEM_GETL 0x00000008 /* fdgetlabel */
#define FDEM_CLOS 0x00000010 /* fdclose */
#define FDEM_STRA 0x00000020 /* fdstrategy */
#define FDEM_STRT 0x00000040 /* fdstart */
#define FDEM_RDWR 0x00000080 /* fdrdwr */
#define FDEM_CMD 0x00000100 /* fdcmd */
#define FDEM_EXEC 0x00000200 /* fdexec */
#define FDEM_RECO 0x00000400 /* fdrecover */
#define FDEM_INTR 0x00000800 /* fdintr */
#define FDEM_WATC 0x00001000 /* fdwatch */
#define FDEM_IOCT 0x00002000 /* fdioctl */
#define FDEM_RAWI 0x00004000 /* fdrawioctl */
#define FDEM_DUMP 0x00008000 /* fddump */
#define FDEM_GETC 0x00010000 /* fdgetcsb */
#define FDEM_RETC 0x00020000 /* fdretcsb */
#define FDEM_RESE 0x00040000 /* fdreset */
#define FDEM_RECA 0x00080000 /* fdrecalseek */
#define FDEM_FORM 0x00100000 /* fdformat */
#define FDEM_RW 0x00200000 /* fdrw */
#define FDEM_CHEK 0x00400000 /* fdcheckdisk */
#define FDEM_DSEL 0x00800000 /* fdselect */
#define FDEM_EJEC 0x01000000 /* fdeject */
#define FDEM_SCHG 0x02000000 /* fdsense_chng */
#define FDEM_PACK 0x04000000 /* fdpacklabel */
#define FDEM_MODS 0x08000000 /* _init, _info, _fini */
#define FDEM_MOFF 0x10000000 /* fdmotoff */
#define FDEM_SDMA 0x20000000 /* fdstart_dma */
#define FDEM_PWR 0x40000000 /* fd power management */
#define FDEM_ALL 0xFFFFFFFF /* all */
#endif /* !_ASM */
#ifdef __cplusplus
}
#endif
#endif /* !_SYS_FDVAR_H */