• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/drivers/staging/winbond/
1#ifndef __WINBOND_WBHAL_S_H
2#define __WINBOND_WBHAL_S_H
3
4#include <linux/types.h>
5#include <linux/if_ether.h> /* for ETH_ALEN */
6
7#define HAL_LED_SET_MASK	0x001c
8#define HAL_LED_SET_SHIFT	2
9
10/* supported RF type */
11#define RF_MAXIM_2825		0
12#define RF_MAXIM_2827		1
13#define RF_MAXIM_2828		2
14#define RF_MAXIM_2829		3
15#define RF_MAXIM_V1		15
16#define RF_AIROHA_2230		16
17#define RF_AIROHA_7230		17
18#define RF_AIROHA_2230S		18
19#define RF_WB_242		33
20#define RF_WB_242_1		34
21#define RF_DECIDE_BY_INF	255
22
23/*
24 * ----------------------------------------------------------------
25 * The follow define connect to upper layer
26 *	User must modify for connection between HAL and upper layer
27 * ----------------------------------------------------------------
28 */
29
30/*
31 * ==============================
32 * Common define
33 * ==============================
34 */
35/* Bit 5 */
36#define HAL_USB_MODE_BURST(_H)			(_H->SoftwareSet & 0x20)
37
38/* Scan interval */
39#define SCAN_MAX_CHNL_TIME			(50)
40
41/* For TxL2 Frame typr recognise */
42#define FRAME_TYPE_802_3_DATA			0
43#define FRAME_TYPE_802_11_MANAGEMENT		1
44#define FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE	2
45#define FRAME_TYPE_802_11_CONTROL		3
46#define FRAME_TYPE_802_11_DATA			4
47#define FRAME_TYPE_PROMISCUOUS			5
48
49/* The follow definition is used for convert the frame------------ */
50#define DOT_11_SEQUENCE_OFFSET			22 /* Sequence control offset */
51#define DOT_3_TYPE_OFFSET			12
52#define DOT_11_MAC_HEADER_SIZE			24
53#define DOT_11_SNAP_SIZE			6
54#define DOT_11_TYPE_OFFSET			30 /* The start offset of 802.11 Frame. Type encapsulation. */
55#define DEFAULT_SIFSTIME			10
56#define DEFAULT_FRAGMENT_THRESHOLD		2346 /* No fragment */
57#define DEFAULT_MSDU_LIFE_TIME			0xffff
58
59#define LONG_PREAMBLE_PLUS_PLCPHEADER_TIME		(144 + 48)
60#define SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME		(72 + 24)
61#define PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION	(16 + 4 + 6)
62#define Tsym						4
63
64/*  Frame Type of Bits (2, 3)----------------------------------- */
65#define MAC_TYPE_MANAGEMENT			0x00
66#define MAC_TYPE_CONTROL			0x04
67#define MAC_TYPE_DATA				0x08
68#define MASK_FRAGMENT_NUMBER			0x000F
69#define SEQUENCE_NUMBER_SHIFT			4
70
71#define  HAL_WOL_TYPE_WAKEUP_FRAME		0x01
72#define  HAL_WOL_TYPE_MAGIC_PACKET		0x02
73
74#define HAL_KEYTYPE_WEP40			0
75#define HAL_KEYTYPE_WEP104			1
76#define HAL_KEYTYPE_TKIP			2 /* 128 bit key */
77#define HAL_KEYTYPE_AES_CCMP			3 /* 128 bit key */
78
79/* For VM state */
80enum {
81	VM_STOP = 0,
82	VM_RUNNING,
83	VM_COMPLETED
84};
85
86/*
87 * ================================
88 * Normal Key table format
89 * ================================
90 */
91
92/* The order of KEY index is MAPPING_KEY_START_INDEX > GROUP_KEY_START_INDEX */
93#define MAX_KEY_TABLE			24 /* 24 entry for storing key data */
94#define GROUP_KEY_START_INDEX		4
95#define MAPPING_KEY_START_INDEX		8
96
97/*
98 * =========================================
99 * Descriptor
100 * =========================================
101 */
102#define MAX_DESCRIPTOR_BUFFER_INDEX	8 /* Have to multiple of 2 */
103#define FLAG_ERROR_TX_MASK		0x000000bf
104#define FLAG_ERROR_RX_MASK		0x0000083f
105
106#define FLAG_BAND_RX_MASK		0x10000000 /* Bit 28 */
107
108typedef struct _R00_DESCRIPTOR {
109	union {
110		u32	value;
111#ifdef _BIG_ENDIAN_
112		struct {
113			u32	R00_packet_or_buffer_status:1;
114			u32	R00_packet_in_fifo:1;
115			u32	R00_RESERVED:2;
116			u32	R00_receive_byte_count:12;
117			u32	R00_receive_time_index:16;
118		};
119#else
120		struct {
121			u32	R00_receive_time_index:16;
122			u32	R00_receive_byte_count:12;
123			u32	R00_RESERVED:2;
124			u32	R00_packet_in_fifo:1;
125			u32	R00_packet_or_buffer_status:1;
126		};
127#endif
128	};
129} R00_DESCRIPTOR, *PR00_DESCRIPTOR;
130
131typedef struct _T00_DESCRIPTOR {
132	union {
133		u32	value;
134#ifdef _BIG_ENDIAN_
135		struct {
136			u32	T00_first_mpdu:1; /* for hardware use */
137			u32	T00_last_mpdu:1; /* for hardware use */
138			u32	T00_IsLastMpdu:1;/* 0:not 1:Yes for software used */
139			u32	T00_IgnoreResult:1;/* The same mechanism with T00 setting. */
140			u32	T00_RESERVED_ID:2;/* 3 bit ID reserved */
141			u32	T00_tx_packet_id:4;
142			u32	T00_RESERVED:4;
143			u32	T00_header_length:6;
144			u32	T00_frame_length:12;
145		};
146#else
147		struct {
148			u32	T00_frame_length:12;
149			u32	T00_header_length:6;
150			u32	T00_RESERVED:4;
151			u32	T00_tx_packet_id:4;
152			u32	T00_RESERVED_ID:2; /* 3 bit ID reserved */
153			u32	T00_IgnoreResult:1; /* The same mechanism with T00 setting. */
154			u32	T00_IsLastMpdu:1; /* 0:not 1:Yes for software used */
155			u32	T00_last_mpdu:1; /* for hardware use */
156			u32	T00_first_mpdu:1; /* for hardware use */
157		};
158#endif
159	};
160} T00_DESCRIPTOR, *PT00_DESCRIPTOR;
161
162typedef struct _R01_DESCRIPTOR {
163	union {
164		u32	value;
165#ifdef _BIG_ENDIAN_
166		struct {
167			u32	R01_RESERVED:3;
168			u32	R01_mod_type:1;
169			u32	R01_pre_type:1;
170			u32	R01_data_rate:3;
171			u32	R01_AGC_state:8;
172			u32	R01_LNA_state:2;
173			u32	R01_decryption_method:2;
174			u32	R01_mic_error:1;
175			u32	R01_replay:1;
176			u32	R01_broadcast_frame:1;
177			u32	R01_multicast_frame:1;
178			u32	R01_directed_frame:1;
179			u32	R01_receive_frame_antenna_selection:1;
180			u32	R01_frame_receive_during_atim_window:1;
181			u32	R01_protocol_version_error:1;
182			u32	R01_authentication_frame_icv_error:1;
183			u32	R01_null_key_to_authentication_frame:1;
184			u32	R01_icv_error:1;
185			u32	R01_crc_error:1;
186		};
187#else
188		struct {
189			u32	R01_crc_error:1;
190			u32	R01_icv_error:1;
191			u32	R01_null_key_to_authentication_frame:1;
192			u32	R01_authentication_frame_icv_error:1;
193			u32	R01_protocol_version_error:1;
194			u32	R01_frame_receive_during_atim_window:1;
195			u32	R01_receive_frame_antenna_selection:1;
196			u32	R01_directed_frame:1;
197			u32	R01_multicast_frame:1;
198			u32	R01_broadcast_frame:1;
199			u32	R01_replay:1;
200			u32	R01_mic_error:1;
201			u32	R01_decryption_method:2;
202			u32	R01_LNA_state:2;
203			u32	R01_AGC_state:8;
204			u32	R01_data_rate:3;
205			u32	R01_pre_type:1;
206			u32	R01_mod_type:1;
207			u32	R01_RESERVED:3;
208		};
209#endif
210	};
211} R01_DESCRIPTOR, *PR01_DESCRIPTOR;
212
213typedef struct _T01_DESCRIPTOR {
214	union {
215		u32	value;
216#ifdef _BIG_ENDIAN_
217		struct {
218			u32	T01_rts_cts_duration:16;
219			u32	T01_fall_back_rate:3;
220			u32	T01_add_rts:1;
221			u32	T01_add_cts:1;
222			u32	T01_modulation_type:1;
223			u32	T01_plcp_header_length:1;
224			u32	T01_transmit_rate:3;
225			u32	T01_wep_id:2;
226			u32	T01_add_challenge_text:1;
227			u32	T01_inhibit_crc:1;
228			u32	T01_loop_back_wep_mode:1;
229			u32	T01_retry_abort_ebable:1;
230		};
231#else
232		struct {
233			u32	T01_retry_abort_ebable:1;
234			u32	T01_loop_back_wep_mode:1;
235			u32	T01_inhibit_crc:1;
236			u32	T01_add_challenge_text:1;
237			u32	T01_wep_id:2;
238			u32	T01_transmit_rate:3;
239			u32	T01_plcp_header_length:1;
240			u32	T01_modulation_type:1;
241			u32	T01_add_cts:1;
242			u32	T01_add_rts:1;
243			u32	T01_fall_back_rate:3;
244			u32	T01_rts_cts_duration:16;
245		};
246#endif
247	};
248} T01_DESCRIPTOR, *PT01_DESCRIPTOR;
249
250typedef struct _T02_DESCRIPTOR {
251	union {
252		u32	value;
253#ifdef _BIG_ENDIAN_
254		struct {
255			u32	T02_IsLastMpdu:1; /* The same mechanism with T00 setting */
256			u32	T02_IgnoreResult:1; /* The same mechanism with T00 setting. */
257			u32	T02_RESERVED_ID:2; /* The same mechanism with T00 setting */
258			u32	T02_Tx_PktID:4;
259			u32	T02_MPDU_Cnt:4;
260			u32	T02_RTS_Cnt:4;
261			u32	T02_RESERVED:7;
262			u32	T02_transmit_complete:1;
263			u32	T02_transmit_abort_due_to_TBTT:1;
264			u32	T02_effective_transmission_rate:1;
265			u32	T02_transmit_without_encryption_due_to_wep_on_false:1;
266			u32	T02_discard_due_to_null_wep_key:1;
267			u32	T02_RESERVED_1:1;
268			u32	T02_out_of_MaxTxMSDULiftTime:1;
269			u32	T02_transmit_abort:1;
270			u32	T02_transmit_fail:1;
271		};
272#else
273		struct {
274			u32	T02_transmit_fail:1;
275			u32	T02_transmit_abort:1;
276			u32	T02_out_of_MaxTxMSDULiftTime:1;
277			u32	T02_RESERVED_1:1;
278			u32	T02_discard_due_to_null_wep_key:1;
279			u32	T02_transmit_without_encryption_due_to_wep_on_false:1;
280			u32	T02_effective_transmission_rate:1;
281			u32	T02_transmit_abort_due_to_TBTT:1;
282			u32	T02_transmit_complete:1;
283			u32	T02_RESERVED:7;
284			u32	T02_RTS_Cnt:4;
285			u32	T02_MPDU_Cnt:4;
286			u32	T02_Tx_PktID:4;
287			u32	T02_RESERVED_ID:2; /* The same mechanism with T00 setting */
288			u32	T02_IgnoreResult:1; /* The same mechanism with T00 setting. */
289			u32	T02_IsLastMpdu:1; /* The same mechanism with T00 setting */
290		};
291#endif
292	};
293} T02_DESCRIPTOR, *PT02_DESCRIPTOR;
294
295struct wb35_descriptor { /* Skip length = 8 DWORD */
296	/* ID for descriptor ---, The field doesn't be cleard in the operation of Descriptor definition */
297	u8	Descriptor_ID;
298	/* ----------------------The above region doesn't be cleared by DESCRIPTOR_RESET------ */
299	u8	RESERVED[3];
300
301	u16	FragmentThreshold;
302	u8	InternalUsed; /* Only can be used by operation of descriptor definition */
303	u8	Type; /* 0: 802.3 1:802.11 data frame 2:802.11 management frame */
304
305	u8	PreambleMode;/* 0: short 1:long */
306	u8	TxRate;
307	u8	FragmentCount;
308	u8	EapFix; /* For speed up key install */
309
310	/* For R00 and T00 ------------------------------ */
311	union {
312		R00_DESCRIPTOR	R00;
313		T00_DESCRIPTOR	T00;
314	};
315
316	/* For R01 and T01 ------------------------------ */
317	union {
318		R01_DESCRIPTOR	R01;
319		T01_DESCRIPTOR	T01;
320	};
321
322	/* For R02 and T02 ------------------------------ */
323	union {
324		u32		R02;
325		T02_DESCRIPTOR	T02;
326	};
327
328	/* For R03 and T03 ------------------------------ */
329	/* For software used */
330	union {
331		u32	R03;
332		u32	T03;
333		struct {
334			u8	buffer_number;
335			u8	buffer_start_index;
336			u16	buffer_total_size;
337		};
338	};
339
340	/* For storing the buffer */
341	u16	buffer_size[MAX_DESCRIPTOR_BUFFER_INDEX];
342	void	*buffer_address[MAX_DESCRIPTOR_BUFFER_INDEX];
343};
344
345
346#define DEFAULT_NULL_PACKET_COUNT	180000	/* 180 seconds */
347
348#define MAX_TXVGA_EEPROM		9	/* How many word(u16) of EEPROM will be used for TxVGA */
349#define MAX_RF_PARAMETER		32
350
351typedef struct _TXVGA_FOR_50 {
352	u8	ChanNo;
353	u8	TxVgaValue;
354} TXVGA_FOR_50;
355
356
357/*
358 * ==============================================
359 * Device related include
360 * ==============================================
361 */
362
363#include "wbusb_s.h"
364#include "wb35reg_s.h"
365#include "wb35tx_s.h"
366#include "wb35rx_s.h"
367
368/* For Hal using ============================================ */
369struct hw_data {
370	/* For compatible with 33 */
371	u32	revision;
372	u32	BB3c_cal; /* The value for Tx calibration comes from EEPROM */
373	u32	BB54_cal; /* The value for Rx calibration comes from EEPROM */
374
375	/* For surprise remove */
376	u32	SurpriseRemove; /* 0: Normal 1: Surprise remove */
377	u8	IsKeyPreSet;
378	u8	CalOneTime;
379
380	u8	VCO_trim;
381
382	u32	FragCount;
383	u32	DMAFix; /* V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. */
384
385	/*
386	 * ===============================================
387	 * Definition for MAC address
388	 * ===============================================
389	 */
390	u8	PermanentMacAddress[ETH_ALEN + 2]; /* The Ethernet addr that are stored in EEPROM. + 2 to 8-byte alignment */
391	u8	CurrentMacAddress[ETH_ALEN + 2]; /* The Enthernet addr that are in used. + 2 to 8-byte alignment */
392
393	/*
394	 * =========================================
395	 * Definition for 802.11
396	 * =========================================
397	 */
398	u8	*bssid_pointer; /* Used by hal_get_bssid for return value */
399	u8	bssid[8]; /* Only 6 byte will be used. 8 byte is required for read buffer */
400	u8	ssid[32]; /* maximum ssid length is 32 byte */
401
402	u16	AID;
403	u8	ssid_length;
404	u8	Channel;
405
406	u16	ListenInterval;
407	u16	CapabilityInformation;
408
409	u16	BeaconPeriod;
410	u16	ProbeDelay;
411
412	u8	bss_type;/* 0: IBSS_NET or 1:ESS_NET */
413	u8	preamble;/* 0: short preamble, 1: long preamble */
414	u8	slot_time_select; /* 9 or 20 value */
415	u8	phy_type; /* Phy select */
416
417	u32	phy_para[MAX_RF_PARAMETER];
418	u32	phy_number;
419
420	u32	CurrentRadioSw; /* 0:On 1:Off */
421	u32	CurrentRadioHw; /* 0:On 1:Off */
422
423	u8	*power_save_point; /* Used by hal_get_power_save_mode for return value */
424	u8	cwmin;
425	u8	desired_power_save;
426	u8	dtim; /* Is running dtim */
427	u8	mapping_key_replace_index; /* In Key table, the next index be replaced */
428
429	u16	MaxReceiveLifeTime;
430	u16	FragmentThreshold;
431	u16	FragmentThreshold_tmp;
432	u16	cwmax;
433
434	u8	Key_slot[MAX_KEY_TABLE][8]; /* Ownership record for key slot. For Alignment */
435	u32	Key_content[MAX_KEY_TABLE][12]; /* 10DW for each entry + 2 for burst command (Off and On valid bit) */
436	u8	CurrentDefaultKeyIndex;
437	u32	CurrentDefaultKeyLength;
438
439	/*
440	 * ==================================================
441	 * Variable for each module
442	 * ==================================================
443	 */
444	struct wb_usb		WbUsb;	/* Need WbUsb.h */
445	struct wb35_reg		reg;	/* Need Wb35Reg.h */
446	struct wb35_tx		Wb35Tx; /* Need Wb35Tx.h */
447	struct wb35_rx		Wb35Rx; /* Need Wb35Rx.h */
448
449	struct timer_list	LEDTimer; /* For LED */
450
451	u32			LEDpoint; /* For LED */
452
453	u32			dto_tx_retry_count;
454	u32			dto_tx_frag_count;
455	u32			rx_ok_count[13]; /* index=0: total rx ok */
456	u32			rx_err_count[13]; /* index=0: total rx err */
457
458	/* for Tx debug */
459	u32			tx_TBTT_start_count;
460	u32			tx_ETR_count;
461	u32			tx_WepOn_false_count;
462	u32			tx_Null_key_count;
463	u32			tx_retry_count[8];
464
465	u8			PowerIndexFromEEPROM; /* For 2412MHz */
466	u8			power_index;
467	u8			IsWaitJoinComplete; /* TRUE: set join request */
468	u8			band;
469
470	u16			SoftwareSet;
471	u16			Reserved_s;
472
473	u32			IsInitOK; /* 0: Driver starting 1: Driver init OK */
474
475	/* For Phy calibration */
476	s32			iq_rsdl_gain_tx_d2;
477	s32			iq_rsdl_phase_tx_d2;
478	u32			txvga_setting_for_cal;
479
480	u8			TxVgaSettingInEEPROM[(((MAX_TXVGA_EEPROM * 2) + 3) & ~0x03)]; /* For EEPROM value */
481	u8			TxVgaFor24[16]; /* Max is 14, 2 for alignment */
482	TXVGA_FOR_50		TxVgaFor50[36];	/* 35 channels in 5G. 35x2 = 70 byte. 2 for alignments */
483
484	u16			Scan_Interval;
485	u16			RESERVED6;
486
487	/* LED control */
488	u32		LED_control;
489	/*
490	 * LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0]
491	 * Gray_Led
492	 *		For Led gray setting
493	 * Led
494	 *		0: normal control,
495	 *			LED behavior will decide by EEPROM setting
496	 *		1: Turn off specific LED
497	 *		2: Always on specific LED
498	 *		3: slow blinking specific LED
499	 *		4: fast blinking specific LED
500	 *		5: WPS led control is set. Led0 is Red, Led1 id Green
501	 *
502	 * Led[1] is parameter for WPS LED mode
503	 *		1:InProgress
504	 *		2: Error
505	 *		3: Session overlap
506	 *		4: Success control
507	 */
508	u32		LED_LinkOn;	/* Turn LED on control */
509	u32		LED_Scanning;	/* Let LED in scan process control */
510	u32		LED_Blinking;	/* Temp variable for shining */
511	u32		RxByteCountLast;
512	u32		TxByteCountLast;
513
514	atomic_t	SurpriseRemoveCount;
515
516	/* For global timer */
517	u32		time_count;	/* TICK_TIME_100ms 1 = 100ms */
518
519	/* For error recover */
520	u32		HwStop;
521
522	/* For avoid AP disconnect */
523	u32		NullPacketCount;
524};
525
526#endif
527