1/*
2 * $FreeBSD$
3 */
4
5struct scd_mbx {
6	short		retry;
7	short		nblk;
8	int		sz;
9	u_long		skip;
10	struct bio *	bp;
11	short		count;
12};
13
14struct scd_data {
15	char			double_speed;
16	char *			name;
17	short			flags;
18	int			blksize;
19	u_long			disksize;
20	int			openflag;
21	struct {
22		unsigned int	adr :4;
23		unsigned int	ctl :4; /* xcdplayer needs this */
24		unsigned char	start_msf[3];
25	} toc[MAX_TRACKS];
26	short			first_track;
27	short			last_track;
28	struct  ioc_play_msf	last_play;
29
30	short			audio_status;
31	struct bio_queue_head	head;	     /* head of bio queue */
32	struct scd_mbx		mbx;
33};
34
35struct scd_softc {
36	device_t		dev;
37	struct cdev *scd_dev_t;
38	int			debug;
39
40	struct resource *	port;
41	int			port_rid;
42	int			port_type;
43	bus_space_tag_t		port_bst;
44	bus_space_handle_t	port_bsh;
45
46	struct mtx		mtx;
47
48	struct callout_handle	ch;
49	int			ch_state;
50	struct scd_mbx *	ch_mbxsave;
51
52	struct scd_data		data;
53};
54
55#define	SCD_LOCK(_sc)		splx(&(_sc)->mtx
56#define	SCD_UNLOCK(_sc)		splx(&(_sc)->mtx
57
58#define	SCD_READ(_sc, _reg) \
59	bus_space_read_1(_sc->port_bst, _sc->port_bsh, _reg)
60#define	SCD_READ_MULTI(_sc, _reg, _addr, _count) \
61	bus_space_read_multi_1(_sc->port_bst, _sc->port_bsh, _reg, _addr, _count)
62#define	SCD_WRITE(_sc, _reg, _val) \
63	bus_space_write_1(_sc->port_bst, _sc->port_bsh, _reg, _val)
64
65int	scd_probe	(struct scd_softc *);
66int	scd_attach	(struct scd_softc *);
67