linux/drivers/staging/rtl8712/rtl871x_mlme.h
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc.,
  16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17 *
  18 * Modifications for inclusion into the Linux staging tree are
  19 * Copyright(c) 2010 Larry Finger. All rights reserved.
  20 *
  21 * Contact information:
  22 * WLAN FAE <wlanfae@realtek.com>
  23 * Larry Finger <Larry.Finger@lwfinger.net>
  24 *
  25 ******************************************************************************/
  26#ifndef __RTL871X_MLME_H_
  27#define __RTL871X_MLME_H_
  28
  29#include "osdep_service.h"
  30#include "drv_types.h"
  31#include "wlan_bssdef.h"
  32
  33#define MAX_BSS_CNT     64
  34#define   MAX_JOIN_TIMEOUT      6000
  35
  36#define         SCANNING_TIMEOUT        4500
  37
  38#define SCANQUEUE_LIFETIME 20 /* unit:sec */
  39
  40#define         WIFI_NULL_STATE 0x00000000
  41#define WIFI_ASOC_STATE         0x00000001      /* Under Linked state...*/
  42#define         WIFI_REASOC_STATE 0x00000002
  43#define WIFI_SLEEP_STATE        0x00000004
  44#define WIFI_STATION_STATE      0x00000008
  45#define WIFI_AP_STATE           0x00000010
  46#define WIFI_ADHOC_STATE        0x00000020
  47#define   WIFI_ADHOC_MASTER_STATE 0x00000040
  48#define   WIFI_UNDER_LINKING    0x00000080
  49#define WIFI_SITE_MONITOR       0x00000800      /* to indicate the station
  50                                                 * is under site surveying*/
  51#define WIFI_MP_STATE           0x00010000
  52#define WIFI_MP_CTX_BACKGROUND  0x00020000      /* in cont. tx background*/
  53#define WIFI_MP_CTX_ST          0x00040000      /* in cont. tx with
  54                                                 *  single-tone*/
  55#define WIFI_MP_CTX_BACKGROUND_PENDING  0x00080000 /* pending in cont, tx
  56                                        * background due to out of skb*/
  57#define WIFI_MP_CTX_CCK_HW      0x00100000      /* in continuous tx*/
  58#define WIFI_MP_CTX_CCK_CS      0x00200000      /* in cont, tx with carrier
  59                                                 * suppression*/
  60#define   WIFI_MP_LPBK_STATE    0x00400000
  61
  62#define _FW_UNDER_LINKING       WIFI_UNDER_LINKING
  63#define _FW_LINKED              WIFI_ASOC_STATE
  64#define _FW_UNDER_SURVEY        WIFI_SITE_MONITOR
  65
  66/*
  67there are several "locks" in mlme_priv,
  68since mlme_priv is a shared resource between many threads,
  69like ISR/Call-Back functions, the OID handlers, and even timer functions.
  70Each _queue has its own locks, already.
  71Other items are protected by mlme_priv.lock.
  72To avoid possible dead lock, any thread trying to modify mlme_priv
  73SHALL not lock up more than one lock at a time!
  74*/
  75
  76#define traffic_threshold       10
  77#define traffic_scan_period     500
  78
  79struct sitesurvey_ctrl {
  80        u64     last_tx_pkts;
  81        uint    last_rx_pkts;
  82        sint    traffic_busy;
  83        struct timer_list sitesurvey_ctrl_timer;
  84};
  85
  86struct mlme_priv {
  87
  88        spinlock_t lock;
  89        spinlock_t lock2;
  90        sint    fw_state;       /*shall we protect this variable? */
  91        u8 to_join; /*flag*/
  92        u8 *nic_hdl;
  93        struct list_head *pscanned;
  94        struct  __queue free_bss_pool;
  95        struct  __queue scanned_queue;
  96        u8 *free_bss_buf;
  97        unsigned long num_of_scanned;
  98        u8 passive_mode; /*add for Android's SCAN-ACTIVE/SCAN-PASSIVE */
  99        struct ndis_802_11_ssid assoc_ssid;
 100        u8 assoc_bssid[6];
 101        struct wlan_network cur_network;
 102        struct sitesurvey_ctrl sitesurveyctrl;
 103        struct timer_list assoc_timer;
 104        uint assoc_by_bssid;
 105        uint assoc_by_rssi;
 106        struct timer_list scan_to_timer; /* driver handles scan_timeout.*/
 107        struct timer_list dhcp_timer; /* set dhcp to if driver in ps mode.*/
 108        struct qos_priv qospriv;
 109        struct ht_priv  htpriv;
 110        struct timer_list wdg_timer; /*watchdog periodic timer*/
 111};
 112
 113static inline u8 *get_bssid(struct mlme_priv *pmlmepriv)
 114{
 115        return pmlmepriv->cur_network.network.MacAddress;
 116}
 117
 118static inline u8 check_fwstate(struct mlme_priv *pmlmepriv, sint state)
 119{
 120        if (pmlmepriv->fw_state & state)
 121                return true;
 122        return false;
 123}
 124
 125static inline sint get_fwstate(struct mlme_priv *pmlmepriv)
 126{
 127        return pmlmepriv->fw_state;
 128}
 129
 130/*
 131 * No Limit on the calling context,
 132 * therefore set it to be the critical section...
 133 *
 134 * ### NOTE:#### (!!!!)
 135 * TAKE CARE BEFORE CALLING THIS FUNC, LOCK pmlmepriv->lock
 136 */
 137static inline void set_fwstate(struct mlme_priv *pmlmepriv, sint state)
 138{
 139        pmlmepriv->fw_state |= state;
 140}
 141
 142static inline void _clr_fwstate_(struct mlme_priv *pmlmepriv, sint state)
 143{
 144        pmlmepriv->fw_state &= ~state;
 145}
 146
 147/*
 148 * No Limit on the calling context,
 149 * therefore set it to be the critical section...
 150 */
 151static inline void clr_fwstate(struct mlme_priv *pmlmepriv, sint state)
 152{
 153        unsigned long irqL;
 154
 155        spin_lock_irqsave(&pmlmepriv->lock, irqL);
 156        if (check_fwstate(pmlmepriv, state))
 157                pmlmepriv->fw_state ^= state;
 158        spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
 159}
 160
 161static inline void up_scanned_network(struct mlme_priv *pmlmepriv)
 162{
 163        unsigned long irqL;
 164
 165        spin_lock_irqsave(&pmlmepriv->lock, irqL);
 166        pmlmepriv->num_of_scanned++;
 167        spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
 168}
 169
 170static inline void down_scanned_network(struct mlme_priv *pmlmepriv)
 171{
 172        unsigned long irqL;
 173
 174        spin_lock_irqsave(&pmlmepriv->lock, irqL);
 175        pmlmepriv->num_of_scanned--;
 176        spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
 177}
 178
 179static inline void set_scanned_network_val(struct mlme_priv *pmlmepriv,
 180                                             sint val)
 181{
 182        unsigned long irqL;
 183
 184        spin_lock_irqsave(&pmlmepriv->lock, irqL);
 185        pmlmepriv->num_of_scanned = val;
 186        spin_unlock_irqrestore(&pmlmepriv->lock, irqL);
 187}
 188
 189void r8712_survey_event_callback(struct _adapter *adapter, u8 *pbuf);
 190void r8712_surveydone_event_callback(struct _adapter *adapter, u8 *pbuf);
 191void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf);
 192void r8712_stassoc_event_callback(struct _adapter *adapter, u8 *pbuf);
 193void r8712_stadel_event_callback(struct _adapter *adapter, u8 *pbuf);
 194void r8712_atimdone_event_callback(struct _adapter *adapter, u8 *pbuf);
 195void r8712_cpwm_event_callback(struct _adapter *adapter, u8 *pbuf);
 196void r8712_wpspbc_event_callback(struct _adapter *adapter, u8 *pbuf);
 197void r8712_free_network_queue(struct _adapter *adapter);
 198int r8712_init_mlme_priv(struct _adapter *adapter);
 199void r8712_free_mlme_priv(struct mlme_priv *pmlmepriv);
 200sint r8712_select_and_join_from_scan(struct mlme_priv *pmlmepriv);
 201sint r8712_set_key(struct _adapter *adapter,
 202                   struct security_priv *psecuritypriv, sint keyid);
 203sint r8712_set_auth(struct _adapter *adapter,
 204                    struct security_priv *psecuritypriv);
 205uint r8712_get_wlan_bssid_ex_sz(struct wlan_bssid_ex *bss);
 206void r8712_generate_random_ibss(u8 *pibss);
 207u8 *r8712_get_capability_from_ie(u8 *ie);
 208struct wlan_network *r8712_get_oldest_wlan_network(
 209                                struct  __queue *scanned_queue);
 210void r8712_free_assoc_resources(struct _adapter *adapter);
 211void r8712_ind_disconnect(struct _adapter *adapter);
 212void r8712_indicate_connect(struct _adapter *adapter);
 213int r8712_restruct_sec_ie(struct _adapter *adapter, u8 *in_ie,
 214                          u8 *out_ie, uint in_len);
 215int r8712_restruct_wmm_ie(struct _adapter *adapter, u8 *in_ie,
 216                          u8 *out_ie, uint in_len, uint initial_out_len);
 217void r8712_init_registrypriv_dev_network(struct _adapter *adapter);
 218void r8712_update_registrypriv_dev_network(struct _adapter *adapter);
 219void _r8712_sitesurvey_ctrl_handler(struct _adapter *adapter);
 220void _r8712_join_timeout_handler(struct _adapter *adapter);
 221void r8712_scan_timeout_handler(struct _adapter *adapter);
 222void _r8712_dhcp_timeout_handler(struct _adapter *adapter);
 223void _r8712_wdg_timeout_handler(struct _adapter *adapter);
 224struct wlan_network *_r8712_alloc_network(struct mlme_priv *pmlmepriv);
 225sint r8712_if_up(struct _adapter *padapter);
 226void r8712_joinbss_reset(struct _adapter *padapter);
 227unsigned int r8712_restructure_ht_ie(struct _adapter *padapter, u8 *in_ie,
 228                                     u8 *out_ie, uint in_len, uint *pout_len);
 229void r8712_issue_addbareq_cmd(struct _adapter *padapter, int priority);
 230int r8712_is_same_ibss(struct _adapter *adapter, struct wlan_network *pnetwork);
 231
 232#endif /*__RTL871X_MLME_H_*/
 233