NetBSD-5.0.2/sys/dev/pci/amrvar.h

/*	$NetBSD: amrvar.h,v 1.8 2008/04/28 20:23:54 martin Exp $	*/

/*-
 * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Andrew Doran.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef	_PCI_AMRVAR_H_
#define	_PCI_AMRVAR_H_

#define	AMR_MAX_UNITS		16
#define	AMR_WDOG_TICKS		(hz * 5)
#define	AMR_NCCB_RESV		2
#define	AMR_ENQUIRY_BUFSIZE	2048
#define	AMR_SGL_SIZE		(sizeof(struct amr_sgentry) * AMR_MAX_SEGS)
#define	AMR_TIMEOUT		30

/*
 * Logical drive information.
 */
struct amr_logdrive {
	u_int		al_size;
	u_short		al_state;
	u_short		al_properties;
	struct device	*al_dv;
};

/*
 * Per-controller state.
 */
struct amr_softc {
	struct device		amr_dv;
	bus_space_tag_t		amr_iot;
	bus_space_handle_t	amr_ioh;
	bus_size_t		amr_ios;
	bus_dma_tag_t		amr_dmat;
	pci_chipset_tag_t	amr_pc;
	void			*amr_ih;
	struct lwp		*amr_thread;
	int			amr_flags;

	struct amr_mailbox	*amr_mbox;
	bus_addr_t		amr_mbox_paddr;
	bus_dmamap_t		amr_dmamap;
        bus_dma_segment_t	amr_dmaseg;
        int			amr_dmasize;
        void			*amr_enqbuf;

	struct amr_sgentry	*amr_sgls;
	bus_addr_t		amr_sgls_paddr;

	struct amr_ccb		*amr_ccbs;
	SLIST_HEAD(, amr_ccb)	amr_ccb_freelist;
	SIMPLEQ_HEAD(, amr_ccb)	amr_ccb_queue;
	TAILQ_HEAD(, amr_ccb)	amr_ccb_active;
	int			amr_maxqueuecnt;

	int	(*amr_get_work)(struct amr_softc *, struct amr_mailbox_resp *);
	int	(*amr_submit)(struct amr_softc *sc, struct amr_ccb *);

	int			amr_numdrives;
	struct amr_logdrive	amr_drive[AMR_MAX_UNITS];
};

/* What resources are allocated? */
#define	AMRF_INTR		0x00000001
#define	AMRF_DMA_LOAD		0x00000002
#define	AMRF_DMA_MAP		0x00000004
#define	AMRF_DMA_ALLOC		0x00000008
#define	AMRF_DMA_CREATE		0x00000010
#define	AMRF_PCI_INTR		0x00000020
#define	AMRF_PCI_REGS		0x00000040
#define	AMRF_CCBS		0x00000080
#define	AMRF_ENQBUF		0x00000100
#define	AMRF_THREAD		0x00000200

/* General flags. */
#define	AMRF_THREAD_EXIT	0x00010000
#define	AMRF_OPEN		0x00020000

/*
 * Command control block.
 */
struct amr_ccb {
	union {
		SIMPLEQ_ENTRY(amr_ccb) simpleq;
		SLIST_ENTRY(amr_ccb) slist;
		TAILQ_ENTRY(amr_ccb) tailq;
	} ac_chain;

	u_int		ac_flags;
	u_int		ac_status;
	u_int		ac_ident;
	u_int		ac_xfer_size;
	time_t		ac_start_time;
	bus_dmamap_t	ac_xfer_map;
	void		(*ac_handler)(struct amr_ccb *);
	void 		*ac_context;
	struct device	*ac_dv;
	struct amr_mailbox_cmd	ac_cmd;
};
#define	AC_XFER_IN	0x01	/* Map describes inbound xfer */
#define	AC_XFER_OUT	0x02	/* Map describes outbound xfer */
#define	AC_COMPLETE	0x04	/* Command completed */
#define	AC_ACTIVE	0x08	/* Command active */
#define	AC_NOSGL	0x10	/* No scatter/gather list */
#define AC_MOAN		0x20	/* We have already moaned */

struct amr_attach_args {
	int		amra_unit;
};

int	amr_ccb_alloc(struct amr_softc *, struct amr_ccb **);
void	amr_ccb_enqueue(struct amr_softc *, struct amr_ccb *);
void	amr_ccb_free(struct amr_softc *, struct amr_ccb *);
int	amr_ccb_map(struct amr_softc *, struct amr_ccb *, void *, int, int);
int	amr_ccb_poll(struct amr_softc *, struct amr_ccb *, int);
void	amr_ccb_unmap(struct amr_softc *, struct amr_ccb *);
int	amr_ccb_wait(struct amr_softc *, struct amr_ccb *);
const char	*amr_drive_state(int, int *);

extern int	amr_max_xfer;

#endif	/* !_PCI_AMRVAR_H_ */