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