/* orinoco.h
 *
 * Common definitions to all pieces of the various orinoco
 * drivers
 */

#ifndef _ORINOCO_H
#define _ORINOCO_H

#define DRIVER_VERSION "0.15"

#include <linux/interrupt.h>
#include <linux/suspend.h>
#include <linux/netdevice.h>
#include <linux/wireless.h>
#include <net/iw_handler.h>
#include <net/cfg80211.h>

#include "hermes.h"

/* To enable debug messages */
/*#define ORINOCO_DEBUG		3*/

#define WIRELESS_SPY		/* enable iwspy support */

#define MAX_SCAN_LEN		4096

#define ORINOCO_SEQ_LEN		8
#define ORINOCO_MAX_KEY_SIZE	14
#define ORINOCO_MAX_KEYS	4

struct orinoco_key {
	__le16 len;	/* always stored as little-endian */
	char data[ORINOCO_MAX_KEY_SIZE];
} __packed;

#define TKIP_KEYLEN	16
#define MIC_KEYLEN	8

struct orinoco_tkip_key {
	u8 tkip[TKIP_KEYLEN];
	u8 tx_mic[MIC_KEYLEN];
	u8 rx_mic[MIC_KEYLEN];
};

enum orinoco_alg {
	ORINOCO_ALG_NONE,
	ORINOCO_ALG_WEP,
	ORINOCO_ALG_TKIP
};

enum fwtype {
	FIRMWARE_TYPE_AGERE,
	FIRMWARE_TYPE_INTERSIL,
	FIRMWARE_TYPE_SYMBOL
};

struct firmware;

struct orinoco_private {
	void *card;	/* Pointer to card dependent structure */
	struct device *dev;
	int (*hard_reset)(struct orinoco_private *);
	int (*stop_fw)(struct orinoco_private *, int);

	struct ieee80211_supported_band band;
	struct ieee80211_channel channels[14];
	u32 cipher_suites[3];

	/* Synchronisation stuff */
	spinlock_t lock;
	int hw_unavailable;
	struct work_struct reset_work;

	/* Interrupt tasklets */
	struct tasklet_struct rx_tasklet;
	struct list_head rx_list;

	/* driver state */
	int open;
	u16 last_linkstatus;
	struct work_struct join_work;
	struct work_struct wevent_work;

	/* Net device stuff */
	struct net_device *ndev;
	struct iw_statistics wstats;

	/* Hardware control variables */
	struct hermes hw;
	u16 txfid;

	/* Capabilities of the hardware/firmware */
	enum fwtype firmware_type;
	int ibss_port;
	int nicbuf_size;
	u16 channel_mask;

	/* Boolean capabilities */
	unsigned int has_ibss:1;
	unsigned int has_port3:1;
	unsigned int has_wep:1;
	unsigned int has_big_wep:1;
	unsigned int has_mwo:1;
	unsigned int has_pm:1;
	unsigned int has_preamble:1;
	unsigned int has_sensitivity:1;
	unsigned int has_hostscan:1;
	unsigned int has_alt_txcntl:1;
	unsigned int has_ext_scan:1;
	unsigned int has_wpa:1;
	unsigned int do_fw_download:1;
	unsigned int broken_disableport:1;
	unsigned int broken_monitor:1;
	unsigned int prefer_port3:1;

	/* Configuration paramaters */
	enum nl80211_iftype iw_mode;
	enum orinoco_alg encode_alg;
	u16 wep_restrict, tx_key;
	struct key_params keys[ORINOCO_MAX_KEYS];

	int bitratemode;
	char nick[IW_ESSID_MAX_SIZE + 1];
	char desired_essid[IW_ESSID_MAX_SIZE + 1];
	char desired_bssid[ETH_ALEN];
	int bssid_fixed;
	u16 frag_thresh, mwo_robust;
	u16 channel;
	u16 ap_density, rts_thresh;
	u16 pm_on, pm_mcast, pm_period, pm_timeout;
	u16 preamble;
	u16 short_retry_limit, long_retry_limit;
	u16 retry_lifetime;
#ifdef WIRELESS_SPY
	struct iw_spy_data spy_data; /* iwspy support */
	struct iw_public_data	wireless_data;
#endif

