if_ath_alq.h revision 250619
155682Smarkm/*-
2102644Snectar * Copyright (c) 2012 Adrian Chadd
355682Smarkm * All rights reserved.
455682Smarkm *
555682Smarkm * Redistribution and use in source and binary forms, with or without
655682Smarkm * modification, are permitted provided that the following conditions
755682Smarkm * are met:
855682Smarkm * 1. Redistributions of source code must retain the above copyright
955682Smarkm *    notice, this list of conditions and the following disclaimer,
1055682Smarkm *    without modification.
1155682Smarkm * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1255682Smarkm *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
1355682Smarkm *    redistribution must be conditioned upon including a substantially
1455682Smarkm *    similar Disclaimer requirement for further binary redistribution.
1555682Smarkm *
1655682Smarkm * NO WARRANTY
1755682Smarkm * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1855682Smarkm * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1955682Smarkm * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
2055682Smarkm * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
2155682Smarkm * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
2255682Smarkm * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2355682Smarkm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2455682Smarkm * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2555682Smarkm * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2655682Smarkm * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2755682Smarkm * THE POSSIBILITY OF SUCH DAMAGES.
2855682Smarkm *
2955682Smarkm * $FreeBSD: head/sys/dev/ath/if_ath_alq.h 250619 2013-05-13 21:18:00Z adrian $
3055682Smarkm */
3155682Smarkm#ifndef	__IF_ATH_ALQ_H__
3255682Smarkm#define	__IF_ATH_ALQ_H__
3355682Smarkm
3455682Smarkm#define	ATH_ALQ_INIT_STATE		1
3555682Smarkmstruct if_ath_alq_init_state {
36102644Snectar	uint32_t	sc_mac_version;
3755682Smarkm	uint32_t	sc_mac_revision;
3855682Smarkm	uint32_t	sc_phy_rev;
3955682Smarkm	uint32_t	sc_hal_magic;
4055682Smarkm};
4155682Smarkm
4255682Smarkm#define	ATH_ALQ_EDMA_TXSTATUS		2
4355682Smarkm#define	ATH_ALQ_EDMA_RXSTATUS		3
4455682Smarkm#define	ATH_ALQ_EDMA_TXDESC		4
4555682Smarkm
4655682Smarkm#define	ATH_ALQ_TDMA_BEACON_STATE	5
4755682Smarkmstruct if_ath_alq_tdma_beacon_state {
4855682Smarkm	uint64_t	rx_tsf;		/* RX TSF of beacon frame */
4955682Smarkm	uint64_t	beacon_tsf;	/* TSF inside beacon frame */
5055682Smarkm	uint64_t	tsf64;
5155682Smarkm	uint64_t	nextslot_tsf;
5255682Smarkm	uint32_t	nextslot_tu;
5355682Smarkm	uint32_t	txtime;
5455682Smarkm};
5555682Smarkm
5655682Smarkm#define	ATH_ALQ_TDMA_TIMER_CONFIG	6
5755682Smarkmstruct if_ath_alq_tdma_timer_config {
5855682Smarkm	uint32_t	tdma_slot;
5955682Smarkm	uint32_t	tdma_slotlen;
6055682Smarkm	uint32_t	tdma_slotcnt;
61102644Snectar	uint32_t	tdma_bintval;
6255682Smarkm	uint32_t	tdma_guard;
6355682Smarkm	uint32_t	tdma_scbintval;
6455682Smarkm	uint32_t	tdma_dbaprep;
6555682Smarkm};
6655682Smarkm
6755682Smarkm#define	ATH_ALQ_TDMA_SLOT_CALC		7
6855682Smarkmstruct if_ath_alq_tdma_slot_calc {
6955682Smarkm	uint64_t	nexttbtt;
7055682Smarkm	uint64_t	next_slot;
7155682Smarkm	int32_t		tsfdelta;
7255682Smarkm	int32_t		avg_plus;
7355682Smarkm	int32_t		avg_minus;
7455682Smarkm};
7555682Smarkm
7655682Smarkm#define	ATH_ALQ_TDMA_TSF_ADJUST		8
7755682Smarkmstruct if_ath_alq_tdma_tsf_adjust {
7855682Smarkm	uint64_t	tsf64_old;
7955682Smarkm	uint64_t	tsf64_new;
8055682Smarkm	int32_t		tsfdelta;
8155682Smarkm};
8278527Sassar
8355682Smarkm#define	ATH_ALQ_TDMA_TIMER_SET		9
8455682Smarkmstruct if_ath_alq_tdma_timer_set {
8555682Smarkm	uint32_t	bt_intval;
8655682Smarkm	uint32_t	bt_nexttbtt;
8755682Smarkm	uint32_t	bt_nextdba;
8855682Smarkm	uint32_t	bt_nextswba;
8955682Smarkm	uint32_t	bt_nextatim;
9055682Smarkm	uint32_t	bt_flags;
9155682Smarkm	uint32_t	sc_tdmadbaprep;
9255682Smarkm	uint32_t	sc_tdmaswbaprep;
9355682Smarkm};
9455682Smarkm
9578527Sassar#define	ATH_ALQ_INTR_STATUS		10
9678527Sassarstruct if_ath_alq_interrupt {
97102644Snectar	uint32_t	intr_status;
9878527Sassar	uint32_t	intr_state[8];
9978527Sassar	uint32_t	intr_syncstate;
10078527Sassar};
10155682Smarkm
10255682Smarkm#define	ATH_ALQ_MIB_COUNTERS		11
10355682Smarkmstruct if_ath_alq_mib_counters {
10455682Smarkm	uint32_t	valid;
10555682Smarkm	uint32_t	tx_busy;
10655682Smarkm	uint32_t	rx_busy;
10755682Smarkm	uint32_t	chan_busy;
10855682Smarkm	uint32_t	ext_chan_busy;
10955682Smarkm	uint32_t	cycle_count;
11055682Smarkm};
11155682Smarkm
11255682Smarkm#define	ATH_ALQ_MISSED_BEACON		12
11355682Smarkm#define	ATH_ALQ_STUCK_BEACON		13
11455682Smarkm#define	ATH_ALQ_RESUME_BEACON		14
11555682Smarkm
11655682Smarkm/*
11755682Smarkm * These will always be logged, regardless.
11855682Smarkm */
11955682Smarkm#define	ATH_ALQ_LOG_ALWAYS_MASK		0x00000001
12055682Smarkm
12155682Smarkm#define	ATH_ALQ_FILENAME_LEN	128
12255682Smarkm#define	ATH_ALQ_DEVNAME_LEN	32
12355682Smarkm
12455682Smarkmstruct if_ath_alq {
12555682Smarkm	uint32_t	sc_alq_debug;		/* Debug flags to report */
12655682Smarkm	struct alq *	sc_alq_alq;		/* alq state */
12755682Smarkm	unsigned int	sc_alq_qsize;		/* queue size */
12855682Smarkm	unsigned int	sc_alq_numlost;		/* number of "lost" entries */
12955682Smarkm	int		sc_alq_isactive;
13055682Smarkm	char		sc_alq_devname[ATH_ALQ_DEVNAME_LEN];
13155682Smarkm	char		sc_alq_filename[ATH_ALQ_FILENAME_LEN];
13255682Smarkm	struct if_ath_alq_init_state sc_alq_cfg;
13355682Smarkm};
13455682Smarkm
13555682Smarkm/* 128 bytes in total */
13655682Smarkm#define	ATH_ALQ_PAYLOAD_LEN		112
13755682Smarkm
13855682Smarkmstruct if_ath_alq_hdr {
13955682Smarkm	uint64_t	threadid;
14055682Smarkm	uint32_t	tstamp_sec;
14155682Smarkm	uint32_t	tstamp_usec;
14255682Smarkm	uint16_t	op;
14355682Smarkm	uint16_t	len;	/* Length of (optional) payload */
14455682Smarkm};
14555682Smarkm
14655682Smarkmstruct if_ath_alq_payload {
14755682Smarkm	struct if_ath_alq_hdr hdr;
14855682Smarkm	char		payload[];
14955682Smarkm};
15055682Smarkm
15155682Smarkm#ifdef	_KERNEL
15255682Smarkmstatic inline int
15355682Smarkmif_ath_alq_checkdebug(struct if_ath_alq *alq, uint16_t op)
15455682Smarkm{
15557416Smarkm
15657416Smarkm	return ((alq->sc_alq_debug | ATH_ALQ_LOG_ALWAYS_MASK)
15755682Smarkm	    & (1 << (op - 1)));
15855682Smarkm}
15955682Smarkm
16055682Smarkmextern	void if_ath_alq_init(struct if_ath_alq *alq, const char *devname);
16155682Smarkmextern	void if_ath_alq_setcfg(struct if_ath_alq *alq, uint32_t macVer,
16257416Smarkm	    uint32_t macRev, uint32_t phyRev, uint32_t halMagic);
16355682Smarkmextern	void if_ath_alq_tidyup(struct if_ath_alq *alq);
16455682Smarkmextern	int if_ath_alq_start(struct if_ath_alq *alq);
16555682Smarkmextern	int if_ath_alq_stop(struct if_ath_alq *alq);
16655682Smarkmextern	void if_ath_alq_post(struct if_ath_alq *alq, uint16_t op,
16755682Smarkm	    uint16_t len, const char *buf);
16855682Smarkm
16955682Smarkm/* XXX maybe doesn't belong here? */
17055682Smarkmstatic inline void
17155682Smarkmif_ath_alq_post_intr(struct if_ath_alq *alq, uint32_t status,
17255682Smarkm    uint32_t *state, uint32_t sync_state)
17355682Smarkm{
17455682Smarkm	int i;
17555682Smarkm	struct if_ath_alq_interrupt intr;
17655682Smarkm
17755682Smarkm	if (! if_ath_alq_checkdebug(alq, ATH_ALQ_INTR_STATUS))
17855682Smarkm		return;
17955682Smarkm
18055682Smarkm	intr.intr_status = htobe32(status);
18155682Smarkm	for (i = 0; i < 8; i++)
18255682Smarkm		intr.intr_state[i] = htobe32(state[i]);
18355682Smarkm	intr.intr_syncstate = htobe32(sync_state);
18455682Smarkm
18555682Smarkm	if_ath_alq_post(alq, ATH_ALQ_INTR_STATUS, sizeof(intr),
18657416Smarkm	    (const char *) &intr);
18755682Smarkm}
18855682Smarkm
18955682Smarkm#endif	/* _KERNEL */
19055682Smarkm
19155682Smarkm#endif
19278527Sassar