blob: 59609a408f51d5af5b34ba0dc980bbf1b8dbb574 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
2 * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
3 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22#if !defined( WLAN_HDD_MAIN_H )
23#define WLAN_HDD_MAIN_H
24/**===========================================================================
25
26 \file WLAN_HDD_MAIN_H.h
27
28 \brief Linux HDD Adapter Type
29 Copyright 2008 (c) Qualcomm, Incorporated.
30 All Rights Reserved.
31 Qualcomm Confidential and Proprietary.
32
33 ==========================================================================*/
34
35/*---------------------------------------------------------------------------
36 Include files
37 -------------------------------------------------------------------------*/
38
39#include <linux/netdevice.h>
40#include <linux/skbuff.h>
41#ifdef CONFIG_CFG80211
42#include <net/cfg80211.h>
43#endif
44#include <vos_list.h>
45#include <vos_types.h>
46#include "sirMacProtDef.h"
47#include "csrApi.h"
48#include <wlan_hdd_assoc.h>
49#include <wlan_hdd_dp_utils.h>
50#include <wlan_hdd_wmm.h>
51#include <wlan_hdd_cfg.h>
52#include <linux/spinlock.h>
53#ifdef ANI_MANF_DIAG
54#include <wlan_hdd_ftm.h>
55#endif
56/*---------------------------------------------------------------------------
57 Preprocessor definitions and constants
58 -------------------------------------------------------------------------*/
59/** Number of attempts to detect/remove card */
60#define LIBRA_CARD_INSERT_DETECT_MAX_COUNT 5
61#define LIBRA_CARD_REMOVE_DETECT_MAX_COUNT 5
62/** Number of Tx Queues */
63#define NUM_TX_QUEUES 4
64/** Queue length specified to OS in the net_device */
65#define NET_DEV_TX_QUEUE_LEN 100
66/** HDD's internal Tx Queue Length. Needs to be a power of 2 */
67#define HDD_TX_QUEUE_MAX_LEN 128
68/** HDD internal Tx Queue Low Watermark. Net Device TX queue is disabled
69 * when HDD queue becomes full. This Low watermark is used to enable
70 * the Net Device queue again */
71#define HDD_TX_QUEUE_LOW_WATER_MARK (HDD_TX_QUEUE_MAX_LEN*3/4)
72/** Bytes to reserve in the headroom */
73#define LIBRA_HW_NEEDED_HEADROOM 128
74/** Hdd Tx Time out value */
75#ifdef LIBRA_LINUX_PC
76#define HDD_TX_TIMEOUT (8000)
77#else
78#define HDD_TX_TIMEOUT msecs_to_jiffies(5000)
79#endif
80/** Hdd Default MTU */
81#define HDD_DEFAULT_MTU (1500)
82/**event flags registered net device*/
83#define NET_DEVICE_REGISTERED 1<<0
84#define SME_SESSION_OPENED 1<<1
85#define INIT_TX_RX_SUCCESS 1<<2
86#define WMM_INIT_DONE 1<<3
87#define SOFTAP_BSS_STARTED 1<<4
88#define DEVICE_IFACE_OPENED 1<<5
89
90/** Maximum time(ms)to wait for disconnect to complete **/
91#define WLAN_WAIT_TIME_DISCONNECT 500
92#define WLAN_WAIT_TIME_STATS 800
93#define WLAN_WAIT_TIME_POWER 800
94#define WLAN_WAIT_TIME_SESSIONOPENCLOSE 2000
95#define WLAN_WAIT_TIME_ABORTSCAN 2000
96
97/* Scan Req Timeout */
98#define WLAN_WAIT_TIME_SCAN_REQ 100
99
100#define MAX_NUMBER_OF_ADAPTERS 4
101
102#define MAX_CFG_STRING_LEN 255
103
104#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
105/** Mac Address string **/
106#define MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
107#define MAX_GENIE_LEN 255
108
109#if defined(QC_WLAN_CHIPSET_PRIMA)
110#define WLAN_CHIP_VERSION "WCNSS"
111#elif defined(ANI_CHIPSET_LIBRA)
112#define WLAN_CHIP_VERSION "WCN1312"
113#elif defined(ANI_CHIPSET_VOLANS)
114#define WLAN_CHIP_VERSION "WCN1314"
115#else
116#define WLAN_CHIP_VERSION "UNKNOWN"
117#endif
118
119#define hddLog(level, args...) VOS_TRACE( VOS_MODULE_ID_HDD, level, ## args)
120#define ENTER() VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "Enter:%s", __FUNCTION__)
121#define EXIT() VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "Exit:%s", __FUNCTION__)
122
123#define WLAN_HDD_GET_PRIV_PTR(__dev__) (hdd_adapter_t*)(netdev_priv((__dev__)))
124
125#define MAX_EXIT_ATTEMPTS_DURING_LOGP 20
126
127#define MAX_NO_OF_2_4_CHANNELS 14
128
129typedef struct hdd_tx_rx_stats_s
130{
131 // start_xmit stats
132 __u32 txXmitCalled;
133 __u32 txXmitDropped;
134 __u32 txXmitBackPressured;
135 __u32 txXmitQueued;
136 __u32 txXmitClassifiedAC[NUM_TX_QUEUES];
137 __u32 txXmitDroppedAC[NUM_TX_QUEUES];
138 __u32 txXmitBackPressuredAC[NUM_TX_QUEUES];
139 __u32 txXmitQueuedAC[NUM_TX_QUEUES];
140 // fetch_cbk stats
141 __u32 txFetched;
142 __u32 txFetchedAC[NUM_TX_QUEUES];
143 __u32 txFetchEmpty;
144 __u32 txFetchLowResources;
145 __u32 txFetchDequeueError;
146 __u32 txFetchDequeued;
147 __u32 txFetchDequeuedAC[NUM_TX_QUEUES];
148 __u32 txFetchDePressured;
149 __u32 txFetchDePressuredAC[NUM_TX_QUEUES];
150 // complete_cbk_stats
151 __u32 txCompleted;
152 // flush stats
153 __u32 txFlushed;
154 __u32 txFlushedAC[NUM_TX_QUEUES];
155 // rx stats
156 __u32 rxChains;
157 __u32 rxPackets;
158 __u32 rxDropped;
159 __u32 rxDelivered;
160 __u32 rxRefused;
161} hdd_tx_rx_stats_t;
162
163typedef struct hdd_chip_reset_stats_s
164{
165 __u32 totalLogpResets;
166 __u32 totalCMD53Failures;
167 __u32 totalMutexReadFailures;
168 __u32 totalMIFErrorFailures;
169 __u32 totalFWHearbeatFailures;
170 __u32 totalUnknownExceptions;
171} hdd_chip_reset_stats_t;
172
173typedef struct hdd_stats_s
174{
175 tCsrSummaryStatsInfo summary_stat;
176 tCsrGlobalClassAStatsInfo ClassA_stat;
177 tCsrGlobalClassBStatsInfo ClassB_stat;
178 tCsrGlobalClassCStatsInfo ClassC_stat;
179 tCsrGlobalClassDStatsInfo ClassD_stat;
180 tCsrPerStaStatsInfo perStaStats;
181 hdd_tx_rx_stats_t hddTxRxStats;
182 hdd_chip_reset_stats_t hddChipResetStats;
183} hdd_stats_t;
184
185typedef enum
186{
187 HDD_ROAM_STATE_NONE,
188
189 // Issuing a disconnect due to transition into low power states.
190 HDD_ROAM_STATE_DISCONNECTING_POWER,
191
192 // move to this state when HDD sets a key with SME/CSR. Note this is
193 // an important state to get right because we will get calls into our SME
194 // callback routine for SetKey activity that we did not initiate!
195 HDD_ROAM_STATE_SETTING_KEY,
196} HDD_ROAM_STATE;
197
198typedef enum
199{
200 eHDD_SUSPEND_NONE = 0,
201 eHDD_SUSPEND_DEEP_SLEEP,
202 eHDD_SUSPEND_STANDBY,
203} hdd_ps_state_t;
204
205typedef struct roaming_info_s
206{
207 HDD_ROAM_STATE roamingState;
208 vos_event_t roamingEvent;
209
210} roaming_info_t;
211
212#ifdef FEATURE_WLAN_WAPI
213/* Define WAPI macros for Length, BKID count etc*/
214#define MAX_WPI_KEY_LENGTH 16
215#define MAX_NUM_PN 16
216#define MAC_ADDR_LEN 6
217#define MAX_ADDR_INDEX 12
218#define MAX_NUM_AKM_SUITES 16
219#define MAX_NUM_UNI_SUITES 16
220#define MAX_NUM_BKIDS 16
221#define HDD_PAIRWISE_WAPI_KEY 0
222#define HDD_GROUP_WAPI_KEY 1
223
224/** WAPI AUTH mode definition */
225enum _WAPIAuthMode
226{
227 WAPI_AUTH_MODE_OPEN = 0,
228 WAPI_AUTH_MODE_PSK = 1,
229 WAPI_AUTH_MODE_CERT
230} __attribute__((packed));
231typedef enum _WAPIAuthMode WAPIAuthMode;
232
233/** WAPI Work mode structure definition */
234#define WZC_ORIGINAL 0
235#define WAPI_EXTENTION 1
236
237struct _WAPI_FUNCTION_MODE
238{
239 unsigned char wapiMode;
240}__attribute__((packed));
241
242typedef struct _WAPI_FUNCTION_MODE WAPI_FUNCTION_MODE;
243
244typedef struct _WAPI_BKID
245{
246 v_U8_t bkid[16];
247}WAPI_BKID, *pWAPI_BKID;
248
249/** WAPI Association information structure definition */
250struct _WAPI_AssocInfo
251{
252 v_U8_t elementID;
253 v_U8_t length;
254 v_U16_t version;
255 v_U16_t akmSuiteCount;
256 v_U32_t akmSuite[MAX_NUM_AKM_SUITES];
257 v_U16_t unicastSuiteCount;
258 v_U32_t unicastSuite[MAX_NUM_UNI_SUITES];
259 v_U32_t multicastSuite;
260 v_U16_t wapiCability;
261 v_U16_t bkidCount;
262 WAPI_BKID bkidList[MAX_NUM_BKIDS];
263} __attribute__((packed));
264
265typedef struct _WAPI_AssocInfo WAPI_AssocInfo;
266typedef struct _WAPI_AssocInfo *pWAPI_IEAssocInfo;
267
268/** WAPI KEY Type definition */
269enum _WAPIKeyType
270{
271 PAIRWISE_KEY, //0
272 GROUP_KEY //1
273}__attribute__((packed));
274typedef enum _WAPIKeyType WAPIKeyType;
275
276/** WAPI KEY Direction definition */
277enum _KEY_DIRECTION
278{
279 None,
280 Rx,
281 Tx,
282 Rx_Tx
283}__attribute__((packed));
284
285typedef enum _KEY_DIRECTION WAPI_KEY_DIRECTION;
286
287/** WAPI KEY stucture definition */
288struct WLAN_WAPI_KEY
289{
290 WAPIKeyType keyType;
291 WAPI_KEY_DIRECTION keyDirection; /*reserved for future use*/
292 v_U8_t keyId;
293 v_U8_t addrIndex[MAX_ADDR_INDEX]; /*reserved for future use*/
294 int wpiekLen;
295 v_U8_t wpiek[MAX_WPI_KEY_LENGTH];
296 int wpickLen;
297 v_U8_t wpick[MAX_WPI_KEY_LENGTH];
298 v_U8_t pn[MAX_NUM_PN]; /*reserved for future use*/
299}__attribute__((packed));
300
301typedef struct WLAN_WAPI_KEY WLAN_WAPI_KEY;
302typedef struct WLAN_WAPI_KEY *pWLAN_WAPI_KEY;
303
304#define WPA_GET_LE16(a) ((u16) (((a)[1] << 8) | (a)[0]))
305#define WLAN_EID_WAPI 68
306#define WAPI_PSK_AKM_SUITE 0x02721400
307#define WAPI_CERT_AKM_SUITE 0x01721400
308
309/** WAPI BKID List stucture definition */
310struct _WLAN_BKID_LIST
311{
312 v_U32_t length;
313 v_U32_t BKIDCount;
314 WAPI_BKID BKID[1];
315}__attribute__((packed));
316
317typedef struct _WLAN_BKID_LIST WLAN_BKID_LIST;
318typedef struct _WLAN_BKID_LIST *pWLAN_BKID_LIST;
319
320
321/** WAPI Information stucture definition */
322struct hdd_wapi_info_s
323{
324 v_U32_t nWapiMode;
325 v_BOOL_t fIsWapiSta;
326 v_MACADDR_t cachedMacAddr;
327 v_UCHAR_t wapiAuthMode;
328}__attribute__((packed));
329typedef struct hdd_wapi_info_s hdd_wapi_info_t;
330#endif /* FEATURE_WLAN_WAPI */
331
332#ifdef CONFIG_CFG80211
333typedef struct beacon_data_s {
334 u8 *head, *tail;
335 int head_len, tail_len;
336 int dtim_period;
337} beacon_data_t;
338#endif
339
340typedef enum device_mode
341{ /* MAINTAIN 1 - 1 CORRESPONDENCE WITH tVOS_CON_MODE*/
342 WLAN_HDD_INFRA_STATION,
343 WLAN_HDD_SOFTAP,
344 WLAN_HDD_P2P_CLIENT,
345 WLAN_HDD_P2P_GO,
346 WLAN_HDD_MONITOR
347#ifdef ANI_MANF_DIAG
348 ,WLAN_HDD_FTM,
349#endif
350}device_mode_t;
351
352typedef enum rem_on_channel_request_type
353{
354 REMAIN_ON_CHANNEL_REQUEST,
355 OFF_CHANNEL_ACTION_TX,
356}rem_on_channel_request_type_t;
357
358/* Thermal mitigation Level Enum Type */
359typedef enum
360{
361 WLAN_HDD_TM_LEVEL_0,
362 WLAN_HDD_TM_LEVEL_1,
363 WLAN_HDD_TM_LEVEL_2,
364 WLAN_HDD_TM_LEVEL_3,
365 WLAN_HDD_TM_LEVEL_4,
366 WLAN_HDD_TM_LEVEL_MAX
367} WLAN_TmLevelEnumType;
368
369/* Driver Action based on thermal mitigation level structure */
370typedef struct
371{
372 v_BOOL_t ampduEnable;
373 v_BOOL_t enterImps;
374 v_U32_t txSleepDuration;
375 v_U32_t txOperationDuration;
376 v_U32_t txBlockFrameCountThreshold;
377} hdd_tmLevelAction_t;
378
379/* Thermal Mitigation control context structure */
380typedef struct
381{
382 WLAN_TmLevelEnumType currentTmLevel;
383 hdd_tmLevelAction_t tmAction;
384 vos_timer_t txSleepTimer;
385 struct mutex tmOperationLock;
386 vos_event_t setTmDoneEvent;
387 v_U32_t txFrameCount;
388 v_TIME_t lastblockTs;
389 v_TIME_t lastOpenTs;
390 struct netdev_queue *blockedQueue;
391} hdd_thermal_mitigation_info_t;
392
393#if defined CONFIG_CFG80211
394typedef struct hdd_remain_on_chan_ctx
395{
396 struct net_device *dev;
397 struct ieee80211_channel chan;
398 enum nl80211_channel_type chan_type;
399 unsigned int duration;
400 u64 cookie;
401 rem_on_channel_request_type_t rem_on_chan_request;
402}hdd_remain_on_chan_ctx_t;
403
404typedef struct hdd_cfg80211_state_s
405{
406 tANI_U16 current_freq;
407 u64 action_cookie;
408 tANI_U8 *buf;
409 size_t len;
410 struct sk_buff *skb;
411 hdd_remain_on_chan_ctx_t* remain_on_chan_ctx;
412}hdd_cfg80211_state_t;
413
414#endif
415struct hdd_station_ctx
416{
417 /** Handle to the Wireless Extension State */
418 hdd_wext_state_t WextState;
419
420 /**Connection information*/
421 connection_info_t conn_info;
422
423 roaming_info_t roam_info;
424
425 v_BOOL_t bSendDisconnect;
426
427#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX)
428 int ft_carrier_on;
429#endif
430};
431
432#define BSS_STOP 0
433#define BSS_START 1
434typedef struct hdd_hostapd_state_s
435{
436 int bssState;
437 vos_event_t vosEvent;
438 VOS_STATUS vosStatus;
439 v_BOOL_t bCommit;
440
441} hdd_hostapd_state_t;
442
443
444/*
445 * Per station structure kept in HDD for multiple station support for SoftAP
446*/
447typedef struct {
448 /** The station entry is used or not */
449 v_BOOL_t isUsed;
450
451 /** Station ID reported back from HAL (through SAP). Broadcast
452 * uses station ID zero by default in both libra and volans. */
453 v_U8_t ucSTAId;
454
455 /** MAC address of the station */
456 v_MACADDR_t macAddrSTA;
457
458 /** Current Station state so HDD knows how to deal with packet
459 * queue. Most recent states used to change TL STA state. */
460 WLANTL_STAStateType tlSTAState;
461
462 /** Transmit queues for each AC (VO,VI,BE etc). */
463 hdd_list_t wmm_tx_queue[NUM_TX_QUEUES];
464
465 /** Might need to differentiate queue depth in contention case */
466 v_U16_t aTxQueueDepth[NUM_TX_QUEUES];
467
468 /**Track whether OS TX queue has been disabled.*/
469 v_BOOL_t txSuspended[NUM_TX_QUEUES];
470
471 /** Track QoS status of station */
472 v_BOOL_t isQosEnabled;
473
474} hdd_station_info_t;
475
476struct hdd_ap_ctx_s
477{
478 hdd_hostapd_state_t HostapdState;
479
480 // Memory differentiation mode is enabled
481 //v_U16_t uMemoryDiffThreshold;
482 //v_U8_t uNumActiveAC;
483 //v_U8_t uActiveACMask;
484 //v_U8_t aTxQueueLimit[NUM_TX_QUEUES];
485
486 /** Packet Count to update uNumActiveAC and uActiveACMask */
487 //v_U16_t uUpdatePktCount;
488
489 /** Station ID assigned after BSS starts */
490 v_U8_t uBCStaId;
491
492 v_U8_t uPrivacy; // The privacy bits of configuration
493
494#ifdef WLAN_SOFTAP_FEATURE
495 tSirWPSPBCProbeReq WPSPBCProbeReq;
496
497 tsap_Config_t sapConfig;
498#endif
499
500 struct semaphore semWpsPBCOverlapInd;
501
502 v_BOOL_t apDisableIntraBssFwd;
503
504 vos_timer_t hdd_ap_inactivity_timer;
505
506 v_U8_t operatingChannel;
507
508 v_BOOL_t uIsAuthenticated;
509
510 eCsrEncryptionType ucEncryptType;
511
512#ifdef CONFIG_CFG80211
513 //This will point to group key data, if it is received before start bss.
514 tCsrRoamSetKey groupKey;
515 // This will have WEP key data, if it is received before start bss
516 tCsrRoamSetKey wepKey[CSR_MAX_NUM_KEY];
517
518 beacon_data_t *beacon;
519#endif
520};
521
522#ifdef CONFIG_CFG80211
523struct hdd_mon_ctx_s
524{
525 hdd_adapter_t *pAdapterForTx;
526};
527#endif
528
529typedef struct hdd_scaninfo_s
530{
531 /* The scan id */
532 v_U32_t scanId;
533
534 /* The scan pending */
535 v_U32_t mScanPending;
536
537 /* Client Wait Scan Result */
538 v_U32_t waitScanResult;
539
540#ifdef WLAN_FEATURE_P2P
541 v_BOOL_t p2pSearch;
542#endif
543
544 /* Additional IE for scan */
545 tSirAddie scanAddIE;
546
547 /* Scan mode*/
548 tSirScanType scan_mode;
549
550 /* Scan Completion Event */
551 struct completion scan_req_completion_event;
552
553 vos_event_t scan_finished_event;
554
555 hdd_scan_pending_option_e scan_pending_option;
556
557}hdd_scaninfo_t;
558
559#define WLAN_HDD_ADAPTER_MAGIC 0x574c414e //ASCII "WLAN"
560struct hdd_adapter_s
561{
562 void *pHddCtx;
563
564 device_mode_t device_mode;
565
566 /** Handle to the network device */
567 struct net_device *dev;
568
569 //TODO Move this to sta Ctx
570#ifdef CONFIG_CFG80211
571 struct wireless_dev wdev ;
572 struct cfg80211_scan_request *request ;
573#endif
574
575#ifdef WLAN_FEATURE_P2P
576 /** ops checks if Opportunistic Power Save is Enable or Not
577 * ctw stores ctWindow value once we receive Opps command from
578 * wpa_supplicant then using ctWindow value we need to Enable
579 * Opportunistic Power Save
580 */
581 tANI_U8 ops;
582 tANI_U32 ctw;
583#endif
584
585 /** Current MAC Address for the adapter */
586 v_MACADDR_t macAddressCurrent;
587
588 /**Event Flags*/
589 unsigned long event_flags;
590
591 /**Device TX/RX statistics*/
592 struct net_device_stats stats;
593 /** HDD statistics*/
594 hdd_stats_t hdd_stats;
595 /**Mib information*/
596 sHddMib_t hdd_mib;
597
598 tANI_U8 sessionId;
599#ifdef WLAN_FEATURE_P2P
600 /** p2pSessionId required to open new SME session for P2P
601 * Device address which is different from STA MAC Address
602 */
603 tANI_U8 p2pSessionId;
604#endif
605
606 /* Completion variable for session close */
607 struct completion session_close_comp_var;
608
609 /* Completion variable for session open */
610 struct completion session_open_comp_var;
611
612 //TODO: move these to sta ctx. These may not be used in AP
613 /** completion variable for disconnect callback */
614 struct completion disconnect_comp_var;
615
616 /* completion variable for Linkup Event */
617 struct completion linkup_event_var;
618
619
620 /* completion variable for abortscan */
621 struct completion abortscan_event_var;
622#ifdef CONFIG_CFG80211
623 /* completion variable for cancel remain on channel Event */
624 struct completion cancel_rem_on_chan_var;
625
626#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
627 /* completion variable for off channel remain on channel Event */
628 struct completion offchannel_tx_event;
629#endif
630 /* Completion variable for action frame */
631 struct completion tx_action_cnf_event;
632 /* Completion variable for remain on channel ready */
633 struct completion rem_on_chan_ready_event;
634#endif
635
636 /* Track whether the linkup handling is needed */
637 v_BOOL_t isLinkUpSvcNeeded;
638
639/*************************************************************
640 * Tx Queues
641 */
642 /** Transmit queues for each AC (VO,VI,BE etc) */
643 hdd_list_t wmm_tx_queue[NUM_TX_QUEUES];
644 /**Track whether VOS is in a low resource state*/
645 v_BOOL_t isVosOutOfResource;
646
647 /**Track whether OS TX queue has been disabled.*/
648 v_BOOL_t isTxSuspended[NUM_TX_QUEUES];
649
650 /** WMM Status */
651 hdd_wmm_status_t hddWmmStatus;
652/*************************************************************
653 */
654/*************************************************************
655 * TODO - Remove it later
656 */
657 /** Multiple station supports */
658 /** Per-station structure */
659 spinlock_t staInfo_lock; //To protect access to station Info
660 hdd_station_info_t aStaInfo[WLAN_MAX_STA_COUNT];
661 //v_U8_t uNumActiveStation;
662
663 v_U16_t aTxQueueLimit[NUM_TX_QUEUES];
664/*************************************************************
665 */
666
667#ifdef FEATURE_WLAN_WAPI
668 hdd_wapi_info_t wapi_info;
669#endif
670
671 v_S7_t rssi;
672#ifdef CONFIG_CFG80211
673 struct work_struct monTxWorkQueue;
674 struct sk_buff *skb_to_tx;
675#endif
676
677 union {
678 hdd_station_ctx_t station;
679 hdd_ap_ctx_t ap;
680#ifdef CONFIG_CFG80211
681 hdd_mon_ctx_t monitor;
682#endif
683 }sessionCtx;
684
685 hdd_scaninfo_t scan_info;
686#ifdef CONFIG_CFG80211
687 hdd_cfg80211_state_t cfg80211State;
688#endif
689
690 //Magic cookie for adapter sanity verification
691 v_U32_t magic;
692 v_BOOL_t higherDtimTransition;
693};
694
695typedef struct hdd_dynamic_mcbcfilter_s
696{
697 v_BOOL_t enableCfg;
698 v_U8_t mcastBcastFilterSetting;
699 v_BOOL_t enableSuspend;
700 v_U8_t mcBcFilterSuspend;
701}hdd_dynamic_mcbcfilter_t;
702
703#define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) &(pAdapter)->sessionCtx.station
704#define WLAN_HDD_GET_AP_CTX_PTR(pAdapter) &(pAdapter)->sessionCtx.ap
705#define WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter) &(pAdapter)->sessionCtx.station.WextState
706#define WLAN_HDD_GET_CTX(pAdapter) (hdd_context_t*)pAdapter->pHddCtx
707#define WLAN_HDD_GET_HAL_CTX(pAdapter) ((hdd_context_t*)(pAdapter->pHddCtx))->hHal
708#define WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter) &(pAdapter)->sessionCtx.ap.HostapdState
709#define WLAN_HDD_GET_CFG_STATE_PTR(pAdapter) &(pAdapter)->cfg80211State
710#define WLAN_HDD_MAX_MC_ADDR_LIST 10
711
712typedef struct hdd_adapter_list_node
713{
714 hdd_list_node_t node; // MUST be first element
715 hdd_adapter_t *pAdapter;
716}hdd_adapter_list_node_t;
717
718typedef struct hdd_priv_data_s
719{
720 tANI_U8 *buf;
721 int used_len;
722 int total_len;
723}hdd_priv_data_t;
724
725#ifdef WLAN_FEATURE_PACKET_FILTERING
726typedef struct multicast_addr_list
727{
728 v_U8_t isFilterApplied;
729 v_U8_t mc_cnt;
730 v_U8_t addr[WLAN_HDD_MAX_MC_ADDR_LIST][ETH_ALEN];
731} t_multicast_add_list;
732#endif
733
734/** Adapter stucture definition */
735
736struct hdd_context_s
737{
738 /** Global VOS context */
739 v_CONTEXT_t pvosContext;
740
741 /** HAL handle...*/
742 tHalHandle hHal;
743
744#ifdef CONFIG_CFG80211
745 struct wiphy *wiphy ;
746#endif
747 //TODO Remove this from here.
748
749 hdd_list_t hddAdapters; //List of adapters
750 /* One per STA: 1 for RX_BCMC_STA_ID and 1 for SAP_SELF_STA_ID*/
751 hdd_adapter_t *sta_to_adapter[WLAN_MAX_STA_COUNT + 3]; //One per sta. For quick reference.
752
753 /** Pointer for firmware image data */
754 const struct firmware *fw;
755
756 /** Pointer for configuration data */
757 const struct firmware *cfg;
758
759 /** Pointer for nv data */
760 const struct firmware *nv;
761
762 /** Pointer to the parent device */
763 struct device *parent_dev;
764
765 pid_t pid_sdio_claimed;
766 atomic_t sdio_claim_count;
767
768 /** Config values read from qcom_cfg.ini file */
769 hdd_config_t *cfg_ini;
770 #ifdef ANI_MANF_DIAG
771 wlan_hdd_ftm_status_t ftm;
772 #endif
773 /** completion variable for full power callback */
774 struct completion full_pwr_comp_var;
775 /** completion variable for Request BMPS callback */
776 struct completion req_bmps_comp_var;
777
778 /** completion variable for standby callback */
779 struct completion standby_comp_var;
780
781#ifdef FEATURE_WLAN_INTEGRATED_SOC
782 /* Completion variable to indicate Rx Thread Suspended */
783 struct completion rx_sus_event_var;
784#endif // FEATURE_WLAN_INTEGRATED_SOC
785
786 /* Completion variable to indicate Tx Thread Suspended */
787 struct completion tx_sus_event_var;
788
789 /* Completion variable to indicate Mc Thread Suspended */
790 struct completion mc_sus_event_var;
791
792
793 v_BOOL_t isWlanSuspended;
794
795 v_BOOL_t isTxThreadSuspended;
796
797 v_BOOL_t isMcThreadSuspended;
798
799#ifdef FEATURE_WLAN_INTEGRATED_SOC
800 v_BOOL_t isRxThreadSuspended;
801#endif
802
803 volatile v_BOOL_t isLogpInProgress;
804
805 v_BOOL_t isLoadUnloadInProgress;
806
807 /**Track whether driver has been suspended.*/
808 hdd_ps_state_t hdd_ps_state;
809
810 /* Track whether Mcast/Bcast Filter is enabled.*/
811 v_BOOL_t hdd_mcastbcast_filter_set;
812
813 /* Track whether ignore DTIM is enabled*/
814 v_BOOL_t hdd_ignore_dtim_enabled;
815 v_U32_t hdd_actual_ignore_DTIM_value;
816 v_U32_t hdd_actual_LI_value;
817
818
819 v_BOOL_t hdd_wlan_suspended;
820
821 spinlock_t filter_lock;
822
823 /* Lock to avoid race condtion during start/stop bss*/
824 struct mutex sap_lock;
825
826 /** ptt Process ID*/
827 v_SINT_t ptt_pid;
828
829 v_U8_t change_iface;
830
831 /** Concurrency Parameters*/
832 tVOS_CONCURRENCY_MODE concurrency_mode;
833
834 v_U16_t no_of_sessions[VOS_MAX_NO_OF_MODE];
835
836 hdd_chip_reset_stats_t hddChipResetStats;
837 /* Number of times riva restarted */
838 v_U32_t hddRivaResetStats;
839
840 hdd_dynamic_mcbcfilter_t dynamic_mcbc_filter;
841
842 /* Can we allow AMP connection right now*/
843 v_BOOL_t isAmpAllowed;
844
845#ifdef WLAN_FEATURE_P2P
846 /** P2P Device MAC Address for the adapter */
847 v_MACADDR_t p2pDeviceAddress;
848#endif
849
850 /* Thermal mitigation information */
851 hdd_thermal_mitigation_info_t tmInfo;
852#ifdef WLAN_FEATURE_PACKET_FILTERING
853 t_multicast_add_list mc_addr_list;
854#endif
855};
856
857
858
859/*---------------------------------------------------------------------------
860 Function declarations and documenation
861 -------------------------------------------------------------------------*/
862VOS_STATUS hdd_get_front_adapter( hdd_context_t *pHddCtx,
863 hdd_adapter_list_node_t** ppAdapterNode);
864
865VOS_STATUS hdd_get_next_adapter( hdd_context_t *pHddCtx,
866 hdd_adapter_list_node_t* pAdapterNode,
867 hdd_adapter_list_node_t** pNextAdapterNode);
868
869VOS_STATUS hdd_remove_adapter( hdd_context_t *pHddCtx,
870 hdd_adapter_list_node_t* pAdapterNode);
871
872VOS_STATUS hdd_remove_front_adapter( hdd_context_t *pHddCtx,
873 hdd_adapter_list_node_t** ppAdapterNode);
874
875VOS_STATUS hdd_add_adapter_back( hdd_context_t *pHddCtx,
876 hdd_adapter_list_node_t* pAdapterNode);
877
878VOS_STATUS hdd_add_adapter_front( hdd_context_t *pHddCtx,
879 hdd_adapter_list_node_t* pAdapterNode);
880
881hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type,
882 char* name, tSirMacAddr macAddr, tANI_U8 rtnl_held );
883VOS_STATUS hdd_close_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, tANI_U8 rtnl_held );
884VOS_STATUS hdd_close_all_adapters( hdd_context_t *pHddCtx );
885VOS_STATUS hdd_stop_all_adapters( hdd_context_t *pHddCtx );
886VOS_STATUS hdd_reset_all_adapters( hdd_context_t *pHddCtx );
887VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx );
888VOS_STATUS hdd_reconnect_all_adapters( hdd_context_t *pHddCtx );
889hdd_adapter_t * hdd_get_adapter_by_name( hdd_context_t *pHddCtx, tANI_U8 *name );
890hdd_adapter_t * hdd_get_adapter_by_macaddr( hdd_context_t *pHddCtx, tSirMacAddr macAddr );
891hdd_adapter_t * hdd_get_mon_adapter( hdd_context_t *pHddCtx );
892VOS_STATUS hdd_init_station_mode( hdd_adapter_t *pAdapter );
893hdd_adapter_t * hdd_get_adapter( hdd_context_t *pHddCtx, device_mode_t mode );
894void hdd_deinit_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter );
895VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter );
896void hdd_set_station_ops( struct net_device *pWlanDev );
897tANI_U8* wlan_hdd_get_intf_addr(hdd_context_t* pHddCtx);
898void wlan_hdd_release_intf_addr(hdd_context_t* pHddCtx, tANI_U8* releaseAddr);
899v_U8_t hdd_get_operating_channel( hdd_context_t *pHddCtx, device_mode_t mode );
900
901
902#if defined(WLAN_SOFTAP_FEATURE) || defined(ANI_MANF_DIAG)
903void hdd_set_conparam ( v_UINT_t newParam );
904tVOS_CON_MODE hdd_get_conparam( void );
905#endif
906
907void wlan_hdd_enable_deepsleep(v_VOID_t * pVosContext);
908v_BOOL_t hdd_is_apps_power_collapse_allowed(hdd_context_t* pHddCtx);
909void hdd_abort_mac_scan(hdd_context_t *pHddCtx);
910#ifdef CONFIG_CFG80211
911void wlan_hdd_set_monitor_tx_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter );
912void hdd_cleanup_actionframe( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter );
913#endif
914void wlan_hdd_set_concurrency_mode(hdd_context_t *pHddCtx, tVOS_CON_MODE mode);
915void wlan_hdd_clear_concurrency_mode(hdd_context_t *pHddCtx, tVOS_CON_MODE mode);
916void wlan_hdd_reset_prob_rspies(hdd_adapter_t* pHostapdAdapter);
917void hdd_prevent_suspend(void);
918void hdd_allow_suspend(void);
919v_U8_t hdd_is_ssr_required(void);
920void hdd_set_ssr_required(v_U8_t value);
921
922VOS_STATUS hdd_enable_bmps_imps(hdd_context_t *pHddCtx);
923VOS_STATUS hdd_disable_bmps_imps(hdd_context_t *pHddCtx, tANI_U8 session_type);
924
925eHalStatus hdd_smeCloseSessionCallback(void *pContext);
926#endif // end #if !defined( WLAN_HDD_MAIN_H )