aic79xx_osm.h revision 97883
197883Sgibbs/*
297883Sgibbs * FreeBSD platform specific driver option settings, data structures,
397883Sgibbs * function declarations and includes.
497883Sgibbs *
597883Sgibbs * Copyright (c) 1994-2001 Justin T. Gibbs.
697883Sgibbs * All rights reserved.
797883Sgibbs *
897883Sgibbs * Redistribution and use in source and binary forms, with or without
997883Sgibbs * modification, are permitted provided that the following conditions
1097883Sgibbs * are met:
1197883Sgibbs * 1. Redistributions of source code must retain the above copyright
1297883Sgibbs *    notice, this list of conditions, and the following disclaimer,
1397883Sgibbs *    without modification.
1497883Sgibbs * 2. The name of the author may not be used to endorse or promote products
1597883Sgibbs *    derived from this software without specific prior written permission.
1697883Sgibbs *
1797883Sgibbs * Alternatively, this software may be distributed under the terms of the
1897883Sgibbs * GNU Public License ("GPL").
1997883Sgibbs *
2097883Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2197883Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2297883Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2397883Sgibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2497883Sgibbs * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2597883Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2697883Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2797883Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2897883Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2997883Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3097883Sgibbs * SUCH DAMAGE.
3197883Sgibbs *
3297883Sgibbs * $Id$
3397883Sgibbs *
3497883Sgibbs * $FreeBSD: head/sys/dev/aic7xxx/aic79xx_osm.h 97883 2002-06-05 19:52:45Z gibbs $
3597883Sgibbs */
3697883Sgibbs
3797883Sgibbs#ifndef _AIC79XX_FREEBSD_H_
3897883Sgibbs#define _AIC79XX_FREEBSD_H_
3997883Sgibbs
4097883Sgibbs#include <opt_aic79xx.h>	/* for config options */
4197883Sgibbs#ifndef NPCI
4297883Sgibbs#include <pci.h>
4397883Sgibbs#endif
4497883Sgibbs
4597883Sgibbs#include <sys/param.h>
4697883Sgibbs#include <sys/systm.h>
4797883Sgibbs#include <sys/bus.h>		/* For device_t */
4897883Sgibbs#include <sys/eventhandler.h>
4997883Sgibbs#include <sys/kernel.h>
5097883Sgibbs#include <sys/malloc.h>
5197883Sgibbs#include <sys/queue.h>
5297883Sgibbs
5397883Sgibbs#define AHD_PCI_CONFIG 1
5497883Sgibbs#include <machine/bus_memio.h>
5597883Sgibbs#include <machine/bus_pio.h>
5697883Sgibbs#include <machine/bus.h>
5797883Sgibbs#include <machine/endian.h>
5897883Sgibbs#include <machine/clock.h>
5997883Sgibbs#include <machine/resource.h>
6097883Sgibbs
6197883Sgibbs#include <sys/rman.h>
6297883Sgibbs
6397883Sgibbs#if NPCI > 0
6497883Sgibbs#include <pci/pcireg.h>
6597883Sgibbs#include <pci/pcivar.h>
6697883Sgibbs#endif
6797883Sgibbs
6897883Sgibbs#include <cam/cam.h>
6997883Sgibbs#include <cam/cam_ccb.h>
7097883Sgibbs#include <cam/cam_debug.h>
7197883Sgibbs#include <cam/cam_sim.h>
7297883Sgibbs#include <cam/cam_xpt_sim.h>
7397883Sgibbs
7497883Sgibbs#include <cam/scsi/scsi_all.h>
7597883Sgibbs#include <cam/scsi/scsi_message.h>
7697883Sgibbs#include <cam/scsi/scsi_iu.h>
7797883Sgibbs
7897883Sgibbs#ifdef CAM_NEW_TRAN_CODE
7997883Sgibbs#define AHD_NEW_TRAN_SETTINGS
8097883Sgibbs#endif /* CAM_NEW_TRAN_CODE */
8197883Sgibbs
8297883Sgibbs/****************************** Platform Macros *******************************/
8397883Sgibbs#define	SIM_IS_SCSIBUS_B(ahd, sim)	\
8497883Sgibbs	(0)
8597883Sgibbs#define	SIM_CHANNEL(ahd, sim)	\
8697883Sgibbs	('A')
8797883Sgibbs#define	SIM_SCSI_ID(ahd, sim)	\
8897883Sgibbs	(ahd->our_id)
8997883Sgibbs#define	SIM_PATH(ahd, sim)	\
9097883Sgibbs	(ahd->platform_data->path)
9197883Sgibbs#define BUILD_SCSIID(ahd, sim, target_id, our_id) \
9297883Sgibbs        ((((target_id) << TID_SHIFT) & TID) | (our_id))
9397883Sgibbs
9497883Sgibbs
9597883Sgibbs#define SCB_GET_SIM(ahd, scb) \
9697883Sgibbs	((ahd)->platform_data->sim)
9797883Sgibbs
9897883Sgibbs#ifndef offsetof
9997883Sgibbs#define offsetof(type, member)  ((size_t)(&((type *)0)->member))
10097883Sgibbs#endif
10197883Sgibbs/************************* Forward Declarations *******************************/
10297883Sgibbstypedef device_t ahd_dev_softc_t;
10397883Sgibbstypedef union ccb *ahd_io_ctx_t;
10497883Sgibbs
10597883Sgibbs/***************************** Bus Space/DMA **********************************/
10697883Sgibbs#define ahd_dma_tag_create(ahd, parent_tag, alignment, boundary,	\
10797883Sgibbs			   lowaddr, highaddr, filter, filterarg,	\
10897883Sgibbs			   maxsize, nsegments, maxsegsz, flags,		\
10997883Sgibbs			   dma_tagp)					\
11097883Sgibbs	bus_dma_tag_create(parent_tag, alignment, boundary,		\
11197883Sgibbs			   lowaddr, highaddr, filter, filterarg,	\
11297883Sgibbs			   maxsize, nsegments, maxsegsz, flags,		\
11397883Sgibbs			   dma_tagp)
11497883Sgibbs
11597883Sgibbs#define ahd_dma_tag_destroy(ahd, tag)					\
11697883Sgibbs	bus_dma_tag_destroy(tag)
11797883Sgibbs
11897883Sgibbs#define ahd_dmamem_alloc(ahd, dmat, vaddr, flags, mapp)			\
11997883Sgibbs	bus_dmamem_alloc(dmat, vaddr, flags, mapp)
12097883Sgibbs
12197883Sgibbs#define ahd_dmamem_free(ahd, dmat, vaddr, map)				\
12297883Sgibbs	bus_dmamem_free(dmat, vaddr, map)
12397883Sgibbs
12497883Sgibbs#define ahd_dmamap_create(ahd, tag, flags, mapp)			\
12597883Sgibbs	bus_dmamap_create(tag, flags, mapp)
12697883Sgibbs
12797883Sgibbs#define ahd_dmamap_destroy(ahd, tag, map)				\
12897883Sgibbs	bus_dmamap_destroy(tag, map)
12997883Sgibbs
13097883Sgibbs#define ahd_dmamap_load(ahd, dmat, map, addr, buflen, callback,		\
13197883Sgibbs			callback_arg, flags)				\
13297883Sgibbs	bus_dmamap_load(dmat, map, addr, buflen, callback, callback_arg, flags)
13397883Sgibbs
13497883Sgibbs#define ahd_dmamap_unload(ahd, tag, map)				\
13597883Sgibbs	bus_dmamap_unload(tag, map)
13697883Sgibbs
13797883Sgibbs/* XXX Need to update Bus DMA for partial map syncs */
13897883Sgibbs#define ahd_dmamap_sync(ahd, dma_tag, dmamap, offset, len, op)		\
13997883Sgibbs	bus_dmamap_sync(dma_tag, dmamap, op)
14097883Sgibbs
14197883Sgibbs/************************ Tunable Driver Parameters  **************************/
14297883Sgibbs/*
14397883Sgibbs * The number of dma segments supported.  The sequencer can handle any number
14497883Sgibbs * of physically contiguous S/G entrys.  To reduce the driver's memory
14597883Sgibbs * consumption, we limit the number supported to be sufficient to handle
14697883Sgibbs * the largest mapping supported by the kernel, MAXPHYS.  Assuming the
14797883Sgibbs * transfer is as fragmented as possible and unaligned, this turns out to
14897883Sgibbs * be the number of paged sized transfers in MAXPHYS plus an extra element
14997883Sgibbs * to handle any unaligned residual.  The sequencer fetches SG elements
15097883Sgibbs * in cacheline sized chucks, so make the number per-transaction an even
15197883Sgibbs * multiple of 16 which should align us on even the largest of cacheline
15297883Sgibbs * boundaries.
15397883Sgibbs */
15497883Sgibbs#define AHD_NSEG (roundup(btoc(MAXPHYS) + 1, 16))
15597883Sgibbs
15697883Sgibbs/* This driver supports target mode */
15797883Sgibbs#if NOT_YET
15897883Sgibbs#define AHD_TARGET_MODE 1
15997883Sgibbs#endif
16097883Sgibbs
16197883Sgibbs/************************** Softc/SCB Platform Data ***************************/
16297883Sgibbsstruct ahd_platform_data {
16397883Sgibbs	/*
16497883Sgibbs	 * Hooks into the XPT.
16597883Sgibbs	 */
16697883Sgibbs	struct	cam_sim		*sim;
16797883Sgibbs	struct	cam_sim		*sim_b;
16897883Sgibbs	struct	cam_path	*path;
16997883Sgibbs	struct	cam_path	*path_b;
17097883Sgibbs
17197883Sgibbs	int			 regs_res_type[2];
17297883Sgibbs	int			 regs_res_id[2];
17397883Sgibbs	int			 irq_res_type;
17497883Sgibbs	struct resource		*regs[2];
17597883Sgibbs	struct resource		*irq;
17697883Sgibbs	void			*ih;
17797883Sgibbs	eventhandler_tag	 eh;
17897883Sgibbs};
17997883Sgibbs
18097883Sgibbsstruct scb_platform_data {
18197883Sgibbs};
18297883Sgibbs
18397883Sgibbs/********************************* Byte Order *********************************/
18497883Sgibbs/*
18597883Sgibbs * XXX Waiting for FreeBSD byte swapping functions.
18697883Sgibbs * For now assume host is Little Endian.
18797883Sgibbs */
18897883Sgibbs#define ahd_htobe16(x) x
18997883Sgibbs#define ahd_htobe32(x) x
19097883Sgibbs#define ahd_htobe64(x) x
19197883Sgibbs#define ahd_htole16(x) x
19297883Sgibbs#define ahd_htole32(x) x
19397883Sgibbs#define ahd_htole64(x) x
19497883Sgibbs
19597883Sgibbs#define ahd_be16toh(x) x
19697883Sgibbs#define ahd_be32toh(x) x
19797883Sgibbs#define ahd_be64toh(x) x
19897883Sgibbs#define ahd_le16toh(x) x
19997883Sgibbs#define ahd_le32toh(x) x
20097883Sgibbs#define ahd_le64toh(x) x
20197883Sgibbs
20297883Sgibbs/************************** Timer DataStructures ******************************/
20397883Sgibbstypedef struct callout ahd_timer_t;
20497883Sgibbs
20597883Sgibbs/***************************** Core Includes **********************************/
20697883Sgibbs#include <dev/aic7xxx/aic79xx.h>
20797883Sgibbs
20897883Sgibbs/***************************** Timer Facilities *******************************/
20997883Sgibbs#define ahd_timer_init callout_init
21097883Sgibbs#define ahd_timer_stop callout_stop
21197883Sgibbs
21297883Sgibbsstatic __inline void
21397883Sgibbsahd_timer_reset(ahd_timer_t *timer, int usec, ahd_callback_t *func, void *arg)
21497883Sgibbs{
21597883Sgibbs	callout_reset(timer, (usec * hz)/1000000, func, arg);
21697883Sgibbs}
21797883Sgibbs
21897883Sgibbs/*************************** Device Access ************************************/
21997883Sgibbs#define ahd_inb(ahd, port)					\
22097883Sgibbs	bus_space_read_1((ahd)->tags[(port) >> 8],		\
22197883Sgibbs			 (ahd)->bshs[(port) >> 8], (port) & 0xFF)
22297883Sgibbs
22397883Sgibbs#define ahd_outb(ahd, port, value)				\
22497883Sgibbs	bus_space_write_1((ahd)->tags[(port) >> 8],		\
22597883Sgibbs			  (ahd)->bshs[(port) >> 8], (port) & 0xFF, value)
22697883Sgibbs
22797883Sgibbs#define ahd_inw_atomic(ahd, port)				\
22897883Sgibbs	ahd_le16toh(bus_space_read_2((ahd)->tags[(port) >> 8],	\
22997883Sgibbs				     (ahd)->bshs[(port) >> 8], (port) & 0xFF))
23097883Sgibbs
23197883Sgibbs#define ahd_outw_atomic(ahd, port, value)			\
23297883Sgibbs	bus_space_write_2((ahd)->tags[(port) >> 8],		\
23397883Sgibbs			  (ahd)->bshs[(port) >> 8],		\
23497883Sgibbs			  (port & 0xFF), ahd_htole16(value))
23597883Sgibbs
23697883Sgibbs#define ahd_outsb(ahd, port, valp, count)			\
23797883Sgibbs	bus_space_write_multi_1((ahd)->tags[(port) >> 8],	\
23897883Sgibbs				(ahd)->bshs[(port) >> 8],	\
23997883Sgibbs				(port & 0xFF), valp, count)
24097883Sgibbs
24197883Sgibbs#define ahd_insb(ahd, port, valp, count)			\
24297883Sgibbs	bus_space_read_multi_1((ahd)->tags[(port) >> 8],	\
24397883Sgibbs			       (ahd)->bshs[(port) >> 8],	\
24497883Sgibbs			       (port & 0xFF), valp, count)
24597883Sgibbs
24697883Sgibbsstatic __inline void ahd_flush_device_writes(struct ahd_softc *);
24797883Sgibbs
24897883Sgibbsstatic __inline void
24997883Sgibbsahd_flush_device_writes(struct ahd_softc *ahd)
25097883Sgibbs{
25197883Sgibbs	/* XXX Is this sufficient for all architectures??? */
25297883Sgibbs	ahd_inb(ahd, INTSTAT);
25397883Sgibbs}
25497883Sgibbs
25597883Sgibbs/**************************** Locking Primitives ******************************/
25697883Sgibbs/* Lock protecting internal data structures */
25797883Sgibbsstatic __inline void ahd_lockinit(struct ahd_softc *);
25897883Sgibbsstatic __inline void ahd_lock(struct ahd_softc *, unsigned long *flags);
25997883Sgibbsstatic __inline void ahd_unlock(struct ahd_softc *, unsigned long *flags);
26097883Sgibbs
26197883Sgibbs/* Lock held during command compeletion to the upper layer */
26297883Sgibbsstatic __inline void ahd_done_lockinit(struct ahd_softc *);
26397883Sgibbsstatic __inline void ahd_done_lock(struct ahd_softc *, unsigned long *flags);
26497883Sgibbsstatic __inline void ahd_done_unlock(struct ahd_softc *, unsigned long *flags);
26597883Sgibbs
26697883Sgibbs/* Lock held during ahc_list manipulation and ahc softc frees */
26797883Sgibbsstatic __inline void ahd_list_lockinit(void);
26897883Sgibbsstatic __inline void ahd_list_lock(unsigned long *flags);
26997883Sgibbsstatic __inline void ahd_list_unlock(unsigned long *flags);
27097883Sgibbs
27197883Sgibbsstatic __inline void
27297883Sgibbsahd_lockinit(struct ahd_softc *ahd)
27397883Sgibbs{
27497883Sgibbs}
27597883Sgibbs
27697883Sgibbsstatic __inline void
27797883Sgibbsahd_lock(struct ahd_softc *ahd, unsigned long *flags)
27897883Sgibbs{
27997883Sgibbs	*flags = splcam();
28097883Sgibbs}
28197883Sgibbs
28297883Sgibbsstatic __inline void
28397883Sgibbsahd_unlock(struct ahd_softc *ahd, unsigned long *flags)
28497883Sgibbs{
28597883Sgibbs	splx(*flags);
28697883Sgibbs}
28797883Sgibbs
28897883Sgibbs/* Lock held during command compeletion to the upper layer */
28997883Sgibbsstatic __inline void
29097883Sgibbsahd_done_lockinit(struct ahd_softc *ahd)
29197883Sgibbs{
29297883Sgibbs}
29397883Sgibbs
29497883Sgibbsstatic __inline void
29597883Sgibbsahd_done_lock(struct ahd_softc *ahd, unsigned long *flags)
29697883Sgibbs{
29797883Sgibbs}
29897883Sgibbs
29997883Sgibbsstatic __inline void
30097883Sgibbsahd_done_unlock(struct ahd_softc *ahd, unsigned long *flags)
30197883Sgibbs{
30297883Sgibbs}
30397883Sgibbs
30497883Sgibbs/* Lock held during ahc_list manipulation and ahc softc frees */
30597883Sgibbsstatic __inline void
30697883Sgibbsahd_list_lockinit()
30797883Sgibbs{
30897883Sgibbs}
30997883Sgibbs
31097883Sgibbsstatic __inline void
31197883Sgibbsahd_list_lock(unsigned long *flags)
31297883Sgibbs{
31397883Sgibbs}
31497883Sgibbs
31597883Sgibbsstatic __inline void
31697883Sgibbsahd_list_unlock(unsigned long *flags)
31797883Sgibbs{
31897883Sgibbs}
31997883Sgibbs/****************************** OS Primitives *********************************/
32097883Sgibbs#define ahd_delay DELAY
32197883Sgibbs
32297883Sgibbs/************************** Transaction Operations ****************************/
32397883Sgibbsstatic __inline void ahd_set_transaction_status(struct scb *, uint32_t);
32497883Sgibbsstatic __inline void ahd_set_scsi_status(struct scb *, uint32_t);
32597883Sgibbsstatic __inline uint32_t ahd_get_transaction_status(struct scb *);
32697883Sgibbsstatic __inline uint32_t ahd_get_scsi_status(struct scb *);
32797883Sgibbsstatic __inline void ahd_set_transaction_tag(struct scb *, int, u_int);
32897883Sgibbsstatic __inline u_long ahd_get_transfer_length(struct scb *);
32997883Sgibbsstatic __inline int ahd_get_transfer_dir(struct scb *);
33097883Sgibbsstatic __inline void ahd_set_residual(struct scb *, u_long);
33197883Sgibbsstatic __inline void ahd_set_sense_residual(struct scb *, u_long);
33297883Sgibbsstatic __inline u_long ahd_get_residual(struct scb *);
33397883Sgibbsstatic __inline int ahd_perform_autosense(struct scb *);
33497883Sgibbsstatic __inline uint32_t ahd_get_sense_bufsize(struct ahd_softc*, struct scb*);
33597883Sgibbsstatic __inline void ahd_freeze_simq(struct ahd_softc *);
33697883Sgibbsstatic __inline void ahd_release_simq(struct ahd_softc *);
33797883Sgibbsstatic __inline void ahd_freeze_ccb(union ccb *ccb);
33897883Sgibbsstatic __inline void ahd_freeze_scb(struct scb *scb);
33997883Sgibbsstatic __inline void ahd_platform_freeze_devq(struct ahd_softc *, struct scb *);
34097883Sgibbsstatic __inline int  ahd_platform_abort_scbs(struct ahd_softc *ahd, int target,
34197883Sgibbs					     char channel, int lun, u_int tag,
34297883Sgibbs					     role_t role, uint32_t status);
34397883Sgibbs
34497883Sgibbsstatic __inline
34597883Sgibbsvoid ahd_set_transaction_status(struct scb *scb, uint32_t status)
34697883Sgibbs{
34797883Sgibbs	scb->io_ctx->ccb_h.status &= ~CAM_STATUS_MASK;
34897883Sgibbs	scb->io_ctx->ccb_h.status |= status;
34997883Sgibbs}
35097883Sgibbs
35197883Sgibbsstatic __inline
35297883Sgibbsvoid ahd_set_scsi_status(struct scb *scb, uint32_t status)
35397883Sgibbs{
35497883Sgibbs	scb->io_ctx->csio.scsi_status = status;
35597883Sgibbs}
35697883Sgibbs
35797883Sgibbsstatic __inline
35897883Sgibbsuint32_t ahd_get_transaction_status(struct scb *scb)
35997883Sgibbs{
36097883Sgibbs	return (scb->io_ctx->ccb_h.status & CAM_STATUS_MASK);
36197883Sgibbs}
36297883Sgibbs
36397883Sgibbsstatic __inline
36497883Sgibbsuint32_t ahd_get_scsi_status(struct scb *scb)
36597883Sgibbs{
36697883Sgibbs	return (scb->io_ctx->csio.scsi_status);
36797883Sgibbs}
36897883Sgibbs
36997883Sgibbsstatic __inline
37097883Sgibbsvoid ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type)
37197883Sgibbs{
37297883Sgibbs	scb->io_ctx->csio.tag_action = type;
37397883Sgibbs	if (enabled)
37497883Sgibbs		scb->io_ctx->ccb_h.flags |= CAM_TAG_ACTION_VALID;
37597883Sgibbs	else
37697883Sgibbs		scb->io_ctx->ccb_h.flags &= ~CAM_TAG_ACTION_VALID;
37797883Sgibbs}
37897883Sgibbs
37997883Sgibbsstatic __inline
38097883Sgibbsu_long ahd_get_transfer_length(struct scb *scb)
38197883Sgibbs{
38297883Sgibbs	return (scb->io_ctx->csio.dxfer_len);
38397883Sgibbs}
38497883Sgibbs
38597883Sgibbsstatic __inline
38697883Sgibbsint ahd_get_transfer_dir(struct scb *scb)
38797883Sgibbs{
38897883Sgibbs	return (scb->io_ctx->ccb_h.flags & CAM_DIR_MASK);
38997883Sgibbs}
39097883Sgibbs
39197883Sgibbsstatic __inline
39297883Sgibbsvoid ahd_set_residual(struct scb *scb, u_long resid)
39397883Sgibbs{
39497883Sgibbs	scb->io_ctx->csio.resid = resid;
39597883Sgibbs}
39697883Sgibbs
39797883Sgibbsstatic __inline
39897883Sgibbsvoid ahd_set_sense_residual(struct scb *scb, u_long resid)
39997883Sgibbs{
40097883Sgibbs	scb->io_ctx->csio.sense_resid = resid;
40197883Sgibbs}
40297883Sgibbs
40397883Sgibbsstatic __inline
40497883Sgibbsu_long ahd_get_residual(struct scb *scb)
40597883Sgibbs{
40697883Sgibbs	return (scb->io_ctx->csio.resid);
40797883Sgibbs}
40897883Sgibbs
40997883Sgibbsstatic __inline
41097883Sgibbsint ahd_perform_autosense(struct scb *scb)
41197883Sgibbs{
41297883Sgibbs	return (!(scb->io_ctx->ccb_h.flags & CAM_DIS_AUTOSENSE));
41397883Sgibbs}
41497883Sgibbs
41597883Sgibbsstatic __inline uint32_t
41697883Sgibbsahd_get_sense_bufsize(struct ahd_softc *ahd, struct scb *scb)
41797883Sgibbs{
41897883Sgibbs	return (sizeof(struct scsi_sense_data));
41997883Sgibbs}
42097883Sgibbs
42197883Sgibbsstatic __inline void
42297883Sgibbsahd_freeze_simq(struct ahd_softc *ahd)
42397883Sgibbs{
42497883Sgibbs	xpt_freeze_simq(ahd->platform_data->sim, /*count*/1);
42597883Sgibbs}
42697883Sgibbs
42797883Sgibbsstatic __inline void
42897883Sgibbsahd_release_simq(struct ahd_softc *ahd)
42997883Sgibbs{
43097883Sgibbs	xpt_release_simq(ahd->platform_data->sim, /*run queue*/TRUE);
43197883Sgibbs}
43297883Sgibbs
43397883Sgibbsstatic __inline void
43497883Sgibbsahd_freeze_ccb(union ccb *ccb)
43597883Sgibbs{
43697883Sgibbs	if ((ccb->ccb_h.status & CAM_DEV_QFRZN) == 0) {
43797883Sgibbs		ccb->ccb_h.status |= CAM_DEV_QFRZN;
43897883Sgibbs		xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);
43997883Sgibbs	}
44097883Sgibbs}
44197883Sgibbs
44297883Sgibbsstatic __inline void
44397883Sgibbsahd_freeze_scb(struct scb *scb)
44497883Sgibbs{
44597883Sgibbs	ahd_freeze_ccb(scb->io_ctx);
44697883Sgibbs}
44797883Sgibbs
44897883Sgibbsstatic __inline void
44997883Sgibbsahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb)
45097883Sgibbs{
45197883Sgibbs	/* Nothing to do here for FreeBSD */
45297883Sgibbs}
45397883Sgibbs
45497883Sgibbsstatic __inline int
45597883Sgibbsahd_platform_abort_scbs(struct ahd_softc *ahd, int target,
45697883Sgibbs			char channel, int lun, u_int tag,
45797883Sgibbs			role_t role, uint32_t status)
45897883Sgibbs{
45997883Sgibbs	/* Nothing to do here for FreeBSD */
46097883Sgibbs	return (0);
46197883Sgibbs}
46297883Sgibbs
46397883Sgibbsstatic __inline void
46497883Sgibbsahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb)
46597883Sgibbs{
46697883Sgibbs	/* What do we do to generically handle driver resource shortages??? */
46797883Sgibbs	if ((ahd->flags & AHD_RESOURCE_SHORTAGE) != 0
46897883Sgibbs	 && scb->io_ctx != NULL
46997883Sgibbs	 && (scb->io_ctx->ccb_h.status & CAM_RELEASE_SIMQ) == 0) {
47097883Sgibbs		scb->io_ctx->ccb_h.status |= CAM_RELEASE_SIMQ;
47197883Sgibbs		ahd->flags &= ~AHD_RESOURCE_SHORTAGE;
47297883Sgibbs	}
47397883Sgibbs	scb->io_ctx = NULL;
47497883Sgibbs}
47597883Sgibbs
47697883Sgibbs/********************************** PCI ***************************************/
47797883Sgibbs#ifdef AHD_PCI_CONFIG
47897883Sgibbsstatic __inline uint32_t ahd_pci_read_config(ahd_dev_softc_t pci,
47997883Sgibbs					     int reg, int width);
48097883Sgibbsstatic __inline void	 ahd_pci_write_config(ahd_dev_softc_t pci,
48197883Sgibbs					      int reg, uint32_t value,
48297883Sgibbs					      int width);
48397883Sgibbsstatic __inline int	 ahd_get_pci_function(ahd_dev_softc_t);
48497883Sgibbsstatic __inline int	 ahd_get_pci_slot(ahd_dev_softc_t);
48597883Sgibbsstatic __inline int	 ahd_get_pci_bus(ahd_dev_softc_t);
48697883Sgibbs
48797883Sgibbsint			 ahd_pci_map_registers(struct ahd_softc *ahd);
48897883Sgibbsint			 ahd_pci_map_int(struct ahd_softc *ahd);
48997883Sgibbs
49097883Sgibbsstatic __inline uint32_t
49197883Sgibbsahd_pci_read_config(ahd_dev_softc_t pci, int reg, int width)
49297883Sgibbs{
49397883Sgibbs	return (pci_read_config(pci, reg, width));
49497883Sgibbs}
49597883Sgibbs
49697883Sgibbsstatic __inline void
49797883Sgibbsahd_pci_write_config(ahd_dev_softc_t pci, int reg, uint32_t value, int width)
49897883Sgibbs{
49997883Sgibbs	pci_write_config(pci, reg, value, width);
50097883Sgibbs}
50197883Sgibbs
50297883Sgibbsstatic __inline int
50397883Sgibbsahd_get_pci_function(ahd_dev_softc_t pci)
50497883Sgibbs{
50597883Sgibbs	return (pci_get_function(pci));
50697883Sgibbs}
50797883Sgibbs
50897883Sgibbsstatic __inline int
50997883Sgibbsahd_get_pci_slot(ahd_dev_softc_t pci)
51097883Sgibbs{
51197883Sgibbs	return (pci_get_slot(pci));
51297883Sgibbs}
51397883Sgibbs
51497883Sgibbsstatic __inline int
51597883Sgibbsahd_get_pci_bus(ahd_dev_softc_t pci)
51697883Sgibbs{
51797883Sgibbs	return (pci_get_bus(pci));
51897883Sgibbs}
51997883Sgibbs
52097883Sgibbstypedef enum
52197883Sgibbs{
52297883Sgibbs	AHD_POWER_STATE_D0,
52397883Sgibbs	AHD_POWER_STATE_D1,
52497883Sgibbs	AHD_POWER_STATE_D2,
52597883Sgibbs	AHD_POWER_STATE_D3
52697883Sgibbs} ahd_power_state;
52797883Sgibbs
52897883Sgibbsvoid ahd_power_state_change(struct ahd_softc *ahd,
52997883Sgibbs			    ahd_power_state new_state);
53097883Sgibbs#endif
53197883Sgibbs/******************************** VL/EISA *************************************/
53297883Sgibbsint aic7770_map_registers(struct ahd_softc *ahd);
53397883Sgibbsint aic7770_map_int(struct ahd_softc *ahd, int irq);
53497883Sgibbs
53597883Sgibbs/********************************* Debug **************************************/
53697883Sgibbsstatic __inline void	ahd_print_path(struct ahd_softc *, struct scb *);
53797883Sgibbsstatic __inline void	ahd_platform_dump_card_state(struct ahd_softc *ahd);
53897883Sgibbs
53997883Sgibbsstatic __inline void
54097883Sgibbsahd_print_path(struct ahd_softc *ahd, struct scb *scb)
54197883Sgibbs{
54297883Sgibbs	xpt_print_path(scb->io_ctx->ccb_h.path);
54397883Sgibbs}
54497883Sgibbs
54597883Sgibbsstatic __inline void
54697883Sgibbsahd_platform_dump_card_state(struct ahd_softc *ahd)
54797883Sgibbs{
54897883Sgibbs	/* Nothing to do here for FreeBSD */
54997883Sgibbs}
55097883Sgibbs/**************************** Transfer Settings *******************************/
55197883Sgibbsvoid	  ahd_notify_xfer_settings_change(struct ahd_softc *,
55297883Sgibbs					  struct ahd_devinfo *);
55397883Sgibbsvoid	  ahd_platform_set_tags(struct ahd_softc *, struct ahd_devinfo *,
55497883Sgibbs				int /*enable*/);
55597883Sgibbs
55697883Sgibbs/************************* Initialization/Teardown ****************************/
55797883Sgibbsint	  ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);
55897883Sgibbsvoid	  ahd_platform_free(struct ahd_softc *ahd);
55997883Sgibbsint	  ahd_map_int(struct ahd_softc *ahd);
56097883Sgibbsint	  ahd_attach(struct ahd_softc *);
56197883Sgibbsint	  ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd);
56297883Sgibbsint	  ahd_detach(device_t);
56397883Sgibbs
56497883Sgibbs/****************************** Interrupts ************************************/
56597883Sgibbsvoid			ahd_platform_intr(void *);
56697883Sgibbsstatic __inline void	ahd_platform_flushwork(struct ahd_softc *ahd);
56797883Sgibbsstatic __inline void
56897883Sgibbsahd_platform_flushwork(struct ahd_softc *ahd)
56997883Sgibbs{
57097883Sgibbs}
57197883Sgibbs
57297883Sgibbs/************************ Misc Function Declarations **************************/
57397883Sgibbstimeout_t ahd_timeout;
57497883Sgibbsvoid	  ahd_done(struct ahd_softc *ahd, struct scb *scb);
57597883Sgibbsvoid	  ahd_send_async(struct ahd_softc *, char /*channel*/,
57697883Sgibbs			 u_int /*target*/, u_int /*lun*/, ac_code, void *arg);
57797883Sgibbs#endif  /* _AIC79XX_FREEBSD_H_ */
578