/*
 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
 * Copyright (c) 2006 Sam Leffler, Errno Consulting
 * Copyright (c) 2007 Christoph Hellwig <hch@lst.de>
 * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org>
 * Copyright (c) 2012 Pontus Fuchs <pontus.fuchs@gmail.com>
 *
 * 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.
 */

#define AR5523_FLAG_PRE_FIRMWARE	(1 << 0)
#define AR5523_FLAG_ABG			(1 << 1)

#define AR5523_FIRMWARE_FILE	"ar5523.bin"

#define AR5523_CMD_TX_PIPE	0x01
#define	AR5523_DATA_TX_PIPE	0x02
#define	AR5523_CMD_RX_PIPE	0x81
#define	AR5523_DATA_RX_PIPE	0x82

#define ar5523_cmd_tx_pipe(dev) \
	usb_sndbulkpipe((dev), AR5523_CMD_TX_PIPE)
#define ar5523_data_tx_pipe(dev) \
	usb_sndbulkpipe((dev), AR5523_DATA_TX_PIPE)
#define ar5523_cmd_rx_pipe(dev) \
	usb_rcvbulkpipe((dev), AR5523_CMD_RX_PIPE)
#define ar5523_data_rx_pipe(dev) \
	usb_rcvbulkpipe((dev), AR5523_DATA_RX_PIPE)

#define	AR5523_DATA_TIMEOUT	10000
#define	AR5523_CMD_TIMEOUT	1000

#define AR5523_TX_DATA_COUNT		8
#define AR5523_TX_DATA_RESTART_COUNT	2
#define AR5523_RX_DATA_COUNT		16
#define AR5523_RX_DATA_REFILL_COUNT	8

#define AR5523_CMD_ID	1
#define AR5523_DATA_ID	2

#define AR5523_TX_WD_TIMEOUT	(HZ * 2)
#define AR5523_FLUSH_TIMEOUT	(HZ * 3)

enum AR5523_flags {
	AR5523_HW_UP,
	AR5523_USB_DISCONNECTED,
	AR5523_CONNECTED
};

struct ar5523_tx_cmd {
	struct ar5523		*ar;
	struct urb		*urb_tx;
	void			*buf_tx;
	void			*odata;
	int			olen;
	int			flags;
	int			res;
	struct completion	done;
};

/* This struct is placed in tx_info->driver_data. It must not be larger
 *  than IEEE80211_TX_INFO_DRIVER_DATA_SIZE.
 */
struct ar5523_tx_data {
	struct list_head	list;
	struct ar5523		*ar;
	struct urb		*urb;
};

struct ar5523_rx_data {
	struct	list_head	list;
	struct ar5523		*ar;
	struct urb		*urb;
	struct sk_buff		*skb;
};

struct ar5523 {
	struct usb_device	*dev;
	struct ieee80211_hw	*hw;

	unsigned long		flags;
	struct mutex		mutex;
	struct workqueue_struct *wq;

	struct ar5523_tx_cmd	tx_cmd;

	struct delayed_work	stat_work;

	struct timer_list	tx_wd_timer;
	struct work_struct	tx_wd_work;
	struct work_struct	tx_work;
	struct list_head	tx_queue_pending;
	struct list_head	tx_queue_submitted;
	spinlock_t		tx_data_list_lock;
	wait_queue_head_t	tx_flush_waitq;

	/* Queued + Submitted TX frames */
	atomic_t		tx_nr_total;

	/* Submitted TX frames */
	atomic_t		tx_nr_pending;

	void			*rx_cmd_buf;
	struct urb		*rx_cmd_urb;

	struct ar5523_rx_data	rx_data[AR5523_RX_DATA_COUNT];
	spinlock_t		rx_data_list_lock;
	struct list_head	rx_data_free;
	struct list_head	rx_data_used;
	atomic_t		rx_data_free_cnt;

	struct work_struct	rx_refill_work;

	unsigned int		rxbufsz;
	u8			serial[16];

	struct ieee80211_channel channels[14];
	struct ieee80211_rate	rates[12];
	struct ieee80211_supported_band band;
	struct ieee80211_vif	*vif;
};

/* flags for sending firmware commands */
#define AR5523_CMD_FLAG_READ	(1 << 1)
#define AR5523_CMD_FLAG_MAGIC	(1 << 2)

#define ar5523_dbg(ar, format, arg...) \
	dev_dbg(&(ar)->dev->dev, format, ## arg)

/* On USB hot-unplug there can be a lot of URBs in flight and they'll all
 * fail. Instead of dealing with them in every possible place just surpress
 * any messages on USB disconnect.
 */
#define ar5523_err(ar, format, arg...) \
do { \
	if (!test_bit(AR5523_USB_DISCONNECTED, &ar->flags)) { \
		dev_err(&(ar)->dev->dev, format, ## arg); \
	} \
} while (0)
#define ar5523_info(ar, format, arg...)	\
	dev_info(&(ar)->dev->dev, format, ## arg)