	/* Configuration dependent variables */
	int port_type, createibss;
	int promiscuous, mc_count;

	/* Scanning support */
	struct cfg80211_scan_request *scan_request;
	struct work_struct process_scan;
	struct list_head scan_list;
	spinlock_t scan_lock; /* protects the scan list */

	/* WPA support */
	u8 *wpa_ie;
	int wpa_ie_len;

	struct crypto_shash *rx_tfm_mic;
	struct crypto_shash *tx_tfm_mic;

	unsigned int wpa_enabled:1;
	unsigned int tkip_cm_active:1;
	unsigned int key_mgmt:3;

#if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
	/* Cached in memory firmware to use during ->resume. */
	const struct firmware *cached_pri_fw;
	const struct firmware *cached_fw;
#endif

	struct notifier_block pm_notifier;
};

#ifdef ORINOCO_DEBUG
extern int orinoco_debug;
#define DEBUG(n, args...) do { \
	if (orinoco_debug > (n)) \
		printk(KERN_DEBUG args); \
} while (0)
#else
#define DEBUG(n, args...) do { } while (0)
#endif	/* ORINOCO_DEBUG */

/********************************************************************/
/* Exported prototypes                                              */
/********************************************************************/

struct orinoco_private *alloc_orinocodev(int sizeof_card, struct device *device,
					 int (*hard_reset)(struct orinoco_private *),
					 int (*stop_fw)(struct orinoco_private *, int));
void free_orinocodev(struct orinoco_private *priv);
int orinoco_init(struct orinoco_private *priv);
int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr,
		   unsigned int irq, const struct net_device_ops *ops);
void orinoco_if_del(struct orinoco_private *priv);
int orinoco_up(struct orinoco_private *priv);
void orinoco_down(struct orinoco_private *priv);
irqreturn_t orinoco_interrupt(int irq, void *dev_id);

void __orinoco_ev_info(struct net_device *dev, struct hermes *hw);
void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw);

int orinoco_process_xmit_skb(struct sk_buff *skb,
			     struct net_device *dev,
			     struct orinoco_private *priv,
			     int *tx_control,
			     u8 *mic);

/* Common ndo functions exported for reuse by orinoco_usb */
int orinoco_open(struct net_device *dev);
int orinoco_stop(struct net_device *dev);
void orinoco_set_multicast_list(struct net_device *dev);
int orinoco_change_mtu(struct net_device *dev, int new_mtu);
void orinoco_tx_timeout(struct net_device *dev);

/********************************************************************/
/* Locking and synchronization functions                            */
/********************************************************************/

static inline int orinoco_lock(struct orinoco_private *priv,
			       unsigned long *flags)
{
	priv->hw.ops->lock_irqsave(&priv->lock, flags);
	if (priv->hw_unavailable) {
		DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n",
		       priv->ndev);
		priv->hw.ops->unlock_irqrestore(&priv->lock, flags);
		return -EBUSY;
	}
	return 0;
}

static inline void orinoco_unlock(struct orinoco_private *priv,
				  unsigned long *flags)
{
	priv->hw.ops->unlock_irqrestore(&priv->lock, flags);
}

static inline void orinoco_lock_irq(struct orinoco_private *priv)
{
	priv->hw.ops->lock_irq(&priv->lock);
}

static inline void orinoco_unlock_irq(struct orinoco_private *priv)
{
	priv->hw.ops->unlock_irq(&priv->lock);
}

/*** Navigate from net_device to orinoco_private ***/
static inline struct orinoco_private *ndev_priv(struct net_device *dev)
{
	struct wireless_dev *wdev = netdev_priv(dev);
	return wdev_priv(wdev);
}
#endif /* _ORINOCO_H */
