152417Sluoqi/*-
252417Sluoqi * Copyright (c) 1999 Luoqi Chen.
352417Sluoqi * All rights reserved.
452417Sluoqi *
552417Sluoqi * Redistribution and use in source and binary forms, with or without
652417Sluoqi * modification, are permitted provided that the following conditions
752417Sluoqi * are met:
852417Sluoqi * 1. Redistributions of source code must retain the above copyright
952417Sluoqi *    notice, this list of conditions and the following disclaimer.
1052417Sluoqi * 2. Redistributions in binary form must reproduce the above copyright
1152417Sluoqi *    notice, this list of conditions and the following disclaimer in the
1252417Sluoqi *    documentation and/or other materials provided with the distribution.
1352417Sluoqi *
1452417Sluoqi * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1552417Sluoqi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1652417Sluoqi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1752417Sluoqi * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1852417Sluoqi * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1952417Sluoqi * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2052417Sluoqi * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2152417Sluoqi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2252417Sluoqi * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2352417Sluoqi * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2452417Sluoqi * SUCH DAMAGE.
2552417Sluoqi *
2652417Sluoqi * $FreeBSD$
2752417Sluoqi */
2852417Sluoqi
2952417Sluoqistruct aic_transinfo {
3052417Sluoqi	u_int8_t period;
3152417Sluoqi	u_int8_t offset;
3252417Sluoqi};
3352417Sluoqi
3452417Sluoqistruct aic_tinfo {
3552417Sluoqi	u_int16_t lubusy;
3652417Sluoqi	u_int8_t flags;
3752417Sluoqi	u_int8_t scsirate;
3852417Sluoqi	struct aic_transinfo current;
3952417Sluoqi	struct aic_transinfo goal;
4052417Sluoqi	struct aic_transinfo user;
4152417Sluoqi};
4252417Sluoqi
4352417Sluoqi#define	TINFO_DISC_ENB		0x01
4452417Sluoqi#define	TINFO_TAG_ENB		0x02
4552417Sluoqi#define	TINFO_SDTR_NEGO		0x04
4652417Sluoqi#define	TINFO_SDTR_SENT		0x08
4752417Sluoqi
4852417Sluoqistruct aic_scb {
4952417Sluoqi	union ccb	*ccb;
5052417Sluoqi	u_int8_t	flags;
5152417Sluoqi	u_int8_t	tag;
5252417Sluoqi	u_int8_t	target;
5352417Sluoqi	u_int8_t	lun;
5452417Sluoqi	u_int8_t	status;
5552417Sluoqi	u_int8_t	cmd_len;
5652417Sluoqi	u_int8_t	*cmd_ptr;
5752417Sluoqi	u_int32_t	data_len;
5852417Sluoqi	u_int8_t	*data_ptr;
5952417Sluoqi};
6052417Sluoqi
6152417Sluoqi#define ccb_scb_ptr	spriv_ptr0
6252417Sluoqi#define ccb_aic_ptr	spriv_ptr1
6352417Sluoqi
6452417Sluoqi#define	SCB_ACTIVE		0x01
6552417Sluoqi#define	SCB_DISCONNECTED	0x02
6652417Sluoqi#define	SCB_DEVICE_RESET	0x04
6752417Sluoqi#define	SCB_SENSE		0x08
6852417Sluoqi
6992370Sluoqienum { AIC6260, AIC6360, AIC6370, GM82C700 };
7092370Sluoqi
7152417Sluoqistruct aic_softc {
72170872Sscottl	device_t		dev;
7352417Sluoqi	int			unit;
7452417Sluoqi	bus_space_tag_t		tag;
7552417Sluoqi	bus_space_handle_t	bsh;
7652417Sluoqi	bus_dma_tag_t		dmat;
7752417Sluoqi
7852417Sluoqi	struct cam_sim		*sim;
7952417Sluoqi	struct cam_path		*path;
8060938Sjake	TAILQ_HEAD(,ccb_hdr)	pending_ccbs, nexus_ccbs;
8152417Sluoqi	struct aic_scb		*nexus;
8252417Sluoqi
8352417Sluoqi	u_int32_t		flags;
8452417Sluoqi	u_int8_t		initiator;
8552417Sluoqi	u_int8_t		state;
8652417Sluoqi	u_int8_t		target;
8752417Sluoqi	u_int8_t		lun;
8852417Sluoqi	u_int8_t		prev_phase;
8952417Sluoqi
9052417Sluoqi	u_int8_t		msg_outq;
9152417Sluoqi	u_int8_t		msg_sent;
9252417Sluoqi	int			msg_len;
9352417Sluoqi	char			msg_buf[8];
9452417Sluoqi
9552417Sluoqi	struct aic_tinfo	tinfo[8];
9652417Sluoqi	struct aic_scb		scbs[256];
9774370Sken
9874370Sken	int			min_period;
9974370Sken	int			max_period;
10092370Sluoqi	int			chip_type;
10152417Sluoqi};
10252417Sluoqi
10352417Sluoqi#define	AIC_DISC_ENABLE		0x01
10452417Sluoqi#define	AIC_DMA_ENABLE		0x02
10552417Sluoqi#define	AIC_PARITY_ENABLE	0x04
10652417Sluoqi#define	AIC_DWIO_ENABLE		0x08
10752417Sluoqi#define	AIC_RESOURCE_SHORTAGE	0x10
10852417Sluoqi#define	AIC_DROP_MSGIN		0x20
10952417Sluoqi#define	AIC_BUSFREE_OK		0x40
11074370Sken#define	AIC_FAST_ENABLE		0x80
11152417Sluoqi
11252417Sluoqi#define	AIC_IDLE		0x00
11352417Sluoqi#define	AIC_SELECTING		0x01
11452417Sluoqi#define	AIC_RESELECTED		0x02
11554136Sluoqi#define	AIC_RECONNECTING	0x03
11654136Sluoqi#define	AIC_HASNEXUS		0x04
11752417Sluoqi
11852417Sluoqi#define	AIC_MSG_IDENTIFY	0x01
11952417Sluoqi#define	AIC_MSG_TAG_Q		0x02
12052417Sluoqi#define	AIC_MSG_SDTR		0x04
12152417Sluoqi#define	AIC_MSG_WDTR		0x08
12252417Sluoqi#define	AIC_MSG_MSGBUF		0x80
12352417Sluoqi
12452417Sluoqi#define	AIC_SYNC_PERIOD		(200 / 4)
12574370Sken#define	AIC_FAST_SYNC_PERIOD	(100 / 4)
12674370Sken#define	AIC_MIN_SYNC_PERIOD	112
12752417Sluoqi#define	AIC_SYNC_OFFSET		8
12852417Sluoqi
12952417Sluoqi#define	aic_inb(aic, port) \
13052417Sluoqi	bus_space_read_1((aic)->tag, (aic)->bsh, (port))
13152417Sluoqi
13252417Sluoqi#define	aic_outb(aic, port, value) \
13352417Sluoqi	bus_space_write_1((aic)->tag, (aic)->bsh, (port), (value))
13452417Sluoqi
13552417Sluoqi#define	aic_insb(aic, port, addr, count) \
13652417Sluoqi	bus_space_read_multi_1((aic)->tag, (aic)->bsh, (port), (addr), (count))
13752417Sluoqi
13852417Sluoqi#define	aic_outsb(aic, port, addr, count) \
13952417Sluoqi	bus_space_write_multi_1((aic)->tag, (aic)->bsh, (port), (addr), (count))
14052417Sluoqi
14152417Sluoqi#define	aic_insw(aic, port, addr, count) \
14252417Sluoqi	bus_space_read_multi_2((aic)->tag, (aic)->bsh, (port), \
14352417Sluoqi		(u_int16_t *)(addr), (count))
14452417Sluoqi
14552417Sluoqi#define	aic_outsw(aic, port, addr, count) \
14652417Sluoqi	bus_space_write_multi_2((aic)->tag, (aic)->bsh, (port), \
14752417Sluoqi		(u_int16_t *)(addr), (count))
14852417Sluoqi
14952417Sluoqi#define	aic_insl(aic, port, addr, count) \
15052417Sluoqi	bus_space_read_multi_4((aic)->tag, (aic)->bsh, (port), \
15152417Sluoqi		(u_int32_t *)(addr), (count))
15252417Sluoqi
15352417Sluoqi#define	aic_outsl(aic, port, addr, count) \
15452417Sluoqi	bus_space_write_multi_4((aic)->tag, (aic)->bsh, (port), \
15552417Sluoqi		(u_int32_t *)(addr), (count))
15652417Sluoqi
15792739Salfredextern int aic_probe(struct aic_softc *);
15892739Salfredextern int aic_attach(struct aic_softc *);
15992739Salfredextern int aic_detach(struct aic_softc *);
16092739Salfredextern void aic_intr(void *);
161