xref: /openbmc/linux/drivers/net/wireless/intersil/orinoco/orinoco.h (revision 8dd06ef34b6e2f41b29fbf5fc1663780f2524285)
12be45b66SKalle Valo /* orinoco.h
22be45b66SKalle Valo  *
32be45b66SKalle Valo  * Common definitions to all pieces of the various orinoco
42be45b66SKalle Valo  * drivers
52be45b66SKalle Valo  */
62be45b66SKalle Valo 
72be45b66SKalle Valo #ifndef _ORINOCO_H
82be45b66SKalle Valo #define _ORINOCO_H
92be45b66SKalle Valo 
102be45b66SKalle Valo #define DRIVER_VERSION "0.15"
112be45b66SKalle Valo 
122be45b66SKalle Valo #include <linux/interrupt.h>
132be45b66SKalle Valo #include <linux/suspend.h>
142be45b66SKalle Valo #include <linux/netdevice.h>
152be45b66SKalle Valo #include <linux/wireless.h>
162be45b66SKalle Valo #include <net/iw_handler.h>
172be45b66SKalle Valo #include <net/cfg80211.h>
182be45b66SKalle Valo 
192be45b66SKalle Valo #include "hermes.h"
202be45b66SKalle Valo 
212be45b66SKalle Valo /* To enable debug messages */
222be45b66SKalle Valo /*#define ORINOCO_DEBUG		3*/
232be45b66SKalle Valo 
242be45b66SKalle Valo #define WIRELESS_SPY		/* enable iwspy support */
252be45b66SKalle Valo 
262be45b66SKalle Valo #define MAX_SCAN_LEN		4096
272be45b66SKalle Valo 
282be45b66SKalle Valo #define ORINOCO_SEQ_LEN		8
292be45b66SKalle Valo #define ORINOCO_MAX_KEY_SIZE	14
302be45b66SKalle Valo #define ORINOCO_MAX_KEYS	4
312be45b66SKalle Valo 
322be45b66SKalle Valo struct orinoco_key {
332be45b66SKalle Valo 	__le16 len;	/* always stored as little-endian */
342be45b66SKalle Valo 	char data[ORINOCO_MAX_KEY_SIZE];
352be45b66SKalle Valo } __packed;
362be45b66SKalle Valo 
372be45b66SKalle Valo #define TKIP_KEYLEN	16
382be45b66SKalle Valo #define MIC_KEYLEN	8
392be45b66SKalle Valo 
402be45b66SKalle Valo struct orinoco_tkip_key {
412be45b66SKalle Valo 	u8 tkip[TKIP_KEYLEN];
422be45b66SKalle Valo 	u8 tx_mic[MIC_KEYLEN];
432be45b66SKalle Valo 	u8 rx_mic[MIC_KEYLEN];
442be45b66SKalle Valo };
452be45b66SKalle Valo 
462be45b66SKalle Valo enum orinoco_alg {
472be45b66SKalle Valo 	ORINOCO_ALG_NONE,
482be45b66SKalle Valo 	ORINOCO_ALG_WEP,
492be45b66SKalle Valo 	ORINOCO_ALG_TKIP
502be45b66SKalle Valo };
512be45b66SKalle Valo 
522be45b66SKalle Valo enum fwtype {
532be45b66SKalle Valo 	FIRMWARE_TYPE_AGERE,
542be45b66SKalle Valo 	FIRMWARE_TYPE_INTERSIL,
552be45b66SKalle Valo 	FIRMWARE_TYPE_SYMBOL
562be45b66SKalle Valo };
572be45b66SKalle Valo 
582be45b66SKalle Valo struct firmware;
592be45b66SKalle Valo 
602be45b66SKalle Valo struct orinoco_private {
612be45b66SKalle Valo 	void *card;	/* Pointer to card dependent structure */
622be45b66SKalle Valo 	struct device *dev;
632be45b66SKalle Valo 	int (*hard_reset)(struct orinoco_private *);
642be45b66SKalle Valo 	int (*stop_fw)(struct orinoco_private *, int);
652be45b66SKalle Valo 
662be45b66SKalle Valo 	struct ieee80211_supported_band band;
672be45b66SKalle Valo 	struct ieee80211_channel channels[14];
682be45b66SKalle Valo 	u32 cipher_suites[3];
692be45b66SKalle Valo 
702be45b66SKalle Valo 	/* Synchronisation stuff */
712be45b66SKalle Valo 	spinlock_t lock;
722be45b66SKalle Valo 	int hw_unavailable;
732be45b66SKalle Valo 	struct work_struct reset_work;
742be45b66SKalle Valo 
752be45b66SKalle Valo 	/* Interrupt tasklets */
762be45b66SKalle Valo 	struct tasklet_struct rx_tasklet;
772be45b66SKalle Valo 	struct list_head rx_list;
782be45b66SKalle Valo 
792be45b66SKalle Valo 	/* driver state */
802be45b66SKalle Valo 	int open;
812be45b66SKalle Valo 	u16 last_linkstatus;
822be45b66SKalle Valo 	struct work_struct join_work;
832be45b66SKalle Valo 	struct work_struct wevent_work;
842be45b66SKalle Valo 
852be45b66SKalle Valo 	/* Net device stuff */
862be45b66SKalle Valo 	struct net_device *ndev;
872be45b66SKalle Valo 	struct iw_statistics wstats;
882be45b66SKalle Valo 
892be45b66SKalle Valo 	/* Hardware control variables */
902be45b66SKalle Valo 	struct hermes hw;
912be45b66SKalle Valo 	u16 txfid;
922be45b66SKalle Valo 
932be45b66SKalle Valo 	/* Capabilities of the hardware/firmware */
942be45b66SKalle Valo 	enum fwtype firmware_type;
952be45b66SKalle Valo 	int ibss_port;
962be45b66SKalle Valo 	int nicbuf_size;
972be45b66SKalle Valo 	u16 channel_mask;
982be45b66SKalle Valo 
992be45b66SKalle Valo 	/* Boolean capabilities */
1002be45b66SKalle Valo 	unsigned int has_ibss:1;
1012be45b66SKalle Valo 	unsigned int has_port3:1;
1022be45b66SKalle Valo 	unsigned int has_wep:1;
1032be45b66SKalle Valo 	unsigned int has_big_wep:1;
1042be45b66SKalle Valo 	unsigned int has_mwo:1;
1052be45b66SKalle Valo 	unsigned int has_pm:1;
1062be45b66SKalle Valo 	unsigned int has_preamble:1;
1072be45b66SKalle Valo 	unsigned int has_sensitivity:1;
1082be45b66SKalle Valo 	unsigned int has_hostscan:1;
1092be45b66SKalle Valo 	unsigned int has_alt_txcntl:1;
1102be45b66SKalle Valo 	unsigned int has_ext_scan:1;
1112be45b66SKalle Valo 	unsigned int has_wpa:1;
1122be45b66SKalle Valo 	unsigned int do_fw_download:1;
1132be45b66SKalle Valo 	unsigned int broken_disableport:1;
1142be45b66SKalle Valo 	unsigned int broken_monitor:1;
1152be45b66SKalle Valo 	unsigned int prefer_port3:1;
1162be45b66SKalle Valo 
1172be45b66SKalle Valo 	/* Configuration paramaters */
1182be45b66SKalle Valo 	enum nl80211_iftype iw_mode;
1192be45b66SKalle Valo 	enum orinoco_alg encode_alg;
1202be45b66SKalle Valo 	u16 wep_restrict, tx_key;
1212be45b66SKalle Valo 	struct key_params keys[ORINOCO_MAX_KEYS];
1222be45b66SKalle Valo 
1232be45b66SKalle Valo 	int bitratemode;
1242be45b66SKalle Valo 	char nick[IW_ESSID_MAX_SIZE + 1];
1252be45b66SKalle Valo 	char desired_essid[IW_ESSID_MAX_SIZE + 1];
1262be45b66SKalle Valo 	char desired_bssid[ETH_ALEN];
1272be45b66SKalle Valo 	int bssid_fixed;
1282be45b66SKalle Valo 	u16 frag_thresh, mwo_robust;
1292be45b66SKalle Valo 	u16 channel;
1302be45b66SKalle Valo 	u16 ap_density, rts_thresh;
1312be45b66SKalle Valo 	u16 pm_on, pm_mcast, pm_period, pm_timeout;
1322be45b66SKalle Valo 	u16 preamble;
1332be45b66SKalle Valo 	u16 short_retry_limit, long_retry_limit;
1342be45b66SKalle Valo 	u16 retry_lifetime;
1352be45b66SKalle Valo #ifdef WIRELESS_SPY
1362be45b66SKalle Valo 	struct iw_spy_data spy_data; /* iwspy support */
1372be45b66SKalle Valo 	struct iw_public_data	wireless_data;
1382be45b66SKalle Valo #endif
1392be45b66SKalle Valo 
1402be45b66SKalle Valo 	/* Configuration dependent variables */
1412be45b66SKalle Valo 	int port_type, createibss;
1422be45b66SKalle Valo 	int promiscuous, mc_count;
1432be45b66SKalle Valo 
1442be45b66SKalle Valo 	/* Scanning support */
1452be45b66SKalle Valo 	struct cfg80211_scan_request *scan_request;
1462be45b66SKalle Valo 	struct work_struct process_scan;
1472be45b66SKalle Valo 	struct list_head scan_list;
1482be45b66SKalle Valo 	spinlock_t scan_lock; /* protects the scan list */
1492be45b66SKalle Valo 
1502be45b66SKalle Valo 	/* WPA support */
1512be45b66SKalle Valo 	u8 *wpa_ie;
1522be45b66SKalle Valo 	int wpa_ie_len;
1532be45b66SKalle Valo 
1541fef293bSAndrew Lutomirski 	struct crypto_shash *rx_tfm_mic;
1551fef293bSAndrew Lutomirski 	struct crypto_shash *tx_tfm_mic;
1562be45b66SKalle Valo 
1572be45b66SKalle Valo 	unsigned int wpa_enabled:1;
1582be45b66SKalle Valo 	unsigned int tkip_cm_active:1;
1592be45b66SKalle Valo 	unsigned int key_mgmt:3;
1602be45b66SKalle Valo 
1612be45b66SKalle Valo #if defined(CONFIG_HERMES_CACHE_FW_ON_INIT) || defined(CONFIG_PM_SLEEP)
1622be45b66SKalle Valo 	/* Cached in memory firmware to use during ->resume. */
1632be45b66SKalle Valo 	const struct firmware *cached_pri_fw;
1642be45b66SKalle Valo 	const struct firmware *cached_fw;
1652be45b66SKalle Valo #endif
1662be45b66SKalle Valo 
1672be45b66SKalle Valo 	struct notifier_block pm_notifier;
1682be45b66SKalle Valo };
1692be45b66SKalle Valo 
1702be45b66SKalle Valo #ifdef ORINOCO_DEBUG
1712be45b66SKalle Valo extern int orinoco_debug;
1722be45b66SKalle Valo #define DEBUG(n, args...) do { \
1732be45b66SKalle Valo 	if (orinoco_debug > (n)) \
1742be45b66SKalle Valo 		printk(KERN_DEBUG args); \
1752be45b66SKalle Valo } while (0)
1762be45b66SKalle Valo #else
1772be45b66SKalle Valo #define DEBUG(n, args...) do { } while (0)
1782be45b66SKalle Valo #endif	/* ORINOCO_DEBUG */
1792be45b66SKalle Valo 
1802be45b66SKalle Valo /********************************************************************/
1812be45b66SKalle Valo /* Exported prototypes                                              */
1822be45b66SKalle Valo /********************************************************************/
1832be45b66SKalle Valo 
1842be45b66SKalle Valo struct orinoco_private *alloc_orinocodev(int sizeof_card, struct device *device,
1852be45b66SKalle Valo 					 int (*hard_reset)(struct orinoco_private *),
1862be45b66SKalle Valo 					 int (*stop_fw)(struct orinoco_private *, int));
1872be45b66SKalle Valo void free_orinocodev(struct orinoco_private *priv);
1882be45b66SKalle Valo int orinoco_init(struct orinoco_private *priv);
1892be45b66SKalle Valo int orinoco_if_add(struct orinoco_private *priv, unsigned long base_addr,
1902be45b66SKalle Valo 		   unsigned int irq, const struct net_device_ops *ops);
1912be45b66SKalle Valo void orinoco_if_del(struct orinoco_private *priv);
1922be45b66SKalle Valo int orinoco_up(struct orinoco_private *priv);
1932be45b66SKalle Valo void orinoco_down(struct orinoco_private *priv);
1942be45b66SKalle Valo irqreturn_t orinoco_interrupt(int irq, void *dev_id);
1952be45b66SKalle Valo 
1962be45b66SKalle Valo void __orinoco_ev_info(struct net_device *dev, struct hermes *hw);
1972be45b66SKalle Valo void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw);
1982be45b66SKalle Valo 
1992be45b66SKalle Valo int orinoco_process_xmit_skb(struct sk_buff *skb,
2002be45b66SKalle Valo 			     struct net_device *dev,
2012be45b66SKalle Valo 			     struct orinoco_private *priv,
2022be45b66SKalle Valo 			     int *tx_control,
2032be45b66SKalle Valo 			     u8 *mic);
2042be45b66SKalle Valo 
2052be45b66SKalle Valo /* Common ndo functions exported for reuse by orinoco_usb */
2062be45b66SKalle Valo int orinoco_open(struct net_device *dev);
2072be45b66SKalle Valo int orinoco_stop(struct net_device *dev);
2082be45b66SKalle Valo void orinoco_set_multicast_list(struct net_device *dev);
2092be45b66SKalle Valo int orinoco_change_mtu(struct net_device *dev, int new_mtu);
210*0290bd29SMichael S. Tsirkin void orinoco_tx_timeout(struct net_device *dev, unsigned int txqueue);
2112be45b66SKalle Valo 
2122be45b66SKalle Valo /********************************************************************/
2132be45b66SKalle Valo /* Locking and synchronization functions                            */
2142be45b66SKalle Valo /********************************************************************/
2152be45b66SKalle Valo 
orinoco_lock(struct orinoco_private * priv,unsigned long * flags)2162be45b66SKalle Valo static inline int orinoco_lock(struct orinoco_private *priv,
2172be45b66SKalle Valo 			       unsigned long *flags)
2182be45b66SKalle Valo {
2192be45b66SKalle Valo 	priv->hw.ops->lock_irqsave(&priv->lock, flags);
2202be45b66SKalle Valo 	if (priv->hw_unavailable) {
2212be45b66SKalle Valo 		DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n",
2222be45b66SKalle Valo 		       priv->ndev);
2232be45b66SKalle Valo 		priv->hw.ops->unlock_irqrestore(&priv->lock, flags);
2242be45b66SKalle Valo 		return -EBUSY;
2252be45b66SKalle Valo 	}
2262be45b66SKalle Valo 	return 0;
2272be45b66SKalle Valo }
2282be45b66SKalle Valo 
orinoco_unlock(struct orinoco_private * priv,unsigned long * flags)2292be45b66SKalle Valo static inline void orinoco_unlock(struct orinoco_private *priv,
2302be45b66SKalle Valo 				  unsigned long *flags)
2312be45b66SKalle Valo {
2322be45b66SKalle Valo 	priv->hw.ops->unlock_irqrestore(&priv->lock, flags);
2332be45b66SKalle Valo }
2342be45b66SKalle Valo 
orinoco_lock_irq(struct orinoco_private * priv)2352be45b66SKalle Valo static inline void orinoco_lock_irq(struct orinoco_private *priv)
2362be45b66SKalle Valo {
2372be45b66SKalle Valo 	priv->hw.ops->lock_irq(&priv->lock);
2382be45b66SKalle Valo }
2392be45b66SKalle Valo 
orinoco_unlock_irq(struct orinoco_private * priv)2402be45b66SKalle Valo static inline void orinoco_unlock_irq(struct orinoco_private *priv)
2412be45b66SKalle Valo {
2422be45b66SKalle Valo 	priv->hw.ops->unlock_irq(&priv->lock);
2432be45b66SKalle Valo }
2442be45b66SKalle Valo 
2452be45b66SKalle Valo /*** Navigate from net_device to orinoco_private ***/
ndev_priv(struct net_device * dev)2462be45b66SKalle Valo static inline struct orinoco_private *ndev_priv(struct net_device *dev)
2472be45b66SKalle Valo {
2482be45b66SKalle Valo 	struct wireless_dev *wdev = netdev_priv(dev);
2492be45b66SKalle Valo 	return wdev_priv(wdev);
2502be45b66SKalle Valo }
2512be45b66SKalle Valo #endif /* _ORINOCO_H */
252