/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/*
 * Copyright (c) 2008 Weongyo Jeong
 * All rights reserved.
 *
 * 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,
 *    without modification.
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
 *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
 *    redistribution must be conditioned upon including a substantially
 *    similar Disclaimer requirement for further binary redistribution.
 *
 * NO WARRANTY
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES.
 */
#ifndef	_URTW_VAR_H
#define	_URTW_VAR_H

#ifdef __cplusplus
extern "C" {
#endif

#define	URTW_RX_DATA_LIST_COUNT	(2)
#define	URTW_TX_DATA_LIST_COUNT	(16)
#define	URTW_RX_MAXSIZE	(0x9c4)
#define	URTW_TX_MAXSIZE	URTW_RX_MAXSIZE

#define	UT_READ_VENDOR_DEVICE (USB_DEV_REQ_TYPE_VENDOR |\
	USB_DEV_REQ_DEV_TO_HOST)

#define	UT_WRITE_VENDOR_DEVICE (USB_DEV_REQ_TYPE_VENDOR |\
	USB_DEV_REQ_HOST_TO_DEV)

#define	USBD_INVAL (-1)
#define	URTW_TX_TIMEOUT	(5)

typedef int usbd_status;

#define	URTW_MAX_CHANNELS (15)
#define	LOW_PRIORITY_PIPE (0)
#define	NORMAL_PRIORITY_PIPE (1)
#define	URTW_LED_LINKOFF_BLINK	(1000*1000)
#define	URTW_LED_LINKON_BLINK	(300*1000)

struct urtw_rf {
	/* RF methods */
	usbd_status			(*init)(struct urtw_rf *);
	usbd_status			(*set_chan)(struct urtw_rf *, int);
	usbd_status			(*set_sens)(struct urtw_rf *);

	/* RF attributes */
	struct urtw_softc		*rf_sc;
	uint32_t			max_sens;
	int32_t				sens;
};

struct urtw_softc {
	struct ieee80211com	sc_ic;
	dev_info_t		*sc_dev;
	kmutex_t		sc_genlock;
	kmutex_t		tx_lock;
	kmutex_t		rx_lock;
	usb_client_dev_data_t	*sc_udev;
	usb_pipe_handle_t	sc_rxpipe;
	usb_pipe_handle_t	sc_txpipe_low;
	usb_pipe_handle_t	sc_txpipe_normal;

	int			sc_tx_low_queued;
	int 			sc_tx_normal_queued;
	int			rx_queued;
	timeout_id_t		sc_scan_id;
	uint32_t		sc_need_sched;
	int			dwelltime;
	/* kstats */
	uint32_t		sc_tx_nobuf;
	uint32_t		sc_rx_nobuf;
	uint32_t		sc_rx_err;

	int			sc_flags;
	int			sc_arg;
	int			(*sc_newstate)(struct ieee80211com *,
				    enum ieee80211_state, int);

	int				sc_epromtype;
#define	URTW_EEPROM_93C46		0
#define	URTW_EEPROM_93C56		1
	uint8_t				sc_crcmon;
	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];

	struct urtw_rf			sc_rf;

	/* for LED  */
	kmutex_t			sc_ledlock;
	timeout_id_t			sc_led_ch;
	uint8_t				sc_psr;
	uint8_t				sc_strategy;
	uint8_t				sc_led_freq;
#define	URTW_LED_GPIO			1
	uint8_t				sc_gpio_ledon;
	uint8_t				sc_gpio_ledinprogress;
	uint8_t				sc_gpio_ledstate;
	uint8_t				sc_gpio_ledpin;
	uint8_t				sc_gpio_blinktime;
	uint8_t				sc_gpio_blinkstate;
	uint8_t				sc_rts_retry;
	uint8_t				sc_tx_retry;
	uint8_t				sc_preamble_mode;
	int				sc_currate;
	/* TX power  */
	uint8_t				sc_txpwr_cck[URTW_MAX_CHANNELS];
	uint8_t				sc_txpwr_cck_base;
	uint8_t				sc_txpwr_ofdm[URTW_MAX_CHANNELS];
	uint8_t				sc_txpwr_ofdm_base;

	uint8_t				sc_hwrev;
	int				(*urtw_init)(void *);
};
#define	URTW_FLAG_RUNNING	(1 << 0)
#define	URTW_FLAG_SUSPEND	(1 << 1)
#define	URTW_FLAG_PLUGIN_ONLINE	(1 << 2)
#define	URTW_FLAG_HP		(1 << 3)

#define	URTW_IS_PLUGIN_ONLINE(_sc) \
	((_sc)->sc_flags & URTW_FLAG_PLUGIN_ONLINE)
#define	URTW_IS_RUNNING(_sc) \
	((_sc)->sc_flags & URTW_FLAG_RUNNING)
#define	URTW_IS_NOT_RUNNING(_sc) \
	(((_sc)->sc_flags & URTW_FLAG_RUNNING) == 0)
#define	URTW_IS_SUSPENDING(_sc)	((_sc)->sc_flags & URTW_FLAG_SUSPEND)

#define	URTW_LOCK(sc)		mutex_enter(&(sc)->sc_genlock)
#define	URTW_UNLOCK(sc)		mutex_exit(&(sc)->sc_genlock)
#define	URTW_LEDLOCK(sc)	mutex_enter(&(sc)->sc_ledlock)
#define	URTW_LEDUNLOCK(sc)	mutex_exit(&(sc)->sc_ledlock)

#ifdef __cplusplus
}
#endif

#endif /* _URTW_VAR_H */