orinoco.h 4.28 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
2
3
4
5
6
7
8
9
/* orinoco.h
 * 
 * Common definitions to all pieces of the various orinoco
 * drivers
 */

#ifndef _ORINOCO_H
#define _ORINOCO_H

10
#define DRIVER_VERSION "0.15"
Linus Torvalds's avatar
Linus Torvalds committed
11
12
13

#include <linux/netdevice.h>
#include <linux/wireless.h>
Pavel Roskin's avatar
Pavel Roskin committed
14
#include <net/iw_handler.h>
Linus Torvalds's avatar
Linus Torvalds committed
15
16
17
18
19
20
21
22

#include "hermes.h"

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

#define WIRELESS_SPY		// enable iwspy support

23
24
#define MAX_SCAN_LEN		4096

Linus Torvalds's avatar
Linus Torvalds committed
25
26
27
28
#define ORINOCO_MAX_KEY_SIZE	14
#define ORINOCO_MAX_KEYS	4

struct orinoco_key {
29
	__le16 len;	/* always stored as little-endian */
Linus Torvalds's avatar
Linus Torvalds committed
30
31
32
33
34
35
36
37
38
	char data[ORINOCO_MAX_KEY_SIZE];
} __attribute__ ((packed));

typedef enum {
	FIRMWARE_TYPE_AGERE,
	FIRMWARE_TYPE_INTERSIL,
	FIRMWARE_TYPE_SYMBOL
} fwtype_t;

39
struct bss_element {
40
41
42
	union hermes_scan_info bss;
	unsigned long last_scanned;
	struct list_head list;
43
};
44

Linus Torvalds's avatar
Linus Torvalds committed
45
46
struct orinoco_private {
	void *card;	/* Pointer to card dependent structure */
47
	struct device *dev;
Linus Torvalds's avatar
Linus Torvalds committed
48
	int (*hard_reset)(struct orinoco_private *);
49
	int (*stop_fw)(struct orinoco_private *, int);
Linus Torvalds's avatar
Linus Torvalds committed
50
51
52
53
54
55
56
57
58

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

	/* driver state */
	int open;
	u16 last_linkstatus;
59
	struct work_struct join_work;
60
	struct work_struct wevent_work;
Linus Torvalds's avatar
Linus Torvalds committed
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

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

	/* Hardware control variables */
	hermes_t hw;
	u16 txfid;

	/* Capabilities of the hardware/firmware */
	fwtype_t firmware_type;
	char fw_name[32];
	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;
87
	unsigned int has_hostscan:1;
88
	unsigned int has_alt_txcntl:1;
89
	unsigned int do_fw_download:1;
Linus Torvalds's avatar
Linus Torvalds committed
90
	unsigned int broken_disableport:1;
91
	unsigned int broken_monitor:1;
Linus Torvalds's avatar
Linus Torvalds committed
92
93
94
95
96
97
98
99
100

	/* Configuration paramaters */
	u32 iw_mode;
	int prefer_port3;
	u16 wep_on, wep_restrict, tx_key;
	struct orinoco_key keys[ORINOCO_MAX_KEYS];
	int bitratemode;
 	char nick[IW_ESSID_MAX_SIZE+1];
	char desired_essid[IW_ESSID_MAX_SIZE+1];
101
102
	char desired_bssid[ETH_ALEN];
	int bssid_fixed;
Linus Torvalds's avatar
Linus Torvalds committed
103
104
105
106
107
108
	u16 frag_thresh, mwo_robust;
	u16 channel;
	u16 ap_density, rts_thresh;
	u16 pm_on, pm_mcast, pm_period, pm_timeout;
	u16 preamble;
#ifdef WIRELESS_SPY
Pavel Roskin's avatar
Pavel Roskin committed
109
110
 	struct iw_spy_data spy_data; /* iwspy support */
	struct iw_public_data	wireless_data;
Linus Torvalds's avatar
Linus Torvalds committed
111
112
113
114
115
#endif

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

	/* Scanning support */
118
119
	struct list_head bss_list;
	struct list_head bss_free_list;
120
	struct bss_element *bss_data;
121

122
123
	int	scan_inprogress;	/* Scan pending... */
	u32	scan_mode;		/* Type of scan done */
Linus Torvalds's avatar
Linus Torvalds committed
124
125
126
127
128
129
130
131
132
133
134
135
136
};

#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                                              */
/********************************************************************/

137
138
139
140
extern struct net_device *alloc_orinocodev(
	int sizeof_card, struct device *device,
	int (*hard_reset)(struct orinoco_private *),
	int (*stop_fw)(struct orinoco_private *, int));
Linus Torvalds's avatar
Linus Torvalds committed
141
142
143
144
extern void free_orinocodev(struct net_device *dev);
extern int __orinoco_up(struct net_device *dev);
extern int __orinoco_down(struct net_device *dev);
extern int orinoco_reinit_firmware(struct net_device *dev);
145
extern irqreturn_t orinoco_interrupt(int irq, void * dev_id);
Linus Torvalds's avatar
Linus Torvalds committed
146
147
148
149
150

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

151
static inline int orinoco_lock(struct orinoco_private *priv,
Linus Torvalds's avatar
Linus Torvalds committed
152
153
154
155
156
157
158
159
160
161
162
163
			       unsigned long *flags)
{
	spin_lock_irqsave(&priv->lock, *flags);
	if (priv->hw_unavailable) {
		DEBUG(1, "orinoco_lock() called with hw_unavailable (dev=%p)\n",
		       priv->ndev);
		spin_unlock_irqrestore(&priv->lock, *flags);
		return -EBUSY;
	}
	return 0;
}

164
static inline void orinoco_unlock(struct orinoco_private *priv,
Linus Torvalds's avatar
Linus Torvalds committed
165
166
167
168
169
170
				  unsigned long *flags)
{
	spin_unlock_irqrestore(&priv->lock, *flags);
}

#endif /* _ORINOCO_H */