/*
 * Copyright (c) 2010 Broadcom Corporation
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _BRCM_SCB_H_
#define _BRCM_SCB_H_

#include <linux/if_ether.h>
#include <brcmu_utils.h>
#include <defs.h>
#include "types.h"

#define AMPDU_TX_BA_MAX_WSIZE	64	/* max Tx ba window size (in pdu) */

#define AMPDU_MAX_SCB_TID	NUMPRIO

/* scb flags */
#define SCB_WMECAP		0x0040
#define SCB_HTCAP		0x10000	/* HT (MIMO) capable device */
#define SCB_IS40		0x80000	/* 40MHz capable */
#define SCB_STBCCAP		0x40000000	/* STBC Capable */

#define SCB_MAGIC	0xbeefcafe

/* structure to store per-tid state for the ampdu initiator */
struct scb_ampdu_tid_ini {
	/* tx retry count; indexed by seq modulo */
	u8 txretry[AMPDU_TX_BA_MAX_WSIZE];
};

struct scb_ampdu {
	u8 max_pdu;		/* max pdus allowed in ampdu */
	u8 release;		/* # of mpdus released at a time */
	u32 max_rx_ampdu_bytes;	/* max ampdu rcv length; 8k, 16k, 32k, 64k */

	/*
	 * This could easily be a ini[] pointer and we keep this info in wl
	 * itself instead of having mac80211 hold it for us. Also could be made
	 * dynamic per tid instead of static.
	 */
	/* initiator info - per tid (NUMPRIO): */
	struct scb_ampdu_tid_ini ini[AMPDU_MAX_SCB_TID];
};

/* station control block - one per remote MAC address */
struct scb {
	u32 magic;
	u32 flags;	/* various bit flags as defined below */
	u16 seqctl[NUMPRIO];	/* seqctl of last received frame (for dups) */
	u16 seqnum[NUMPRIO];/* WME: driver maintained sw seqnum per priority */

	struct scb_ampdu scb_ampdu;	/* AMPDU state including per tid info */
};

#endif				/* _BRCM_SCB_H_ */
