linux/drivers/staging/ks7010/ks_hostif.c
<<
>>
Prefs
   1/*
   2 *   Driver for KeyStream wireless LAN cards.
   3 *
   4 *   Copyright (C) 2005-2008 KeyStream Corp.
   5 *   Copyright (C) 2009 Renesas Technology Corp.
   6 *
   7 *   This program is free software; you can redistribute it and/or modify
   8 *   it under the terms of the GNU General Public License version 2 as
   9 *   published by the Free Software Foundation.
  10 */
  11
  12#include "ks_wlan.h"
  13#include "ks_hostif.h"
  14#include "eap_packet.h"
  15#include "michael_mic.h"
  16
  17#include <linux/etherdevice.h>
  18#include <linux/if_ether.h>
  19#include <linux/if_arp.h>
  20
  21/* Include Wireless Extension definition and check version */
  22#include <net/iw_handler.h>     /* New driver API */
  23
  24static inline void inc_smeqhead(struct ks_wlan_private *priv)
  25{
  26        priv->sme_i.qhead = (priv->sme_i.qhead + 1) % SME_EVENT_BUFF_SIZE;
  27}
  28
  29static inline void inc_smeqtail(struct ks_wlan_private *priv)
  30{
  31        priv->sme_i.qtail = (priv->sme_i.qtail + 1) % SME_EVENT_BUFF_SIZE;
  32}
  33
  34static inline unsigned int cnt_smeqbody(struct ks_wlan_private *priv)
  35{
  36        unsigned int sme_cnt = priv->sme_i.qtail - priv->sme_i.qhead;
  37
  38        return (sme_cnt + SME_EVENT_BUFF_SIZE) % SME_EVENT_BUFF_SIZE;
  39}
  40
  41#define KS_WLAN_MEM_FLAG (GFP_ATOMIC)
  42
  43static inline u8 get_byte(struct ks_wlan_private *priv)
  44{
  45        u8 data;
  46
  47        data = *(priv->rxp)++;
  48        /* length check in advance ! */
  49        --(priv->rx_size);
  50        return data;
  51}
  52
  53static inline u16 get_word(struct ks_wlan_private *priv)
  54{
  55        u16 data;
  56
  57        data = (get_byte(priv) & 0xff);
  58        data |= ((get_byte(priv) << 8) & 0xff00);
  59        return data;
  60}
  61
  62static inline u32 get_dword(struct ks_wlan_private *priv)
  63{
  64        u32 data;
  65
  66        data = (get_byte(priv) & 0xff);
  67        data |= ((get_byte(priv) << 8) & 0x0000ff00);
  68        data |= ((get_byte(priv) << 16) & 0x00ff0000);
  69        data |= ((get_byte(priv) << 24) & 0xff000000);
  70        return data;
  71}
  72
  73static void ks_wlan_hw_wakeup_task(struct work_struct *work)
  74{
  75        struct ks_wlan_private *priv;
  76        int ps_status;
  77        long time_left;
  78
  79        priv = container_of(work, struct ks_wlan_private, wakeup_work);
  80        ps_status = atomic_read(&priv->psstatus.status);
  81
  82        if (ps_status == PS_SNOOZE) {
  83                ks_wlan_hw_wakeup_request(priv);
  84                time_left = wait_for_completion_interruptible_timeout(
  85                                &priv->psstatus.wakeup_wait,
  86                                msecs_to_jiffies(20));
  87                if (time_left <= 0) {
  88                        netdev_dbg(priv->net_dev, "wake up timeout or interrupted !!!\n");
  89                        schedule_work(&priv->wakeup_work);
  90                        return;
  91                }
  92        }
  93
  94        /* power save */
  95        if (atomic_read(&priv->sme_task.count) > 0)
  96                tasklet_enable(&priv->sme_task);
  97}
  98
  99static
 100int ks_wlan_do_power_save(struct ks_wlan_private *priv)
 101{
 102        if (is_connect_status(priv->connect_status))
 103                hostif_sme_enqueue(priv, SME_POW_MNGMT_REQUEST);
 104        else
 105                priv->dev_state = DEVICE_STATE_READY;
 106        return 0;
 107}
 108
 109static
 110int get_current_ap(struct ks_wlan_private *priv, struct link_ap_info_t *ap_info)
 111{
 112        struct local_ap_t *ap;
 113        union iwreq_data wrqu;
 114        struct net_device *netdev = priv->net_dev;
 115
 116        ap = &priv->current_ap;
 117
 118        if (is_disconnect_status(priv->connect_status)) {
 119                memset(ap, 0, sizeof(struct local_ap_t));
 120                return -EPERM;
 121        }
 122
 123        /* bssid */
 124        memcpy(ap->bssid, ap_info->bssid, ETH_ALEN);
 125        /* essid */
 126        memcpy(ap->ssid.body, priv->reg.ssid.body,
 127               priv->reg.ssid.size);
 128        ap->ssid.size = priv->reg.ssid.size;
 129        /* rate_set */
 130        memcpy(ap->rate_set.body, ap_info->rate_set.body,
 131               ap_info->rate_set.size);
 132        ap->rate_set.size = ap_info->rate_set.size;
 133        if (ap_info->ext_rate_set.size != 0) {
 134                /* rate_set */
 135                memcpy(&ap->rate_set.body[ap->rate_set.size],
 136                       ap_info->ext_rate_set.body,
 137                       ap_info->ext_rate_set.size);
 138                ap->rate_set.size += ap_info->ext_rate_set.size;
 139        }
 140        /* channel */
 141        ap->channel = ap_info->ds_parameter.channel;
 142        /* rssi */
 143        ap->rssi = ap_info->rssi;
 144        /* sq */
 145        ap->sq = ap_info->sq;
 146        /* noise */
 147        ap->noise = ap_info->noise;
 148        /* capability */
 149        ap->capability = le16_to_cpu(ap_info->capability);
 150        /* rsn */
 151        if ((ap_info->rsn_mode & RSN_MODE_WPA2) &&
 152            (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)) {
 153                ap->rsn_ie.id = 0x30;
 154                if (ap_info->rsn.size <= RSN_IE_BODY_MAX) {
 155                        ap->rsn_ie.size = ap_info->rsn.size;
 156                        memcpy(ap->rsn_ie.body, ap_info->rsn.body,
 157                               ap_info->rsn.size);
 158                } else {
 159                        ap->rsn_ie.size = RSN_IE_BODY_MAX;
 160                        memcpy(ap->rsn_ie.body, ap_info->rsn.body,
 161                               RSN_IE_BODY_MAX);
 162                }
 163        } else if ((ap_info->rsn_mode & RSN_MODE_WPA) &&
 164                   (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA)) {
 165                ap->wpa_ie.id = 0xdd;
 166                if (ap_info->rsn.size <= RSN_IE_BODY_MAX) {
 167                        ap->wpa_ie.size = ap_info->rsn.size;
 168                        memcpy(ap->wpa_ie.body, ap_info->rsn.body,
 169                               ap_info->rsn.size);
 170                } else {
 171                        ap->wpa_ie.size = RSN_IE_BODY_MAX;
 172                        memcpy(ap->wpa_ie.body, ap_info->rsn.body,
 173                               RSN_IE_BODY_MAX);
 174                }
 175        } else {
 176                ap->rsn_ie.id = 0;
 177                ap->rsn_ie.size = 0;
 178                ap->wpa_ie.id = 0;
 179                ap->wpa_ie.size = 0;
 180        }
 181
 182        wrqu.data.length = 0;
 183        wrqu.data.flags = 0;
 184        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
 185        if (is_connect_status(priv->connect_status)) {
 186                memcpy(wrqu.ap_addr.sa_data,
 187                       priv->current_ap.bssid, ETH_ALEN);
 188                netdev_dbg(priv->net_dev,
 189                           "IWEVENT: connect bssid=%pM\n", wrqu.ap_addr.sa_data);
 190                wireless_send_event(netdev, SIOCGIWAP, &wrqu, NULL);
 191        }
 192        netdev_dbg(priv->net_dev, "    Link AP\n");
 193        netdev_dbg(priv->net_dev, "    bssid=%02X:%02X:%02X:%02X:%02X:%02X\n"
 194                   "    essid=%s\n"
 195                   "    rate_set=%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X\n"
 196                   "    channel=%d\n"
 197                   "    rssi=%d\n"
 198                   "    sq=%d\n"
 199                   "    capability=%04X\n",
 200                   ap->bssid[0], ap->bssid[1], ap->bssid[2],
 201                   ap->bssid[3], ap->bssid[4], ap->bssid[5],
 202                   &(ap->ssid.body[0]),
 203                   ap->rate_set.body[0], ap->rate_set.body[1],
 204                   ap->rate_set.body[2], ap->rate_set.body[3],
 205                   ap->rate_set.body[4], ap->rate_set.body[5],
 206                   ap->rate_set.body[6], ap->rate_set.body[7],
 207                   ap->channel, ap->rssi, ap->sq, ap->capability);
 208        netdev_dbg(priv->net_dev, "    Link AP\n    rsn.mode=%d\n    rsn.size=%d\n",
 209                   ap_info->rsn_mode, ap_info->rsn.size);
 210        netdev_dbg(priv->net_dev, "    ext_rate_set_size=%d\n    rate_set_size=%d\n",
 211                   ap_info->ext_rate_set.size, ap_info->rate_set.size);
 212
 213        return 0;
 214}
 215
 216static u8 read_ie(unsigned char *bp, u8 max, u8 *body)
 217{
 218        u8 size = (*(bp + 1) <= max) ? *(bp + 1) : max;
 219
 220        memcpy(body, bp + 2, size);
 221        return size;
 222}
 223
 224
 225static
 226int get_ap_information(struct ks_wlan_private *priv, struct ap_info_t *ap_info,
 227                       struct local_ap_t *ap)
 228{
 229        unsigned char *bp;
 230        int bsize, offset;
 231
 232        memset(ap, 0, sizeof(struct local_ap_t));
 233
 234        /* bssid */
 235        memcpy(ap->bssid, ap_info->bssid, ETH_ALEN);
 236        /* rssi */
 237        ap->rssi = ap_info->rssi;
 238        /* sq */
 239        ap->sq = ap_info->sq;
 240        /* noise */
 241        ap->noise = ap_info->noise;
 242        /* capability */
 243        ap->capability = le16_to_cpu(ap_info->capability);
 244        /* channel */
 245        ap->channel = ap_info->ch_info;
 246
 247        bp = ap_info->body;
 248        bsize = le16_to_cpu(ap_info->body_size);
 249        offset = 0;
 250
 251        while (bsize > offset) {
 252                switch (*bp) { /* Information Element ID */
 253                case WLAN_EID_SSID:
 254                        ap->ssid.size = read_ie(bp, IEEE80211_MAX_SSID_LEN,
 255                                                ap->ssid.body);
 256                        break;
 257                case WLAN_EID_SUPP_RATES:
 258                case WLAN_EID_EXT_SUPP_RATES:
 259                        if ((*(bp + 1) + ap->rate_set.size) <=
 260                            RATE_SET_MAX_SIZE) {
 261                                memcpy(&ap->rate_set.body[ap->rate_set.size],
 262                                       bp + 2, *(bp + 1));
 263                                ap->rate_set.size += *(bp + 1);
 264                        } else {
 265                                memcpy(&ap->rate_set.body[ap->rate_set.size],
 266                                       bp + 2,
 267                                       RATE_SET_MAX_SIZE - ap->rate_set.size);
 268                                ap->rate_set.size +=
 269                                    (RATE_SET_MAX_SIZE - ap->rate_set.size);
 270                        }
 271                        break;
 272                case WLAN_EID_DS_PARAMS:
 273                        break;
 274                case WLAN_EID_RSN:
 275                        ap->rsn_ie.id = *bp;
 276                        ap->rsn_ie.size = read_ie(bp, RSN_IE_BODY_MAX,
 277                                                  ap->rsn_ie.body);
 278                        break;
 279                case WLAN_EID_VENDOR_SPECIFIC: /* WPA */
 280                        /* WPA OUI check */
 281                        if (memcmp(bp + 2, CIPHER_ID_WPA_WEP40, 4) == 0) {
 282                                ap->wpa_ie.id = *bp;
 283                                ap->wpa_ie.size = read_ie(bp, RSN_IE_BODY_MAX,
 284                                                          ap->wpa_ie.body);
 285                        }
 286                        break;
 287
 288                case WLAN_EID_FH_PARAMS:
 289                case WLAN_EID_CF_PARAMS:
 290                case WLAN_EID_TIM:
 291                case WLAN_EID_IBSS_PARAMS:
 292                case WLAN_EID_COUNTRY:
 293                case WLAN_EID_ERP_INFO:
 294                        break;
 295                default:
 296                        netdev_err(priv->net_dev, "unknown Element ID=%d\n", *bp);
 297                        break;
 298                }
 299
 300                offset += 2;    /* id & size field */
 301                offset += *(bp + 1);    /* +size offset */
 302                bp += (*(bp + 1) + 2);  /* pointer update */
 303        }
 304
 305        return 0;
 306}
 307
 308static
 309int hostif_data_indication_wpa(struct ks_wlan_private *priv,
 310                               unsigned short auth_type)
 311{
 312        struct ether_hdr *eth_hdr;
 313        unsigned short eth_proto;
 314        unsigned char recv_mic[8];
 315        char buf[128];
 316        unsigned long now;
 317        struct mic_failure_t *mic_failure;
 318        struct michael_mic_t michael_mic;
 319        union iwreq_data wrqu;
 320        unsigned int key_index = auth_type - 1;
 321        struct wpa_key_t *key = &priv->wpa.key[key_index];
 322
 323        eth_hdr = (struct ether_hdr *)(priv->rxp);
 324        eth_proto = ntohs(eth_hdr->h_proto);
 325
 326        if (eth_hdr->h_dest_snap != eth_hdr->h_source_snap) {
 327                netdev_err(priv->net_dev, "invalid data format\n");
 328                priv->nstats.rx_errors++;
 329                return -EINVAL;
 330        }
 331        if (((auth_type == TYPE_PMK1 &&
 332              priv->wpa.pairwise_suite == IW_AUTH_CIPHER_TKIP) ||
 333             (auth_type == TYPE_GMK1 &&
 334              priv->wpa.group_suite == IW_AUTH_CIPHER_TKIP) ||
 335             (auth_type == TYPE_GMK2 &&
 336              priv->wpa.group_suite == IW_AUTH_CIPHER_TKIP)) &&
 337            key->key_len) {
 338                netdev_dbg(priv->net_dev, "TKIP: protocol=%04X: size=%u\n",
 339                           eth_proto, priv->rx_size);
 340                /* MIC save */
 341                memcpy(&recv_mic[0], (priv->rxp) + ((priv->rx_size) - 8), 8);
 342                priv->rx_size = priv->rx_size - 8;
 343                if (auth_type > 0 && auth_type < 4) {   /* auth_type check */
 344                        michael_mic_function(&michael_mic,
 345                                             (uint8_t *)key->rx_mic_key,
 346                                             (uint8_t *)priv->rxp,
 347                                             (int)priv->rx_size,
 348                                             (uint8_t)0,        /* priority */
 349                                             (uint8_t *)michael_mic.result);
 350                }
 351                if (memcmp(michael_mic.result, recv_mic, 8) != 0) {
 352                        now = jiffies;
 353                        mic_failure = &priv->wpa.mic_failure;
 354                        /* MIC FAILURE */
 355                        if (mic_failure->last_failure_time &&
 356                            (now - mic_failure->last_failure_time) / HZ >= 60) {
 357                                mic_failure->failure = 0;
 358                        }
 359                        netdev_err(priv->net_dev, "MIC FAILURE\n");
 360                        if (mic_failure->failure == 0) {
 361                                mic_failure->failure = 1;
 362                                mic_failure->counter = 0;
 363                        } else if (mic_failure->failure == 1) {
 364                                mic_failure->failure = 2;
 365                                mic_failure->counter =
 366                                        (uint16_t)((now - mic_failure->last_failure_time) / HZ);
 367                                if (!mic_failure->counter)      /*  range 1-60 */
 368                                        mic_failure->counter = 1;
 369                        }
 370                        priv->wpa.mic_failure.last_failure_time = now;
 371
 372                        /*  needed parameters: count, keyid, key type, TSC */
 373                        sprintf(buf,
 374                                "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr=%pM)",
 375                                key_index,
 376                                eth_hdr->h_dest[0] & 0x01 ? "broad" : "uni",
 377                                eth_hdr->h_source);
 378                        memset(&wrqu, 0, sizeof(wrqu));
 379                        wrqu.data.length = strlen(buf);
 380                        wireless_send_event(priv->net_dev, IWEVCUSTOM, &wrqu,
 381                                            buf);
 382                        return -EINVAL;
 383                }
 384        }
 385        return 0;
 386}
 387
 388static
 389void hostif_data_indication(struct ks_wlan_private *priv)
 390{
 391        unsigned int rx_ind_size;       /* indicate data size */
 392        struct sk_buff *skb;
 393        unsigned short auth_type;
 394        unsigned char temp[256];
 395        struct ether_hdr *eth_hdr;
 396        unsigned short eth_proto;
 397        struct ieee802_1x_hdr *aa1x_hdr;
 398        size_t size;
 399        int ret;
 400
 401        /* min length check */
 402        if (priv->rx_size <= ETH_HLEN) {
 403                priv->nstats.rx_errors++;
 404                return;
 405        }
 406
 407        auth_type = get_word(priv);     /* AuthType */
 408        get_word(priv); /* Reserve Area */
 409
 410        eth_hdr = (struct ether_hdr *)(priv->rxp);
 411        eth_proto = ntohs(eth_hdr->h_proto);
 412
 413        /* source address check */
 414        if (memcmp(&priv->eth_addr[0], eth_hdr->h_source, ETH_ALEN) == 0) {
 415                netdev_err(priv->net_dev, "invalid : source is own mac address !!\n");
 416                netdev_err(priv->net_dev,
 417                           "eth_hdrernet->h_dest=%02X:%02X:%02X:%02X:%02X:%02X\n",
 418                           eth_hdr->h_source[0], eth_hdr->h_source[1],
 419                           eth_hdr->h_source[2], eth_hdr->h_source[3],
 420                           eth_hdr->h_source[4], eth_hdr->h_source[5]);
 421                priv->nstats.rx_errors++;
 422                return;
 423        }
 424
 425        /*  for WPA */
 426        if (auth_type != TYPE_DATA && priv->wpa.rsn_enabled) {
 427                ret = hostif_data_indication_wpa(priv, auth_type);
 428                if (ret)
 429                        return;
 430        }
 431
 432        if ((priv->connect_status & FORCE_DISCONNECT) ||
 433            priv->wpa.mic_failure.failure == 2) {
 434                return;
 435        }
 436
 437        /* check 13th byte at rx data */
 438        switch (*(priv->rxp + 12)) {
 439        case 0xAA:      /* SNAP */
 440                rx_ind_size = priv->rx_size - 6;
 441                skb = dev_alloc_skb(rx_ind_size);
 442                if (!skb) {
 443                        priv->nstats.rx_dropped++;
 444                        return;
 445                }
 446                netdev_dbg(priv->net_dev, "SNAP, rx_ind_size = %d\n",
 447                           rx_ind_size);
 448
 449                size = ETH_ALEN * 2;
 450                skb_put_data(skb, priv->rxp, size);
 451
 452                /* (SNAP+UI..) skip */
 453
 454                size = rx_ind_size - (ETH_ALEN * 2);
 455                skb_put_data(skb, &eth_hdr->h_proto, size);
 456
 457                aa1x_hdr = (struct ieee802_1x_hdr *)(priv->rxp + ETHER_HDR_SIZE);
 458                break;
 459        case 0xF0:      /* NETBEUI/NetBIOS */
 460                rx_ind_size = (priv->rx_size + 2);
 461                skb = dev_alloc_skb(rx_ind_size);
 462                if (!skb) {
 463                        priv->nstats.rx_dropped++;
 464                        return;
 465                }
 466                netdev_dbg(priv->net_dev, "NETBEUI/NetBIOS rx_ind_size=%d\n",
 467                           rx_ind_size);
 468
 469                /* 8802/FDDI MAC copy */
 470                skb_put_data(skb, priv->rxp, 12);
 471
 472                /* NETBEUI size add */
 473                temp[0] = (((rx_ind_size - 12) >> 8) & 0xff);
 474                temp[1] = ((rx_ind_size - 12) & 0xff);
 475                skb_put_data(skb, temp, 2);
 476
 477                /* copy after Type */
 478                skb_put_data(skb, priv->rxp + 12, rx_ind_size - 14);
 479
 480                aa1x_hdr = (struct ieee802_1x_hdr *)(priv->rxp + 14);
 481                break;
 482        default:        /* other rx data */
 483                netdev_err(priv->net_dev, "invalid data format\n");
 484                priv->nstats.rx_errors++;
 485                return;
 486        }
 487
 488        if (aa1x_hdr->type == IEEE802_1X_TYPE_EAPOL_KEY &&
 489            priv->wpa.rsn_enabled)
 490                atomic_set(&priv->psstatus.snooze_guard, 1);
 491
 492        /* rx indication */
 493        skb->dev = priv->net_dev;
 494        skb->protocol = eth_type_trans(skb, skb->dev);
 495        priv->nstats.rx_packets++;
 496        priv->nstats.rx_bytes += rx_ind_size;
 497        netif_rx(skb);
 498}
 499
 500static
 501void hostif_mib_get_confirm(struct ks_wlan_private *priv)
 502{
 503        struct net_device *dev = priv->net_dev;
 504        u32 mib_status;
 505        u32 mib_attribute;
 506        u16 mib_val_size;
 507        u16 mib_val_type;
 508
 509        mib_status = get_dword(priv);   /* MIB status */
 510        mib_attribute = get_dword(priv);        /* MIB atttibute */
 511        mib_val_size = get_word(priv);  /* MIB value size */
 512        mib_val_type = get_word(priv);  /* MIB value type */
 513
 514        if (mib_status) {
 515                /* in case of error */
 516                netdev_err(priv->net_dev, "attribute=%08X, status=%08X\n",
 517                           mib_attribute, mib_status);
 518                return;
 519        }
 520
 521        switch (mib_attribute) {
 522        case DOT11_MAC_ADDRESS:
 523                /* MAC address */
 524                hostif_sme_enqueue(priv, SME_GET_MAC_ADDRESS);
 525                memcpy(priv->eth_addr, priv->rxp, ETH_ALEN);
 526                priv->mac_address_valid = true;
 527                dev->dev_addr[0] = priv->eth_addr[0];
 528                dev->dev_addr[1] = priv->eth_addr[1];
 529                dev->dev_addr[2] = priv->eth_addr[2];
 530                dev->dev_addr[3] = priv->eth_addr[3];
 531                dev->dev_addr[4] = priv->eth_addr[4];
 532                dev->dev_addr[5] = priv->eth_addr[5];
 533                dev->dev_addr[6] = 0x00;
 534                dev->dev_addr[7] = 0x00;
 535                netdev_info(dev, "MAC ADDRESS = %pM\n", priv->eth_addr);
 536                break;
 537        case DOT11_PRODUCT_VERSION:
 538                /* firmware version */
 539                priv->version_size = priv->rx_size;
 540                memcpy(priv->firmware_version, priv->rxp, priv->rx_size);
 541                priv->firmware_version[priv->rx_size] = '\0';
 542                netdev_info(dev, "firmware ver. = %s\n",
 543                            priv->firmware_version);
 544                hostif_sme_enqueue(priv, SME_GET_PRODUCT_VERSION);
 545                /* wake_up_interruptible_all(&priv->confirm_wait); */
 546                complete(&priv->confirm_wait);
 547                break;
 548        case LOCAL_GAIN:
 549                memcpy(&priv->gain, priv->rxp, sizeof(priv->gain));
 550                netdev_dbg(priv->net_dev, "tx_mode=%d, rx_mode=%d, tx_gain=%d, rx_gain=%d\n",
 551                           priv->gain.tx_mode, priv->gain.rx_mode,
 552                           priv->gain.tx_gain, priv->gain.rx_gain);
 553                break;
 554        case LOCAL_EEPROM_SUM:
 555                memcpy(&priv->eeprom_sum, priv->rxp, sizeof(priv->eeprom_sum));
 556                if (priv->eeprom_sum.type == 0) {
 557                        priv->eeprom_checksum = EEPROM_CHECKSUM_NONE;
 558                } else if (priv->eeprom_sum.type == 1) {
 559                        if (priv->eeprom_sum.result == 0) {
 560                                priv->eeprom_checksum = EEPROM_NG;
 561                                netdev_info(dev, "LOCAL_EEPROM_SUM NG\n");
 562                        } else if (priv->eeprom_sum.result == 1) {
 563                                priv->eeprom_checksum = EEPROM_OK;
 564                        }
 565                } else {
 566                        netdev_err(dev, "LOCAL_EEPROM_SUM error!\n");
 567                }
 568                break;
 569        default:
 570                netdev_err(priv->net_dev, "mib_attribute=%08x\n",
 571                           (unsigned int)mib_attribute);
 572                break;
 573        }
 574}
 575
 576static
 577void hostif_mib_set_confirm(struct ks_wlan_private *priv)
 578{
 579        u32 mib_status; /* +04 MIB Status */
 580        u32 mib_attribute;      /* +08 MIB attribute */
 581
 582        mib_status = get_dword(priv);   /* MIB Status */
 583        mib_attribute = get_dword(priv);        /* MIB attribute */
 584
 585        if (mib_status) {
 586                /* in case of error */
 587                netdev_err(priv->net_dev, "error :: attribute=%08X, status=%08X\n",
 588                           mib_attribute, mib_status);
 589        }
 590
 591        switch (mib_attribute) {
 592        case DOT11_RTS_THRESHOLD:
 593                hostif_sme_enqueue(priv, SME_RTS_THRESHOLD_CONFIRM);
 594                break;
 595        case DOT11_FRAGMENTATION_THRESHOLD:
 596                hostif_sme_enqueue(priv, SME_FRAGMENTATION_THRESHOLD_CONFIRM);
 597                break;
 598        case DOT11_WEP_DEFAULT_KEY_ID:
 599                if (!priv->wpa.wpa_enabled)
 600                        hostif_sme_enqueue(priv, SME_WEP_INDEX_CONFIRM);
 601                break;
 602        case DOT11_WEP_DEFAULT_KEY_VALUE1:
 603                if (priv->wpa.rsn_enabled)
 604                        hostif_sme_enqueue(priv, SME_SET_PMK_TSC);
 605                else
 606                        hostif_sme_enqueue(priv, SME_WEP_KEY1_CONFIRM);
 607                break;
 608        case DOT11_WEP_DEFAULT_KEY_VALUE2:
 609                if (priv->wpa.rsn_enabled)
 610                        hostif_sme_enqueue(priv, SME_SET_GMK1_TSC);
 611                else
 612                        hostif_sme_enqueue(priv, SME_WEP_KEY2_CONFIRM);
 613                break;
 614        case DOT11_WEP_DEFAULT_KEY_VALUE3:
 615                if (priv->wpa.rsn_enabled)
 616                        hostif_sme_enqueue(priv, SME_SET_GMK2_TSC);
 617                else
 618                        hostif_sme_enqueue(priv, SME_WEP_KEY3_CONFIRM);
 619                break;
 620        case DOT11_WEP_DEFAULT_KEY_VALUE4:
 621                if (!priv->wpa.rsn_enabled)
 622                        hostif_sme_enqueue(priv, SME_WEP_KEY4_CONFIRM);
 623                break;
 624        case DOT11_PRIVACY_INVOKED:
 625                if (!priv->wpa.rsn_enabled)
 626                        hostif_sme_enqueue(priv, SME_WEP_FLAG_CONFIRM);
 627                break;
 628        case DOT11_RSN_ENABLED:
 629                hostif_sme_enqueue(priv, SME_RSN_ENABLED_CONFIRM);
 630                break;
 631        case LOCAL_RSN_MODE:
 632                hostif_sme_enqueue(priv, SME_RSN_MODE_CONFIRM);
 633                break;
 634        case LOCAL_MULTICAST_ADDRESS:
 635                hostif_sme_enqueue(priv, SME_MULTICAST_REQUEST);
 636                break;
 637        case LOCAL_MULTICAST_FILTER:
 638                hostif_sme_enqueue(priv, SME_MULTICAST_CONFIRM);
 639                break;
 640        case LOCAL_CURRENTADDRESS:
 641                priv->mac_address_valid = true;
 642                break;
 643        case DOT11_RSN_CONFIG_MULTICAST_CIPHER:
 644                hostif_sme_enqueue(priv, SME_RSN_MCAST_CONFIRM);
 645                break;
 646        case DOT11_RSN_CONFIG_UNICAST_CIPHER:
 647                hostif_sme_enqueue(priv, SME_RSN_UCAST_CONFIRM);
 648                break;
 649        case DOT11_RSN_CONFIG_AUTH_SUITE:
 650                hostif_sme_enqueue(priv, SME_RSN_AUTH_CONFIRM);
 651                break;
 652        case DOT11_PMK_TSC:
 653                break;
 654        case DOT11_GMK1_TSC:
 655                if (atomic_read(&priv->psstatus.snooze_guard))
 656                        atomic_set(&priv->psstatus.snooze_guard, 0);
 657                break;
 658        case DOT11_GMK2_TSC:
 659                if (atomic_read(&priv->psstatus.snooze_guard))
 660                        atomic_set(&priv->psstatus.snooze_guard, 0);
 661                break;
 662        case LOCAL_PMK:
 663                break;
 664        case LOCAL_GAIN:
 665                break;
 666#ifdef WPS
 667        case LOCAL_WPS_ENABLE:
 668                break;
 669        case LOCAL_WPS_PROBE_REQ:
 670                break;
 671#endif /* WPS */
 672        case LOCAL_REGION:
 673        default:
 674                break;
 675        }
 676}
 677
 678static
 679void hostif_power_mgmt_confirm(struct ks_wlan_private *priv)
 680{
 681        if (priv->reg.power_mgmt > POWER_MGMT_ACTIVE &&
 682            priv->reg.operation_mode == MODE_INFRASTRUCTURE) {
 683                atomic_set(&priv->psstatus.confirm_wait, 0);
 684                priv->dev_state = DEVICE_STATE_SLEEP;
 685                ks_wlan_hw_power_save(priv);
 686        } else {
 687                priv->dev_state = DEVICE_STATE_READY;
 688        }
 689}
 690
 691static
 692void hostif_sleep_confirm(struct ks_wlan_private *priv)
 693{
 694        atomic_set(&priv->sleepstatus.doze_request, 1);
 695        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 696}
 697
 698static
 699void hostif_start_confirm(struct ks_wlan_private *priv)
 700{
 701#ifdef WPS
 702        union iwreq_data wrqu;
 703
 704        wrqu.data.length = 0;
 705        wrqu.data.flags = 0;
 706        wrqu.ap_addr.sa_family = ARPHRD_ETHER;
 707        if (is_connect_status(priv->connect_status)) {
 708                eth_zero_addr(wrqu.ap_addr.sa_data);
 709                wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
 710        }
 711#endif
 712        netdev_dbg(priv->net_dev, " scan_ind_count=%d\n", priv->scan_ind_count);
 713        hostif_sme_enqueue(priv, SME_START_CONFIRM);
 714}
 715
 716static
 717void hostif_connect_indication(struct ks_wlan_private *priv)
 718{
 719        unsigned short connect_code;
 720        unsigned int tmp = 0;
 721        unsigned int old_status = priv->connect_status;
 722        struct net_device *netdev = priv->net_dev;
 723        union iwreq_data wrqu0;
 724
 725        connect_code = get_word(priv);
 726
 727        switch (connect_code) {
 728        case RESULT_CONNECT:    /* connect */
 729                if (!(priv->connect_status & FORCE_DISCONNECT))
 730                        netif_carrier_on(netdev);
 731                tmp = FORCE_DISCONNECT & priv->connect_status;
 732                priv->connect_status = tmp + CONNECT_STATUS;
 733                break;
 734        case RESULT_DISCONNECT: /* disconnect */
 735                netif_carrier_off(netdev);
 736                tmp = FORCE_DISCONNECT & priv->connect_status;
 737                priv->connect_status = tmp + DISCONNECT_STATUS;
 738                break;
 739        default:
 740                netdev_dbg(priv->net_dev, "unknown connect_code=%d :: scan_ind_count=%d\n",
 741                           connect_code, priv->scan_ind_count);
 742                netif_carrier_off(netdev);
 743                tmp = FORCE_DISCONNECT & priv->connect_status;
 744                priv->connect_status = tmp + DISCONNECT_STATUS;
 745                break;
 746        }
 747
 748        get_current_ap(priv, (struct link_ap_info_t *)priv->rxp);
 749        if (is_connect_status(priv->connect_status) &&
 750            is_disconnect_status(old_status)) {
 751                /* for power save */
 752                atomic_set(&priv->psstatus.snooze_guard, 0);
 753                atomic_set(&priv->psstatus.confirm_wait, 0);
 754        }
 755        ks_wlan_do_power_save(priv);
 756
 757        wrqu0.data.length = 0;
 758        wrqu0.data.flags = 0;
 759        wrqu0.ap_addr.sa_family = ARPHRD_ETHER;
 760        if (is_disconnect_status(priv->connect_status) &&
 761            is_connect_status(old_status)) {
 762                eth_zero_addr(wrqu0.ap_addr.sa_data);
 763                netdev_dbg(priv->net_dev, "disconnect :: scan_ind_count=%d\n",
 764                           priv->scan_ind_count);
 765                wireless_send_event(netdev, SIOCGIWAP, &wrqu0, NULL);
 766        }
 767        priv->scan_ind_count = 0;
 768}
 769
 770static
 771void hostif_scan_indication(struct ks_wlan_private *priv)
 772{
 773        int i;
 774        struct ap_info_t *ap_info;
 775
 776        netdev_dbg(priv->net_dev, "scan_ind_count = %d\n", priv->scan_ind_count);
 777        ap_info = (struct ap_info_t *)(priv->rxp);
 778
 779        if (priv->scan_ind_count) {
 780                /* bssid check */
 781                for (i = 0; i < priv->aplist.size; i++) {
 782                        u8 *bssid = priv->aplist.ap[i].bssid;
 783
 784                        if (ether_addr_equal(ap_info->bssid, bssid))
 785                                continue;
 786
 787                        if (ap_info->frame_type == IEEE80211_STYPE_PROBE_RESP)
 788                                get_ap_information(priv, ap_info,
 789                                                   &priv->aplist.ap[i]);
 790                        return;
 791                }
 792        }
 793        priv->scan_ind_count++;
 794        if (priv->scan_ind_count < LOCAL_APLIST_MAX + 1) {
 795                netdev_dbg(priv->net_dev, " scan_ind_count=%d :: aplist.size=%d\n",
 796                        priv->scan_ind_count, priv->aplist.size);
 797                get_ap_information(priv, (struct ap_info_t *)(priv->rxp),
 798                                   &(priv->aplist.ap[priv->scan_ind_count - 1]));
 799                priv->aplist.size = priv->scan_ind_count;
 800        } else {
 801                netdev_dbg(priv->net_dev, " count over :: scan_ind_count=%d\n",
 802                           priv->scan_ind_count);
 803        }
 804}
 805
 806static
 807void hostif_stop_confirm(struct ks_wlan_private *priv)
 808{
 809        unsigned int tmp = 0;
 810        unsigned int old_status = priv->connect_status;
 811        struct net_device *netdev = priv->net_dev;
 812        union iwreq_data wrqu0;
 813
 814        if (priv->dev_state == DEVICE_STATE_SLEEP)
 815                priv->dev_state = DEVICE_STATE_READY;
 816
 817        /* disconnect indication */
 818        if (is_connect_status(priv->connect_status)) {
 819                netif_carrier_off(netdev);
 820                tmp = FORCE_DISCONNECT & priv->connect_status;
 821                priv->connect_status = tmp | DISCONNECT_STATUS;
 822                netdev_info(netdev, "IWEVENT: disconnect\n");
 823
 824                wrqu0.data.length = 0;
 825                wrqu0.data.flags = 0;
 826                wrqu0.ap_addr.sa_family = ARPHRD_ETHER;
 827                if (is_disconnect_status(priv->connect_status) &&
 828                    is_connect_status(old_status)) {
 829                        eth_zero_addr(wrqu0.ap_addr.sa_data);
 830                        netdev_info(netdev, "IWEVENT: disconnect\n");
 831                        wireless_send_event(netdev, SIOCGIWAP, &wrqu0, NULL);
 832                }
 833                priv->scan_ind_count = 0;
 834        }
 835
 836        hostif_sme_enqueue(priv, SME_STOP_CONFIRM);
 837}
 838
 839static
 840void hostif_ps_adhoc_set_confirm(struct ks_wlan_private *priv)
 841{
 842        priv->infra_status = 0; /* infrastructure mode cancel */
 843        hostif_sme_enqueue(priv, SME_MODE_SET_CONFIRM);
 844}
 845
 846static
 847void hostif_infrastructure_set_confirm(struct ks_wlan_private *priv)
 848{
 849        u16 result_code;
 850
 851        result_code = get_word(priv);
 852        priv->infra_status = 1; /* infrastructure mode set */
 853        hostif_sme_enqueue(priv, SME_MODE_SET_CONFIRM);
 854}
 855
 856static
 857void hostif_adhoc_set_confirm(struct ks_wlan_private *priv)
 858{
 859        priv->infra_status = 1; /* infrastructure mode set */
 860        hostif_sme_enqueue(priv, SME_MODE_SET_CONFIRM);
 861}
 862
 863static
 864void hostif_associate_indication(struct ks_wlan_private *priv)
 865{
 866        struct association_request_t *assoc_req;
 867        struct association_response_t *assoc_resp;
 868        unsigned char *pb;
 869        union iwreq_data wrqu;
 870        char buf[IW_CUSTOM_MAX];
 871        char *pbuf = &buf[0];
 872        int i;
 873
 874        static const char associnfo_leader0[] = "ASSOCINFO(ReqIEs=";
 875        static const char associnfo_leader1[] = " RespIEs=";
 876
 877        assoc_req = (struct association_request_t *)(priv->rxp);
 878        assoc_resp = (struct association_response_t *)(assoc_req + 1);
 879        pb = (unsigned char *)(assoc_resp + 1);
 880
 881        memset(&wrqu, 0, sizeof(wrqu));
 882        memcpy(pbuf, associnfo_leader0, sizeof(associnfo_leader0) - 1);
 883        wrqu.data.length += sizeof(associnfo_leader0) - 1;
 884        pbuf += sizeof(associnfo_leader0) - 1;
 885
 886        for (i = 0; i < le16_to_cpu(assoc_req->req_ies_size); i++)
 887                pbuf += sprintf(pbuf, "%02x", *(pb + i));
 888        wrqu.data.length += (le16_to_cpu(assoc_req->req_ies_size)) * 2;
 889
 890        memcpy(pbuf, associnfo_leader1, sizeof(associnfo_leader1) - 1);
 891        wrqu.data.length += sizeof(associnfo_leader1) - 1;
 892        pbuf += sizeof(associnfo_leader1) - 1;
 893
 894        pb += le16_to_cpu(assoc_req->req_ies_size);
 895        for (i = 0; i < le16_to_cpu(assoc_resp->resp_ies_size); i++)
 896                pbuf += sprintf(pbuf, "%02x", *(pb + i));
 897        wrqu.data.length += (le16_to_cpu(assoc_resp->resp_ies_size)) * 2;
 898
 899        pbuf += sprintf(pbuf, ")");
 900        wrqu.data.length += 1;
 901
 902        wireless_send_event(priv->net_dev, IWEVCUSTOM, &wrqu, buf);
 903}
 904
 905static
 906void hostif_bss_scan_confirm(struct ks_wlan_private *priv)
 907{
 908        unsigned int result_code;
 909        struct net_device *dev = priv->net_dev;
 910        union iwreq_data wrqu;
 911
 912        result_code = get_dword(priv);
 913        netdev_dbg(priv->net_dev, "result=%d :: scan_ind_count=%d\n", result_code,
 914                   priv->scan_ind_count);
 915
 916        priv->sme_i.sme_flag &= ~SME_AP_SCAN;
 917        hostif_sme_enqueue(priv, SME_BSS_SCAN_CONFIRM);
 918
 919        wrqu.data.length = 0;
 920        wrqu.data.flags = 0;
 921        wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL);
 922        priv->scan_ind_count = 0;
 923}
 924
 925static
 926void hostif_phy_information_confirm(struct ks_wlan_private *priv)
 927{
 928        struct iw_statistics *wstats = &priv->wstats;
 929        unsigned char rssi, signal, noise;
 930        unsigned char link_speed;
 931        unsigned int transmitted_frame_count, received_fragment_count;
 932        unsigned int failed_count, fcs_error_count;
 933
 934        rssi = get_byte(priv);
 935        signal = get_byte(priv);
 936        noise = get_byte(priv);
 937        link_speed = get_byte(priv);
 938        transmitted_frame_count = get_dword(priv);
 939        received_fragment_count = get_dword(priv);
 940        failed_count = get_dword(priv);
 941        fcs_error_count = get_dword(priv);
 942
 943        netdev_dbg(priv->net_dev, "phyinfo confirm rssi=%d signal=%d\n",
 944                   rssi, signal);
 945        priv->current_rate = (link_speed & RATE_MASK);
 946        wstats->qual.qual = signal;
 947        wstats->qual.level = 256 - rssi;
 948        wstats->qual.noise = 0; /* invalid noise value */
 949        wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
 950
 951        netdev_dbg(priv->net_dev, "\n    rssi=%u\n"
 952                   "    signal=%u\n"
 953                   "    link_speed=%ux500Kbps\n"
 954                   "    transmitted_frame_count=%u\n"
 955                   "    received_fragment_count=%u\n"
 956                   "    failed_count=%u\n"
 957                   "    fcs_error_count=%u\n",
 958                   rssi, signal, link_speed, transmitted_frame_count,
 959                   received_fragment_count, failed_count, fcs_error_count);
 960        /* wake_up_interruptible_all(&priv->confirm_wait); */
 961        complete(&priv->confirm_wait);
 962}
 963
 964static
 965void hostif_mic_failure_confirm(struct ks_wlan_private *priv)
 966{
 967        netdev_dbg(priv->net_dev, "mic_failure=%u\n", priv->wpa.mic_failure.failure);
 968        hostif_sme_enqueue(priv, SME_MIC_FAILURE_CONFIRM);
 969}
 970
 971static
 972void hostif_event_check(struct ks_wlan_private *priv)
 973{
 974        unsigned short event;
 975
 976        event = get_word(priv); /* get event */
 977        switch (event) {
 978        case HIF_DATA_IND:
 979                hostif_data_indication(priv);
 980                break;
 981        case HIF_MIB_GET_CONF:
 982                hostif_mib_get_confirm(priv);
 983                break;
 984        case HIF_MIB_SET_CONF:
 985                hostif_mib_set_confirm(priv);
 986                break;
 987        case HIF_POWER_MGMT_CONF:
 988                hostif_power_mgmt_confirm(priv);
 989                break;
 990        case HIF_SLEEP_CONF:
 991                hostif_sleep_confirm(priv);
 992                break;
 993        case HIF_START_CONF:
 994                hostif_start_confirm(priv);
 995                break;
 996        case HIF_CONNECT_IND:
 997                hostif_connect_indication(priv);
 998                break;
 999        case HIF_STOP_CONF:
1000                hostif_stop_confirm(priv);
1001                break;
1002        case HIF_PS_ADH_SET_CONF:
1003                hostif_ps_adhoc_set_confirm(priv);
1004                break;
1005        case HIF_INFRA_SET_CONF:
1006        case HIF_INFRA_SET2_CONF:
1007                hostif_infrastructure_set_confirm(priv);
1008                break;
1009        case HIF_ADH_SET_CONF:
1010        case HIF_ADH_SET2_CONF:
1011                hostif_adhoc_set_confirm(priv);
1012                break;
1013        case HIF_ASSOC_INFO_IND:
1014                hostif_associate_indication(priv);
1015                break;
1016        case HIF_MIC_FAILURE_CONF:
1017                hostif_mic_failure_confirm(priv);
1018                break;
1019        case HIF_SCAN_CONF:
1020                hostif_bss_scan_confirm(priv);
1021                break;
1022        case HIF_PHY_INFO_CONF:
1023        case HIF_PHY_INFO_IND:
1024                hostif_phy_information_confirm(priv);
1025                break;
1026        case HIF_SCAN_IND:
1027                hostif_scan_indication(priv);
1028                break;
1029        case HIF_AP_SET_CONF:
1030        default:
1031                netdev_err(priv->net_dev, "undefined event[%04X]\n", event);
1032                /* wake_up_all(&priv->confirm_wait); */
1033                complete(&priv->confirm_wait);
1034                break;
1035        }
1036
1037        /* add event to hostt buffer */
1038        priv->hostt.buff[priv->hostt.qtail] = event;
1039        priv->hostt.qtail = (priv->hostt.qtail + 1) % SME_EVENT_BUFF_SIZE;
1040}
1041
1042/* allocate size bytes, set header size and event */
1043static void *hostif_generic_request(size_t size, int event)
1044{
1045        struct hostif_hdr *p;
1046
1047        p = kzalloc(hif_align_size(size), KS_WLAN_MEM_FLAG);
1048        if (!p)
1049                return NULL;
1050
1051        p->size = cpu_to_le16((u16)(size - sizeof(p->size)));
1052        p->event = cpu_to_le16(event);
1053
1054        return p;
1055}
1056
1057int hostif_data_request(struct ks_wlan_private *priv, struct sk_buff *skb)
1058{
1059        unsigned int skb_len = 0;
1060
1061        unsigned char *buffer = NULL;
1062        unsigned int length = 0;
1063        struct hostif_data_request_t *pp;
1064        unsigned char *p;
1065        int result = 0;
1066        unsigned short eth_proto;
1067        struct ether_hdr *eth_hdr;
1068        struct michael_mic_t michael_mic;
1069        unsigned short keyinfo = 0;
1070        struct ieee802_1x_hdr *aa1x_hdr;
1071        struct wpa_eapol_key *eap_key;
1072        struct ethhdr *eth;
1073        size_t size;
1074        int ret;
1075
1076        skb_len = skb->len;
1077        if (skb_len > ETH_FRAME_LEN) {
1078                netdev_err(priv->net_dev, "bad length skb_len=%d\n", skb_len);
1079                ret = -EOVERFLOW;
1080                goto err_kfree_skb;
1081        }
1082
1083        if (is_disconnect_status(priv->connect_status) ||
1084            (priv->connect_status & FORCE_DISCONNECT) ||
1085            priv->wpa.mic_failure.stop) {
1086                if (netif_queue_stopped(priv->net_dev))
1087                        netif_wake_queue(priv->net_dev);
1088                if (skb)
1089                        dev_kfree_skb(skb);
1090
1091                return 0;
1092        }
1093
1094        /* power save wakeup */
1095        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
1096                if (!netif_queue_stopped(priv->net_dev))
1097                        netif_stop_queue(priv->net_dev);
1098        }
1099
1100        size = sizeof(*pp) + 6 + skb_len + 8;
1101        pp = kmalloc(hif_align_size(size), KS_WLAN_MEM_FLAG);
1102        if (!pp) {
1103                ret = -ENOMEM;
1104                goto err_kfree_skb;
1105        }
1106
1107        p = (unsigned char *)pp->data;
1108
1109        buffer = skb->data;
1110        length = skb->len;
1111
1112        /* skb check */
1113        eth = (struct ethhdr *)skb->data;
1114        if (memcmp(&priv->eth_addr[0], eth->h_source, ETH_ALEN) != 0) {
1115                netdev_err(priv->net_dev, "invalid mac address !!\n");
1116                netdev_err(priv->net_dev, "ethernet->h_source=%pM\n", eth->h_source);
1117                ret = -ENXIO;
1118                goto err_kfree;
1119        }
1120
1121        /* dest and src MAC address copy */
1122        size = ETH_ALEN * 2;
1123        memcpy(p, buffer, size);
1124        p += size;
1125        buffer += size;
1126        length -= size;
1127
1128        /* EtherType/Length check */
1129        if (*(buffer + 1) + (*buffer << 8) > 1500) {
1130                /* ProtocolEAP = *(buffer+1) + (*buffer << 8); */
1131                /* netdev_dbg(priv->net_dev, "Send [SNAP]Type %x\n",ProtocolEAP); */
1132                /* SAP/CTL/OUI(6 byte) add */
1133                *p++ = 0xAA;    /* DSAP */
1134                *p++ = 0xAA;    /* SSAP */
1135                *p++ = 0x03;    /* CTL */
1136                *p++ = 0x00;    /* OUI ("000000") */
1137                *p++ = 0x00;    /* OUI ("000000") */
1138                *p++ = 0x00;    /* OUI ("000000") */
1139                skb_len += 6;
1140        } else {
1141                /* Length(2 byte) delete */
1142                buffer += 2;
1143                length -= 2;
1144                skb_len -= 2;
1145        }
1146
1147        /* pp->data copy */
1148        memcpy(p, buffer, length);
1149
1150        p += length;
1151
1152        /* for WPA */
1153        eth_hdr = (struct ether_hdr *)&pp->data[0];
1154        eth_proto = ntohs(eth_hdr->h_proto);
1155
1156        /* for MIC FAILURE REPORT check */
1157        if (eth_proto == ETH_P_PAE &&
1158            priv->wpa.mic_failure.failure > 0) {
1159                aa1x_hdr = (struct ieee802_1x_hdr *)(eth_hdr + 1);
1160                if (aa1x_hdr->type == IEEE802_1X_TYPE_EAPOL_KEY) {
1161                        eap_key = (struct wpa_eapol_key *)(aa1x_hdr + 1);
1162                        keyinfo = ntohs(eap_key->key_info);
1163                }
1164        }
1165
1166        if (priv->wpa.rsn_enabled && priv->wpa.key[0].key_len) {
1167                /* no encryption */
1168                if (eth_proto == ETH_P_PAE &&
1169                    priv->wpa.key[1].key_len == 0 &&
1170                    priv->wpa.key[2].key_len == 0 &&
1171                    priv->wpa.key[3].key_len == 0) {
1172                        pp->auth_type = cpu_to_le16((uint16_t)TYPE_AUTH);
1173                } else {
1174                        if (priv->wpa.pairwise_suite == IW_AUTH_CIPHER_TKIP) {
1175                                michael_mic_function(&michael_mic,
1176                                                     (uint8_t *)priv->wpa.key[0].tx_mic_key,
1177                                                     (uint8_t *)&pp->data[0],
1178                                                     (int)skb_len,
1179                                                     (uint8_t)0,        /* priority */
1180                                                     (uint8_t *)michael_mic.result);
1181                                memcpy(p, michael_mic.result, 8);
1182                                length += 8;
1183                                skb_len += 8;
1184                                p += 8;
1185                                pp->auth_type =
1186                                    cpu_to_le16((uint16_t)TYPE_DATA);
1187
1188                        } else if (priv->wpa.pairwise_suite ==
1189                                   IW_AUTH_CIPHER_CCMP) {
1190                                pp->auth_type =
1191                                    cpu_to_le16((uint16_t)TYPE_DATA);
1192                        }
1193                }
1194        } else {
1195                if (eth_proto == ETH_P_PAE)
1196                        pp->auth_type = cpu_to_le16((uint16_t)TYPE_AUTH);
1197                else
1198                        pp->auth_type = cpu_to_le16((uint16_t)TYPE_DATA);
1199        }
1200
1201        /* header value set */
1202        pp->header.size =
1203            cpu_to_le16((uint16_t)
1204                        (sizeof(*pp) - sizeof(pp->header.size) + skb_len));
1205        pp->header.event = cpu_to_le16((uint16_t)HIF_DATA_REQ);
1206
1207        /* tx request */
1208        result = ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp) + skb_len),
1209                               send_packet_complete, skb);
1210
1211        /* MIC FAILURE REPORT check */
1212        if (eth_proto == ETH_P_PAE &&
1213            priv->wpa.mic_failure.failure > 0) {
1214                if (keyinfo & WPA_KEY_INFO_ERROR &&
1215                    keyinfo & WPA_KEY_INFO_REQUEST) {
1216                        netdev_err(priv->net_dev, " MIC ERROR Report SET : %04X\n", keyinfo);
1217                        hostif_sme_enqueue(priv, SME_MIC_FAILURE_REQUEST);
1218                }
1219                if (priv->wpa.mic_failure.failure == 2)
1220                        priv->wpa.mic_failure.stop = 1;
1221        }
1222
1223        return result;
1224
1225err_kfree:
1226        kfree(pp);
1227err_kfree_skb:
1228        dev_kfree_skb(skb);
1229
1230        return ret;
1231}
1232
1233static inline void ps_confirm_wait_inc(struct ks_wlan_private *priv)
1234{
1235        if (atomic_read(&priv->psstatus.status) > PS_ACTIVE_SET)
1236                atomic_inc(&priv->psstatus.confirm_wait);
1237}
1238
1239static
1240void hostif_mib_get_request(struct ks_wlan_private *priv,
1241                            unsigned long mib_attribute)
1242{
1243        struct hostif_mib_get_request_t *pp;
1244
1245        pp = hostif_generic_request(sizeof(*pp), HIF_MIB_GET_REQ);
1246        if (!pp)
1247                return;
1248
1249        pp->mib_attribute = cpu_to_le32((uint32_t)mib_attribute);
1250
1251        /* send to device request */
1252        ps_confirm_wait_inc(priv);
1253        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1254}
1255
1256static
1257void hostif_mib_set_request(struct ks_wlan_private *priv,
1258                            unsigned long mib_attribute, unsigned short size,
1259                            unsigned short type, void *vp)
1260{
1261        struct hostif_mib_set_request_t *pp;
1262
1263        if (priv->dev_state < DEVICE_STATE_BOOT)
1264                return;
1265
1266        pp = hostif_generic_request(sizeof(*pp), HIF_MIB_SET_REQ);
1267        if (!pp)
1268                return;
1269
1270        pp->mib_attribute = cpu_to_le32((uint32_t)mib_attribute);
1271        pp->mib_value.size = cpu_to_le16((uint16_t)size);
1272        pp->mib_value.type = cpu_to_le16((uint16_t)type);
1273        memcpy(&pp->mib_value.body, vp, size);
1274
1275        /* send to device request */
1276        ps_confirm_wait_inc(priv);
1277        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp) + size), NULL, NULL);
1278}
1279
1280static
1281void hostif_start_request(struct ks_wlan_private *priv, unsigned char mode)
1282{
1283        struct hostif_start_request_t *pp;
1284
1285        pp = hostif_generic_request(sizeof(*pp), HIF_START_REQ);
1286        if (!pp)
1287                return;
1288
1289        pp->mode = cpu_to_le16((uint16_t)mode);
1290
1291        /* send to device request */
1292        ps_confirm_wait_inc(priv);
1293        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1294
1295        priv->aplist.size = 0;
1296        priv->scan_ind_count = 0;
1297}
1298
1299static __le16 ks_wlan_cap(struct ks_wlan_private *priv)
1300{
1301        u16 capability = 0x0000;
1302
1303        if (priv->reg.preamble == SHORT_PREAMBLE)
1304                capability |= WLAN_CAPABILITY_SHORT_PREAMBLE;
1305
1306        capability &= ~(WLAN_CAPABILITY_PBCC);  /* pbcc not support */
1307
1308        if (priv->reg.phy_type != D_11B_ONLY_MODE) {
1309                capability |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
1310                capability &= ~(WLAN_CAPABILITY_DSSS_OFDM);
1311        }
1312
1313        return cpu_to_le16((uint16_t)capability);
1314}
1315
1316static void init_request(struct ks_wlan_private *priv, struct hostif_request_t *req)
1317{
1318        req->phy_type = cpu_to_le16((uint16_t)(priv->reg.phy_type));
1319        req->cts_mode = cpu_to_le16((uint16_t)(priv->reg.cts_mode));
1320        req->scan_type = cpu_to_le16((uint16_t)(priv->reg.scan_type));
1321        req->rate_set.size = priv->reg.rate_set.size;
1322        req->capability = ks_wlan_cap(priv);
1323        memcpy(&req->rate_set.body[0], &priv->reg.rate_set.body[0],
1324               priv->reg.rate_set.size);
1325}
1326
1327static
1328void hostif_ps_adhoc_set_request(struct ks_wlan_private *priv)
1329{
1330        struct hostif_ps_adhoc_set_request_t *pp;
1331
1332        pp = hostif_generic_request(sizeof(*pp), HIF_PS_ADH_SET_REQ);
1333        if (!pp)
1334                return;
1335
1336        init_request(priv, &pp->request);
1337        pp->channel = cpu_to_le16((uint16_t)(priv->reg.channel));
1338
1339        /* send to device request */
1340        ps_confirm_wait_inc(priv);
1341        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1342}
1343
1344static
1345void hostif_infrastructure_set_request(struct ks_wlan_private *priv, int event)
1346{
1347        struct hostif_infrastructure_set_request_t *pp;
1348
1349        pp = hostif_generic_request(sizeof(*pp), event);
1350        if (!pp)
1351                return;
1352
1353        init_request(priv, &pp->request);
1354        pp->ssid.size = priv->reg.ssid.size;
1355        memcpy(&pp->ssid.body[0], &priv->reg.ssid.body[0], priv->reg.ssid.size);
1356        pp->beacon_lost_count =
1357            cpu_to_le16((uint16_t)(priv->reg.beacon_lost_count));
1358        pp->auth_type = cpu_to_le16((uint16_t)(priv->reg.authenticate_type));
1359
1360        pp->channel_list.body[0] = 1;
1361        pp->channel_list.body[1] = 8;
1362        pp->channel_list.body[2] = 2;
1363        pp->channel_list.body[3] = 9;
1364        pp->channel_list.body[4] = 3;
1365        pp->channel_list.body[5] = 10;
1366        pp->channel_list.body[6] = 4;
1367        pp->channel_list.body[7] = 11;
1368        pp->channel_list.body[8] = 5;
1369        pp->channel_list.body[9] = 12;
1370        pp->channel_list.body[10] = 6;
1371        pp->channel_list.body[11] = 13;
1372        pp->channel_list.body[12] = 7;
1373        if (priv->reg.phy_type == D_11G_ONLY_MODE) {
1374                pp->channel_list.size = 13;
1375        } else {
1376                pp->channel_list.body[13] = 14;
1377                pp->channel_list.size = 14;
1378        }
1379
1380        /* send to device request */
1381        ps_confirm_wait_inc(priv);
1382        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1383}
1384
1385static
1386void hostif_adhoc_set_request(struct ks_wlan_private *priv)
1387{
1388        struct hostif_adhoc_set_request_t *pp;
1389
1390        pp = hostif_generic_request(sizeof(*pp), HIF_ADH_SET_REQ);
1391        if (!pp)
1392                return;
1393
1394        init_request(priv, &pp->request);
1395        pp->channel = cpu_to_le16((uint16_t)(priv->reg.channel));
1396        pp->ssid.size = priv->reg.ssid.size;
1397        memcpy(&pp->ssid.body[0], &priv->reg.ssid.body[0], priv->reg.ssid.size);
1398
1399        /* send to device request */
1400        ps_confirm_wait_inc(priv);
1401        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1402}
1403
1404static
1405void hostif_adhoc_set2_request(struct ks_wlan_private *priv)
1406{
1407        struct hostif_adhoc_set2_request_t *pp;
1408
1409        pp = hostif_generic_request(sizeof(*pp), HIF_ADH_SET_REQ);
1410        if (!pp)
1411                return;
1412
1413        init_request(priv, &pp->request);
1414        pp->ssid.size = priv->reg.ssid.size;
1415        memcpy(&pp->ssid.body[0], &priv->reg.ssid.body[0], priv->reg.ssid.size);
1416
1417        pp->channel_list.body[0] = priv->reg.channel;
1418        pp->channel_list.size = 1;
1419        memcpy(pp->bssid, priv->reg.bssid, ETH_ALEN);
1420
1421        /* send to device request */
1422        ps_confirm_wait_inc(priv);
1423        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1424}
1425
1426static
1427void hostif_stop_request(struct ks_wlan_private *priv)
1428{
1429        struct hostif_stop_request_t *pp;
1430
1431        pp = hostif_generic_request(sizeof(*pp), HIF_STOP_REQ);
1432        if (!pp)
1433                return;
1434
1435        /* send to device request */
1436        ps_confirm_wait_inc(priv);
1437        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1438}
1439
1440static
1441void hostif_phy_information_request(struct ks_wlan_private *priv)
1442{
1443        struct hostif_phy_information_request_t *pp;
1444
1445        pp = hostif_generic_request(sizeof(*pp), HIF_PHY_INFO_REQ);
1446        if (!pp)
1447                return;
1448
1449        if (priv->reg.phy_info_timer) {
1450                pp->type = cpu_to_le16((uint16_t)TIME_TYPE);
1451                pp->time = cpu_to_le16((uint16_t)(priv->reg.phy_info_timer));
1452        } else {
1453                pp->type = cpu_to_le16((uint16_t)NORMAL_TYPE);
1454                pp->time = cpu_to_le16((uint16_t)0);
1455        }
1456
1457        /* send to device request */
1458        ps_confirm_wait_inc(priv);
1459        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1460}
1461
1462static
1463void hostif_power_mgmt_request(struct ks_wlan_private *priv,
1464                               unsigned long mode, unsigned long wake_up,
1465                               unsigned long receive_dtims)
1466{
1467        struct hostif_power_mgmt_request_t *pp;
1468
1469        pp = hostif_generic_request(sizeof(*pp), HIF_POWER_MGMT_REQ);
1470        if (!pp)
1471                return;
1472
1473        pp->mode = cpu_to_le32((uint32_t)mode);
1474        pp->wake_up = cpu_to_le32((uint32_t)wake_up);
1475        pp->receive_dtims = cpu_to_le32((uint32_t)receive_dtims);
1476
1477        /* send to device request */
1478        ps_confirm_wait_inc(priv);
1479        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1480}
1481
1482static
1483void hostif_sleep_request(struct ks_wlan_private *priv,
1484                          enum sleep_mode_type mode)
1485{
1486        struct hostif_sleep_request_t *pp;
1487
1488        if (mode == SLP_SLEEP) {
1489                pp = hostif_generic_request(sizeof(*pp), HIF_SLEEP_REQ);
1490                if (!pp)
1491                        return;
1492
1493                /* send to device request */
1494                ps_confirm_wait_inc(priv);
1495                ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL,
1496                              NULL);
1497        } else if (mode == SLP_ACTIVE) {
1498                atomic_set(&priv->sleepstatus.wakeup_request, 1);
1499                queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
1500        } else {
1501                netdev_err(priv->net_dev, "invalid mode %ld\n", (long)mode);
1502                return;
1503        }
1504}
1505
1506static
1507void hostif_bss_scan_request(struct ks_wlan_private *priv,
1508                             unsigned long scan_type, uint8_t *scan_ssid,
1509                             uint8_t scan_ssid_len)
1510{
1511        struct hostif_bss_scan_request_t *pp;
1512
1513        pp = hostif_generic_request(sizeof(*pp), HIF_SCAN_REQ);
1514        if (!pp)
1515                return;
1516
1517        pp->scan_type = scan_type;
1518
1519        pp->ch_time_min = cpu_to_le32((uint32_t)110);   /* default value */
1520        pp->ch_time_max = cpu_to_le32((uint32_t)130);   /* default value */
1521        pp->channel_list.body[0] = 1;
1522        pp->channel_list.body[1] = 8;
1523        pp->channel_list.body[2] = 2;
1524        pp->channel_list.body[3] = 9;
1525        pp->channel_list.body[4] = 3;
1526        pp->channel_list.body[5] = 10;
1527        pp->channel_list.body[6] = 4;
1528        pp->channel_list.body[7] = 11;
1529        pp->channel_list.body[8] = 5;
1530        pp->channel_list.body[9] = 12;
1531        pp->channel_list.body[10] = 6;
1532        pp->channel_list.body[11] = 13;
1533        pp->channel_list.body[12] = 7;
1534        if (priv->reg.phy_type == D_11G_ONLY_MODE) {
1535                pp->channel_list.size = 13;
1536        } else {
1537                pp->channel_list.body[13] = 14;
1538                pp->channel_list.size = 14;
1539        }
1540        pp->ssid.size = 0;
1541
1542        /* specified SSID SCAN */
1543        if (scan_ssid_len > 0 && scan_ssid_len <= 32) {
1544                pp->ssid.size = scan_ssid_len;
1545                memcpy(&pp->ssid.body[0], scan_ssid, scan_ssid_len);
1546        }
1547
1548        /* send to device request */
1549        ps_confirm_wait_inc(priv);
1550        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1551
1552        priv->aplist.size = 0;
1553        priv->scan_ind_count = 0;
1554}
1555
1556static
1557void hostif_mic_failure_request(struct ks_wlan_private *priv,
1558                                unsigned short failure_count,
1559                                unsigned short timer)
1560{
1561        struct hostif_mic_failure_request_t *pp;
1562
1563        pp = hostif_generic_request(sizeof(*pp), HIF_MIC_FAILURE_REQ);
1564        if (!pp)
1565                return;
1566
1567        pp->failure_count = cpu_to_le16((uint16_t)failure_count);
1568        pp->timer = cpu_to_le16((uint16_t)timer);
1569
1570        /* send to device request */
1571        ps_confirm_wait_inc(priv);
1572        ks_wlan_hw_tx(priv, pp, hif_align_size(sizeof(*pp)), NULL, NULL);
1573}
1574
1575/* Device I/O Receive indicate */
1576static void devio_rec_ind(struct ks_wlan_private *priv, unsigned char *p,
1577                          unsigned int size)
1578{
1579        if (priv->device_open_status) {
1580                spin_lock(&priv->dev_read_lock);        /* request spin lock */
1581                priv->dev_data[atomic_read(&priv->rec_count)] = p;
1582                priv->dev_size[atomic_read(&priv->rec_count)] = size;
1583
1584                if (atomic_read(&priv->event_count) != DEVICE_STOCK_COUNT) {
1585                        /* rx event count inc */
1586                        atomic_inc(&priv->event_count);
1587                }
1588                atomic_inc(&priv->rec_count);
1589                if (atomic_read(&priv->rec_count) == DEVICE_STOCK_COUNT)
1590                        atomic_set(&priv->rec_count, 0);
1591
1592                wake_up_interruptible_all(&priv->devread_wait);
1593
1594                /* release spin lock */
1595                spin_unlock(&priv->dev_read_lock);
1596        }
1597}
1598
1599void hostif_receive(struct ks_wlan_private *priv, unsigned char *p,
1600                    unsigned int size)
1601{
1602        devio_rec_ind(priv, p, size);
1603
1604        priv->rxp = p;
1605        priv->rx_size = size;
1606
1607        if (get_word(priv) == priv->rx_size) {  /* length check !! */
1608                hostif_event_check(priv);       /* event check */
1609        }
1610}
1611
1612static
1613void hostif_sme_set_wep(struct ks_wlan_private *priv, int type)
1614{
1615        __le32 val;
1616
1617        switch (type) {
1618        case SME_WEP_INDEX_REQUEST:
1619                val = cpu_to_le32((uint32_t)(priv->reg.wep_index));
1620                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_ID,
1621                                       sizeof(val), MIB_VALUE_TYPE_INT, &val);
1622                break;
1623        case SME_WEP_KEY1_REQUEST:
1624                if (!priv->wpa.wpa_enabled)
1625                        hostif_mib_set_request(priv,
1626                                               DOT11_WEP_DEFAULT_KEY_VALUE1,
1627                                               priv->reg.wep_key[0].size,
1628                                               MIB_VALUE_TYPE_OSTRING,
1629                                               &priv->reg.wep_key[0].val[0]);
1630                break;
1631        case SME_WEP_KEY2_REQUEST:
1632                if (!priv->wpa.wpa_enabled)
1633                        hostif_mib_set_request(priv,
1634                                               DOT11_WEP_DEFAULT_KEY_VALUE2,
1635                                               priv->reg.wep_key[1].size,
1636                                               MIB_VALUE_TYPE_OSTRING,
1637                                               &priv->reg.wep_key[1].val[0]);
1638                break;
1639        case SME_WEP_KEY3_REQUEST:
1640                if (!priv->wpa.wpa_enabled)
1641                        hostif_mib_set_request(priv,
1642                                               DOT11_WEP_DEFAULT_KEY_VALUE3,
1643                                               priv->reg.wep_key[2].size,
1644                                               MIB_VALUE_TYPE_OSTRING,
1645                                               &priv->reg.wep_key[2].val[0]);
1646                break;
1647        case SME_WEP_KEY4_REQUEST:
1648                if (!priv->wpa.wpa_enabled)
1649                        hostif_mib_set_request(priv,
1650                                               DOT11_WEP_DEFAULT_KEY_VALUE4,
1651                                               priv->reg.wep_key[3].size,
1652                                               MIB_VALUE_TYPE_OSTRING,
1653                                               &priv->reg.wep_key[3].val[0]);
1654                break;
1655        case SME_WEP_FLAG_REQUEST:
1656                val = cpu_to_le32((uint32_t)(priv->reg.privacy_invoked));
1657                hostif_mib_set_request(priv, DOT11_PRIVACY_INVOKED,
1658                                       sizeof(val), MIB_VALUE_TYPE_BOOL, &val);
1659                break;
1660        }
1661}
1662
1663struct wpa_suite_t {
1664        __le16 size;
1665        unsigned char suite[4][CIPHER_ID_LEN];
1666} __packed;
1667
1668struct rsn_mode_t {
1669        __le32 rsn_mode;
1670        __le16 rsn_capability;
1671} __packed;
1672
1673static
1674void hostif_sme_set_rsn(struct ks_wlan_private *priv, int type)
1675{
1676        struct wpa_suite_t wpa_suite;
1677        struct rsn_mode_t rsn_mode;
1678        __le32 val;
1679
1680        memset(&wpa_suite, 0, sizeof(wpa_suite));
1681
1682        switch (type) {
1683        case SME_RSN_UCAST_REQUEST:
1684                wpa_suite.size = cpu_to_le16((uint16_t)1);
1685                switch (priv->wpa.pairwise_suite) {
1686                case IW_AUTH_CIPHER_NONE:
1687                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1688                                memcpy(&wpa_suite.suite[0][0],
1689                                       CIPHER_ID_WPA2_NONE, CIPHER_ID_LEN);
1690                        else
1691                                memcpy(&wpa_suite.suite[0][0],
1692                                       CIPHER_ID_WPA_NONE, CIPHER_ID_LEN);
1693                        break;
1694                case IW_AUTH_CIPHER_WEP40:
1695                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1696                                memcpy(&wpa_suite.suite[0][0],
1697                                       CIPHER_ID_WPA2_WEP40, CIPHER_ID_LEN);
1698                        else
1699                                memcpy(&wpa_suite.suite[0][0],
1700                                       CIPHER_ID_WPA_WEP40, CIPHER_ID_LEN);
1701                        break;
1702                case IW_AUTH_CIPHER_TKIP:
1703                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1704                                memcpy(&wpa_suite.suite[0][0],
1705                                       CIPHER_ID_WPA2_TKIP, CIPHER_ID_LEN);
1706                        else
1707                                memcpy(&wpa_suite.suite[0][0],
1708                                       CIPHER_ID_WPA_TKIP, CIPHER_ID_LEN);
1709                        break;
1710                case IW_AUTH_CIPHER_CCMP:
1711                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1712                                memcpy(&wpa_suite.suite[0][0],
1713                                       CIPHER_ID_WPA2_CCMP, CIPHER_ID_LEN);
1714                        else
1715                                memcpy(&wpa_suite.suite[0][0],
1716                                       CIPHER_ID_WPA_CCMP, CIPHER_ID_LEN);
1717                        break;
1718                case IW_AUTH_CIPHER_WEP104:
1719                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1720                                memcpy(&wpa_suite.suite[0][0],
1721                                       CIPHER_ID_WPA2_WEP104, CIPHER_ID_LEN);
1722                        else
1723                                memcpy(&wpa_suite.suite[0][0],
1724                                       CIPHER_ID_WPA_WEP104, CIPHER_ID_LEN);
1725                        break;
1726                }
1727
1728                hostif_mib_set_request(priv, DOT11_RSN_CONFIG_UNICAST_CIPHER,
1729                                       sizeof(wpa_suite.size) +
1730                                       CIPHER_ID_LEN *
1731                                       le16_to_cpu(wpa_suite.size),
1732                                       MIB_VALUE_TYPE_OSTRING, &wpa_suite);
1733                break;
1734        case SME_RSN_MCAST_REQUEST:
1735                switch (priv->wpa.group_suite) {
1736                case IW_AUTH_CIPHER_NONE:
1737                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1738                                memcpy(&wpa_suite.suite[0][0],
1739                                       CIPHER_ID_WPA2_NONE, CIPHER_ID_LEN);
1740                        else
1741                                memcpy(&wpa_suite.suite[0][0],
1742                                       CIPHER_ID_WPA_NONE, CIPHER_ID_LEN);
1743                        break;
1744                case IW_AUTH_CIPHER_WEP40:
1745                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1746                                memcpy(&wpa_suite.suite[0][0],
1747                                       CIPHER_ID_WPA2_WEP40, CIPHER_ID_LEN);
1748                        else
1749                                memcpy(&wpa_suite.suite[0][0],
1750                                       CIPHER_ID_WPA_WEP40, CIPHER_ID_LEN);
1751                        break;
1752                case IW_AUTH_CIPHER_TKIP:
1753                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1754                                memcpy(&wpa_suite.suite[0][0],
1755                                       CIPHER_ID_WPA2_TKIP, CIPHER_ID_LEN);
1756                        else
1757                                memcpy(&wpa_suite.suite[0][0],
1758                                       CIPHER_ID_WPA_TKIP, CIPHER_ID_LEN);
1759                        break;
1760                case IW_AUTH_CIPHER_CCMP:
1761                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1762                                memcpy(&wpa_suite.suite[0][0],
1763                                       CIPHER_ID_WPA2_CCMP, CIPHER_ID_LEN);
1764                        else
1765                                memcpy(&wpa_suite.suite[0][0],
1766                                       CIPHER_ID_WPA_CCMP, CIPHER_ID_LEN);
1767                        break;
1768                case IW_AUTH_CIPHER_WEP104:
1769                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1770                                memcpy(&wpa_suite.suite[0][0],
1771                                       CIPHER_ID_WPA2_WEP104, CIPHER_ID_LEN);
1772                        else
1773                                memcpy(&wpa_suite.suite[0][0],
1774                                       CIPHER_ID_WPA_WEP104, CIPHER_ID_LEN);
1775                        break;
1776                }
1777
1778                hostif_mib_set_request(priv, DOT11_RSN_CONFIG_MULTICAST_CIPHER,
1779                                       CIPHER_ID_LEN, MIB_VALUE_TYPE_OSTRING,
1780                                       &wpa_suite.suite[0][0]);
1781                break;
1782        case SME_RSN_AUTH_REQUEST:
1783                wpa_suite.size = cpu_to_le16((uint16_t)1);
1784                switch (priv->wpa.key_mgmt_suite) {
1785                case IW_AUTH_KEY_MGMT_802_1X:
1786                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1787                                memcpy(&wpa_suite.suite[0][0],
1788                                       KEY_MGMT_ID_WPA2_1X, KEY_MGMT_ID_LEN);
1789                        else
1790                                memcpy(&wpa_suite.suite[0][0],
1791                                       KEY_MGMT_ID_WPA_1X, KEY_MGMT_ID_LEN);
1792                        break;
1793                case IW_AUTH_KEY_MGMT_PSK:
1794                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1795                                memcpy(&wpa_suite.suite[0][0],
1796                                       KEY_MGMT_ID_WPA2_PSK, KEY_MGMT_ID_LEN);
1797                        else
1798                                memcpy(&wpa_suite.suite[0][0],
1799                                       KEY_MGMT_ID_WPA_PSK, KEY_MGMT_ID_LEN);
1800                        break;
1801                case 0:
1802                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1803                                memcpy(&wpa_suite.suite[0][0],
1804                                       KEY_MGMT_ID_WPA2_NONE, KEY_MGMT_ID_LEN);
1805                        else
1806                                memcpy(&wpa_suite.suite[0][0],
1807                                       KEY_MGMT_ID_WPA_NONE, KEY_MGMT_ID_LEN);
1808                        break;
1809                case 4:
1810                        if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2)
1811                                memcpy(&wpa_suite.suite[0][0],
1812                                       KEY_MGMT_ID_WPA2_WPANONE,
1813                                       KEY_MGMT_ID_LEN);
1814                        else
1815                                memcpy(&wpa_suite.suite[0][0],
1816                                       KEY_MGMT_ID_WPA_WPANONE,
1817                                       KEY_MGMT_ID_LEN);
1818                        break;
1819                }
1820
1821                hostif_mib_set_request(priv, DOT11_RSN_CONFIG_AUTH_SUITE,
1822                                       sizeof(wpa_suite.size) +
1823                                       KEY_MGMT_ID_LEN *
1824                                       le16_to_cpu(wpa_suite.size),
1825                                       MIB_VALUE_TYPE_OSTRING, &wpa_suite);
1826                break;
1827        case SME_RSN_ENABLED_REQUEST:
1828                val = cpu_to_le32((uint32_t)(priv->wpa.rsn_enabled));
1829                hostif_mib_set_request(priv, DOT11_RSN_ENABLED,
1830                                       sizeof(val), MIB_VALUE_TYPE_BOOL, &val);
1831                break;
1832        case SME_RSN_MODE_REQUEST:
1833                if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA2) {
1834                        rsn_mode.rsn_mode =
1835                            cpu_to_le32((uint32_t)RSN_MODE_WPA2);
1836                        rsn_mode.rsn_capability = cpu_to_le16((uint16_t)0);
1837                } else if (priv->wpa.version == IW_AUTH_WPA_VERSION_WPA) {
1838                        rsn_mode.rsn_mode =
1839                            cpu_to_le32((uint32_t)RSN_MODE_WPA);
1840                        rsn_mode.rsn_capability = cpu_to_le16((uint16_t)0);
1841                } else {
1842                        rsn_mode.rsn_mode =
1843                            cpu_to_le32((uint32_t)RSN_MODE_NONE);
1844                        rsn_mode.rsn_capability = cpu_to_le16((uint16_t)0);
1845                }
1846                hostif_mib_set_request(priv, LOCAL_RSN_MODE, sizeof(rsn_mode),
1847                                       MIB_VALUE_TYPE_OSTRING, &rsn_mode);
1848                break;
1849        }
1850}
1851
1852static
1853void hostif_sme_mode_setup(struct ks_wlan_private *priv)
1854{
1855        unsigned char rate_size;
1856        unsigned char rate_octet[RATE_SET_MAX_SIZE];
1857        int i = 0;
1858
1859        /* rate setting if rate segging is auto for changing phy_type (#94) */
1860        if (priv->reg.tx_rate == TX_RATE_FULL_AUTO) {
1861                if (priv->reg.phy_type == D_11B_ONLY_MODE) {
1862                        priv->reg.rate_set.body[3] = TX_RATE_11M;
1863                        priv->reg.rate_set.body[2] = TX_RATE_5M;
1864                        priv->reg.rate_set.body[1] = TX_RATE_2M | BASIC_RATE;
1865                        priv->reg.rate_set.body[0] = TX_RATE_1M | BASIC_RATE;
1866                        priv->reg.rate_set.size = 4;
1867                } else {        /* D_11G_ONLY_MODE or D_11BG_COMPATIBLE_MODE */
1868                        priv->reg.rate_set.body[11] = TX_RATE_54M;
1869                        priv->reg.rate_set.body[10] = TX_RATE_48M;
1870                        priv->reg.rate_set.body[9] = TX_RATE_36M;
1871                        priv->reg.rate_set.body[8] = TX_RATE_18M;
1872                        priv->reg.rate_set.body[7] = TX_RATE_9M;
1873                        priv->reg.rate_set.body[6] = TX_RATE_24M | BASIC_RATE;
1874                        priv->reg.rate_set.body[5] = TX_RATE_12M | BASIC_RATE;
1875                        priv->reg.rate_set.body[4] = TX_RATE_6M | BASIC_RATE;
1876                        priv->reg.rate_set.body[3] = TX_RATE_11M | BASIC_RATE;
1877                        priv->reg.rate_set.body[2] = TX_RATE_5M | BASIC_RATE;
1878                        priv->reg.rate_set.body[1] = TX_RATE_2M | BASIC_RATE;
1879                        priv->reg.rate_set.body[0] = TX_RATE_1M | BASIC_RATE;
1880                        priv->reg.rate_set.size = 12;
1881                }
1882        }
1883
1884        /* rate mask by phy setting */
1885        if (priv->reg.phy_type == D_11B_ONLY_MODE) {
1886                for (i = 0; i < priv->reg.rate_set.size; i++) {
1887                        if (!IS_11B_RATE(priv->reg.rate_set.body[i]))
1888                                break;
1889
1890                        if ((priv->reg.rate_set.body[i] & RATE_MASK) >= TX_RATE_5M) {
1891                                rate_octet[i] = priv->reg.rate_set.body[i] &
1892                                                RATE_MASK;
1893                        } else {
1894                                rate_octet[i] = priv->reg.rate_set.body[i];
1895                        }
1896                }
1897
1898        } else {        /* D_11G_ONLY_MODE or D_11BG_COMPATIBLE_MODE */
1899                for (i = 0; i < priv->reg.rate_set.size; i++) {
1900                        if (!IS_11BG_RATE(priv->reg.rate_set.body[i]))
1901                                break;
1902
1903                        if (IS_OFDM_EXT_RATE(priv->reg.rate_set.body[i])) {
1904                                rate_octet[i] = priv->reg.rate_set.body[i] &
1905                                                RATE_MASK;
1906                        } else {
1907                                rate_octet[i] = priv->reg.rate_set.body[i];
1908                        }
1909                }
1910        }
1911        rate_size = i;
1912        if (rate_size == 0) {
1913                if (priv->reg.phy_type == D_11G_ONLY_MODE)
1914                        rate_octet[0] = TX_RATE_6M | BASIC_RATE;
1915                else
1916                        rate_octet[0] = TX_RATE_2M | BASIC_RATE;
1917                rate_size = 1;
1918        }
1919
1920        /* rate set update */
1921        priv->reg.rate_set.size = rate_size;
1922        memcpy(&priv->reg.rate_set.body[0], &rate_octet[0], rate_size);
1923
1924        switch (priv->reg.operation_mode) {
1925        case MODE_PSEUDO_ADHOC:
1926                /* Pseudo Ad-Hoc mode */
1927                hostif_ps_adhoc_set_request(priv);
1928                break;
1929        case MODE_INFRASTRUCTURE:
1930                /* Infrastructure mode */
1931                if (!is_valid_ether_addr((u8 *)priv->reg.bssid)) {
1932                        hostif_infrastructure_set_request(priv, HIF_INFRA_SET_REQ);
1933                } else {
1934                        hostif_infrastructure_set_request(priv, HIF_INFRA_SET2_REQ);
1935                        netdev_dbg(priv->net_dev,
1936                                   "Infra bssid = %pM\n", priv->reg.bssid);
1937                }
1938                break;
1939        case MODE_ADHOC:
1940                /* IEEE802.11 Ad-Hoc mode */
1941                if (!is_valid_ether_addr((u8 *)priv->reg.bssid)) {
1942                        hostif_adhoc_set_request(priv);
1943                } else {
1944                        hostif_adhoc_set2_request(priv);
1945                        netdev_dbg(priv->net_dev,
1946                                   "Adhoc bssid = %pM\n", priv->reg.bssid);
1947                }
1948                break;
1949        default:
1950                break;
1951        }
1952}
1953
1954static
1955void hostif_sme_multicast_set(struct ks_wlan_private *priv)
1956{
1957        struct net_device *dev = priv->net_dev;
1958        int mc_count;
1959        struct netdev_hw_addr *ha;
1960        char set_address[NIC_MAX_MCAST_LIST * ETH_ALEN];
1961        __le32 filter_type;
1962        int i = 0;
1963
1964        spin_lock(&priv->multicast_spin);
1965
1966        memset(set_address, 0, NIC_MAX_MCAST_LIST * ETH_ALEN);
1967
1968        if (dev->flags & IFF_PROMISC) {
1969                filter_type = cpu_to_le32((uint32_t)MCAST_FILTER_PROMISC);
1970                hostif_mib_set_request(priv, LOCAL_MULTICAST_FILTER,
1971                                       sizeof(filter_type), MIB_VALUE_TYPE_BOOL,
1972                                       &filter_type);
1973                goto spin_unlock;
1974        }
1975
1976        if ((netdev_mc_count(dev) > NIC_MAX_MCAST_LIST) ||
1977            (dev->flags & IFF_ALLMULTI)) {
1978                filter_type = cpu_to_le32((uint32_t)MCAST_FILTER_MCASTALL);
1979                hostif_mib_set_request(priv, LOCAL_MULTICAST_FILTER,
1980                                       sizeof(filter_type), MIB_VALUE_TYPE_BOOL,
1981                                       &filter_type);
1982                goto spin_unlock;
1983        }
1984
1985        if (priv->sme_i.sme_flag & SME_MULTICAST) {
1986                mc_count = netdev_mc_count(dev);
1987                netdev_for_each_mc_addr(ha, dev) {
1988                        memcpy(&set_address[i * ETH_ALEN], ha->addr, ETH_ALEN);
1989                        i++;
1990                }
1991                priv->sme_i.sme_flag &= ~SME_MULTICAST;
1992                hostif_mib_set_request(priv, LOCAL_MULTICAST_ADDRESS,
1993                                       ETH_ALEN * mc_count,
1994                                       MIB_VALUE_TYPE_OSTRING,
1995                                       &set_address[0]);
1996        } else {
1997                filter_type = cpu_to_le32((uint32_t)MCAST_FILTER_MCAST);
1998                priv->sme_i.sme_flag |= SME_MULTICAST;
1999                hostif_mib_set_request(priv, LOCAL_MULTICAST_FILTER,
2000                                       sizeof(filter_type), MIB_VALUE_TYPE_BOOL,
2001                                       &filter_type);
2002        }
2003
2004spin_unlock:
2005        spin_unlock(&priv->multicast_spin);
2006}
2007
2008static
2009void hostif_sme_power_mgmt_set(struct ks_wlan_private *priv)
2010{
2011        unsigned long mode, wake_up, receive_dtims;
2012
2013        switch (priv->reg.power_mgmt) {
2014        case POWER_MGMT_ACTIVE:
2015                mode = POWER_ACTIVE;
2016                wake_up = 0;
2017                receive_dtims = 0;
2018                break;
2019        case POWER_MGMT_SAVE1:
2020                if (priv->reg.operation_mode == MODE_INFRASTRUCTURE) {
2021                        mode = POWER_SAVE;
2022                        wake_up = 0;
2023                        receive_dtims = 0;
2024                } else {
2025                        mode = POWER_ACTIVE;
2026                        wake_up = 0;
2027                        receive_dtims = 0;
2028                }
2029                break;
2030        case POWER_MGMT_SAVE2:
2031                if (priv->reg.operation_mode == MODE_INFRASTRUCTURE) {
2032                        mode = POWER_SAVE;
2033                        wake_up = 0;
2034                        receive_dtims = 1;
2035                } else {
2036                        mode = POWER_ACTIVE;
2037                        wake_up = 0;
2038                        receive_dtims = 0;
2039                }
2040                break;
2041        default:
2042                mode = POWER_ACTIVE;
2043                wake_up = 0;
2044                receive_dtims = 0;
2045                break;
2046        }
2047        hostif_power_mgmt_request(priv, mode, wake_up, receive_dtims);
2048}
2049
2050static
2051void hostif_sme_sleep_set(struct ks_wlan_private *priv)
2052{
2053        switch (priv->sleep_mode) {
2054        case SLP_SLEEP:
2055                hostif_sleep_request(priv, priv->sleep_mode);
2056                break;
2057        case SLP_ACTIVE:
2058                hostif_sleep_request(priv, priv->sleep_mode);
2059                break;
2060        default:
2061                break;
2062        }
2063}
2064
2065static
2066void hostif_sme_set_key(struct ks_wlan_private *priv, int type)
2067{
2068        __le32 val;
2069
2070        switch (type) {
2071        case SME_SET_FLAG:
2072                val = cpu_to_le32((uint32_t)(priv->reg.privacy_invoked));
2073                hostif_mib_set_request(priv, DOT11_PRIVACY_INVOKED,
2074                                       sizeof(val), MIB_VALUE_TYPE_BOOL, &val);
2075                break;
2076        case SME_SET_TXKEY:
2077                val = cpu_to_le32((uint32_t)(priv->wpa.txkey));
2078                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_ID,
2079                                       sizeof(val), MIB_VALUE_TYPE_INT, &val);
2080                break;
2081        case SME_SET_KEY1:
2082                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_VALUE1,
2083                                       priv->wpa.key[0].key_len,
2084                                       MIB_VALUE_TYPE_OSTRING,
2085                                       &priv->wpa.key[0].key_val[0]);
2086                break;
2087        case SME_SET_KEY2:
2088                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_VALUE2,
2089                                       priv->wpa.key[1].key_len,
2090                                       MIB_VALUE_TYPE_OSTRING,
2091                                       &priv->wpa.key[1].key_val[0]);
2092                break;
2093        case SME_SET_KEY3:
2094                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_VALUE3,
2095                                       priv->wpa.key[2].key_len,
2096                                       MIB_VALUE_TYPE_OSTRING,
2097                                       &priv->wpa.key[2].key_val[0]);
2098                break;
2099        case SME_SET_KEY4:
2100                hostif_mib_set_request(priv, DOT11_WEP_DEFAULT_KEY_VALUE4,
2101                                       priv->wpa.key[3].key_len,
2102                                       MIB_VALUE_TYPE_OSTRING,
2103                                       &priv->wpa.key[3].key_val[0]);
2104                break;
2105        case SME_SET_PMK_TSC:
2106                hostif_mib_set_request(priv, DOT11_PMK_TSC,
2107                                       WPA_RX_SEQ_LEN, MIB_VALUE_TYPE_OSTRING,
2108                                       &priv->wpa.key[0].rx_seq[0]);
2109                break;
2110        case SME_SET_GMK1_TSC:
2111                hostif_mib_set_request(priv, DOT11_GMK1_TSC,
2112                                       WPA_RX_SEQ_LEN, MIB_VALUE_TYPE_OSTRING,
2113                                       &priv->wpa.key[1].rx_seq[0]);
2114                break;
2115        case SME_SET_GMK2_TSC:
2116                hostif_mib_set_request(priv, DOT11_GMK2_TSC,
2117                                       WPA_RX_SEQ_LEN, MIB_VALUE_TYPE_OSTRING,
2118                                       &priv->wpa.key[2].rx_seq[0]);
2119                break;
2120        }
2121}
2122
2123static
2124void hostif_sme_set_pmksa(struct ks_wlan_private *priv)
2125{
2126        struct pmk_cache_t {
2127                __le16 size;
2128                struct {
2129                        u8 bssid[ETH_ALEN];
2130                        u8 pmkid[IW_PMKID_LEN];
2131                } __packed list[PMK_LIST_MAX];
2132        } __packed pmkcache;
2133        struct pmk_t *pmk;
2134        int i;
2135
2136        i = 0;
2137        list_for_each_entry(pmk, &priv->pmklist.head, list) {
2138                if (i < PMK_LIST_MAX) {
2139                        memcpy(pmkcache.list[i].bssid, pmk->bssid, ETH_ALEN);
2140                        memcpy(pmkcache.list[i].pmkid, pmk->pmkid,
2141                               IW_PMKID_LEN);
2142                        i++;
2143                }
2144        }
2145        pmkcache.size = cpu_to_le16((uint16_t)(priv->pmklist.size));
2146        hostif_mib_set_request(priv, LOCAL_PMK,
2147                               sizeof(priv->pmklist.size) + (ETH_ALEN +
2148                                                             IW_PMKID_LEN) *
2149                               (priv->pmklist.size), MIB_VALUE_TYPE_OSTRING,
2150                               &pmkcache);
2151}
2152
2153/* execute sme */
2154static
2155void hostif_sme_execute(struct ks_wlan_private *priv, int event)
2156{
2157        __le32 val;
2158
2159        switch (event) {
2160        case SME_START:
2161                if (priv->dev_state == DEVICE_STATE_BOOT)
2162                        hostif_mib_get_request(priv, DOT11_MAC_ADDRESS);
2163                break;
2164        case SME_MULTICAST_REQUEST:
2165                hostif_sme_multicast_set(priv);
2166                break;
2167        case SME_MACADDRESS_SET_REQUEST:
2168                hostif_mib_set_request(priv, LOCAL_CURRENTADDRESS, ETH_ALEN,
2169                                       MIB_VALUE_TYPE_OSTRING,
2170                                       &priv->eth_addr[0]);
2171                break;
2172        case SME_BSS_SCAN_REQUEST:
2173                hostif_bss_scan_request(priv, priv->reg.scan_type,
2174                                        priv->scan_ssid, priv->scan_ssid_len);
2175                break;
2176        case SME_POW_MNGMT_REQUEST:
2177                hostif_sme_power_mgmt_set(priv);
2178                break;
2179        case SME_PHY_INFO_REQUEST:
2180                hostif_phy_information_request(priv);
2181                break;
2182        case SME_MIC_FAILURE_REQUEST:
2183                if (priv->wpa.mic_failure.failure == 1) {
2184                        hostif_mic_failure_request(priv,
2185                                                   priv->wpa.mic_failure.failure - 1,
2186                                                   0);
2187                } else if (priv->wpa.mic_failure.failure == 2) {
2188                        hostif_mic_failure_request(priv,
2189                                                   priv->wpa.mic_failure.failure - 1,
2190                                                   priv->wpa.mic_failure.counter);
2191                } else {
2192                        netdev_err(priv->net_dev, "SME_MIC_FAILURE_REQUEST: failure count=%u error?\n",
2193                                   priv->wpa.mic_failure.failure);
2194                }
2195                break;
2196        case SME_MIC_FAILURE_CONFIRM:
2197                if (priv->wpa.mic_failure.failure == 2) {
2198                        if (priv->wpa.mic_failure.stop)
2199                                priv->wpa.mic_failure.stop = 0;
2200                        priv->wpa.mic_failure.failure = 0;
2201                        hostif_start_request(priv, priv->reg.operation_mode);
2202                }
2203                break;
2204        case SME_GET_MAC_ADDRESS:
2205                if (priv->dev_state == DEVICE_STATE_BOOT)
2206                        hostif_mib_get_request(priv, DOT11_PRODUCT_VERSION);
2207                break;
2208        case SME_GET_PRODUCT_VERSION:
2209                if (priv->dev_state == DEVICE_STATE_BOOT)
2210                        priv->dev_state = DEVICE_STATE_PREINIT;
2211                break;
2212        case SME_STOP_REQUEST:
2213                hostif_stop_request(priv);
2214                break;
2215        case SME_RTS_THRESHOLD_REQUEST:
2216                val = cpu_to_le32((uint32_t)(priv->reg.rts));
2217                hostif_mib_set_request(priv, DOT11_RTS_THRESHOLD,
2218                                       sizeof(val), MIB_VALUE_TYPE_INT, &val);
2219                break;
2220        case SME_FRAGMENTATION_THRESHOLD_REQUEST:
2221                val = cpu_to_le32((uint32_t)(priv->reg.fragment));
2222                hostif_mib_set_request(priv, DOT11_FRAGMENTATION_THRESHOLD,
2223                                       sizeof(val), MIB_VALUE_TYPE_INT, &val);
2224                break;
2225        case SME_WEP_INDEX_REQUEST:
2226        case SME_WEP_KEY1_REQUEST:
2227        case SME_WEP_KEY2_REQUEST:
2228        case SME_WEP_KEY3_REQUEST:
2229        case SME_WEP_KEY4_REQUEST:
2230        case SME_WEP_FLAG_REQUEST:
2231                hostif_sme_set_wep(priv, event);
2232                break;
2233        case SME_RSN_UCAST_REQUEST:
2234        case SME_RSN_MCAST_REQUEST:
2235        case SME_RSN_AUTH_REQUEST:
2236        case SME_RSN_ENABLED_REQUEST:
2237        case SME_RSN_MODE_REQUEST:
2238                hostif_sme_set_rsn(priv, event);
2239                break;
2240        case SME_SET_FLAG:
2241        case SME_SET_TXKEY:
2242        case SME_SET_KEY1:
2243        case SME_SET_KEY2:
2244        case SME_SET_KEY3:
2245        case SME_SET_KEY4:
2246        case SME_SET_PMK_TSC:
2247        case SME_SET_GMK1_TSC:
2248        case SME_SET_GMK2_TSC:
2249                hostif_sme_set_key(priv, event);
2250                break;
2251        case SME_SET_PMKSA:
2252                hostif_sme_set_pmksa(priv);
2253                break;
2254#ifdef WPS
2255        case SME_WPS_ENABLE_REQUEST:
2256                hostif_mib_set_request(priv, LOCAL_WPS_ENABLE,
2257                                       sizeof(priv->wps.wps_enabled),
2258                                       MIB_VALUE_TYPE_INT,
2259                                       &priv->wps.wps_enabled);
2260                break;
2261        case SME_WPS_PROBE_REQUEST:
2262                hostif_mib_set_request(priv, LOCAL_WPS_PROBE_REQ,
2263                                       priv->wps.ielen,
2264                                       MIB_VALUE_TYPE_OSTRING, priv->wps.ie);
2265                break;
2266#endif /* WPS */
2267        case SME_MODE_SET_REQUEST:
2268                hostif_sme_mode_setup(priv);
2269                break;
2270        case SME_SET_GAIN:
2271                hostif_mib_set_request(priv, LOCAL_GAIN,
2272                                       sizeof(priv->gain),
2273                                       MIB_VALUE_TYPE_OSTRING, &priv->gain);
2274                break;
2275        case SME_GET_GAIN:
2276                hostif_mib_get_request(priv, LOCAL_GAIN);
2277                break;
2278        case SME_GET_EEPROM_CKSUM:
2279                priv->eeprom_checksum = EEPROM_FW_NOT_SUPPORT;  /* initialize */
2280                hostif_mib_get_request(priv, LOCAL_EEPROM_SUM);
2281                break;
2282        case SME_START_REQUEST:
2283                hostif_start_request(priv, priv->reg.operation_mode);
2284                break;
2285        case SME_START_CONFIRM:
2286                /* for power save */
2287                atomic_set(&priv->psstatus.snooze_guard, 0);
2288                atomic_set(&priv->psstatus.confirm_wait, 0);
2289                if (priv->dev_state == DEVICE_STATE_PREINIT)
2290                        priv->dev_state = DEVICE_STATE_INIT;
2291                /* wake_up_interruptible_all(&priv->confirm_wait); */
2292                complete(&priv->confirm_wait);
2293                break;
2294        case SME_SLEEP_REQUEST:
2295                hostif_sme_sleep_set(priv);
2296                break;
2297        case SME_SET_REGION:
2298                val = cpu_to_le32((uint32_t)(priv->region));
2299                hostif_mib_set_request(priv, LOCAL_REGION,
2300                                       sizeof(val), MIB_VALUE_TYPE_INT, &val);
2301                break;
2302        case SME_MULTICAST_CONFIRM:
2303        case SME_BSS_SCAN_CONFIRM:
2304        case SME_POW_MNGMT_CONFIRM:
2305        case SME_PHY_INFO_CONFIRM:
2306        case SME_STOP_CONFIRM:
2307        case SME_RTS_THRESHOLD_CONFIRM:
2308        case SME_FRAGMENTATION_THRESHOLD_CONFIRM:
2309        case SME_WEP_INDEX_CONFIRM:
2310        case SME_WEP_KEY1_CONFIRM:
2311        case SME_WEP_KEY2_CONFIRM:
2312        case SME_WEP_KEY3_CONFIRM:
2313        case SME_WEP_KEY4_CONFIRM:
2314        case SME_WEP_FLAG_CONFIRM:
2315        case SME_RSN_UCAST_CONFIRM:
2316        case SME_RSN_MCAST_CONFIRM:
2317        case SME_RSN_AUTH_CONFIRM:
2318        case SME_RSN_ENABLED_CONFIRM:
2319        case SME_RSN_MODE_CONFIRM:
2320        case SME_MODE_SET_CONFIRM:
2321                break;
2322        case SME_TERMINATE:
2323        default:
2324                break;
2325        }
2326}
2327
2328static
2329void hostif_sme_task(unsigned long dev)
2330{
2331        struct ks_wlan_private *priv = (struct ks_wlan_private *)dev;
2332
2333        if (priv->dev_state < DEVICE_STATE_BOOT)
2334                return;
2335
2336        if (cnt_smeqbody(priv) <= 0)
2337                return;
2338
2339        hostif_sme_execute(priv, priv->sme_i.event_buff[priv->sme_i.qhead]);
2340        inc_smeqhead(priv);
2341        if (cnt_smeqbody(priv) > 0)
2342                tasklet_schedule(&priv->sme_task);
2343}
2344
2345/* send to Station Management Entity module */
2346void hostif_sme_enqueue(struct ks_wlan_private *priv, unsigned short event)
2347{
2348        /* enqueue sme event */
2349        if (cnt_smeqbody(priv) < (SME_EVENT_BUFF_SIZE - 1)) {
2350                priv->sme_i.event_buff[priv->sme_i.qtail] = event;
2351                inc_smeqtail(priv);
2352        } else {
2353                /* in case of buffer overflow */
2354                netdev_err(priv->net_dev, "sme queue buffer overflow\n");
2355        }
2356
2357        tasklet_schedule(&priv->sme_task);
2358}
2359
2360static inline void hostif_aplist_init(struct ks_wlan_private *priv)
2361{
2362        size_t size = LOCAL_APLIST_MAX * sizeof(struct local_ap_t);
2363        priv->aplist.size = 0;
2364        memset(&priv->aplist.ap[0], 0, size);
2365}
2366
2367static inline void hostif_status_init(struct ks_wlan_private *priv)
2368{
2369        priv->infra_status = 0;
2370        priv->current_rate = 4;
2371        priv->connect_status = DISCONNECT_STATUS;
2372}
2373
2374static inline void hostif_sme_init(struct ks_wlan_private *priv)
2375{
2376        priv->sme_i.sme_status = SME_IDLE;
2377        priv->sme_i.qhead = 0;
2378        priv->sme_i.qtail = 0;
2379        spin_lock_init(&priv->sme_i.sme_spin);
2380        priv->sme_i.sme_flag = 0;
2381        tasklet_init(&priv->sme_task, hostif_sme_task, (unsigned long)priv);
2382}
2383
2384static inline void hostif_wpa_init(struct ks_wlan_private *priv)
2385{
2386        memset(&priv->wpa, 0, sizeof(priv->wpa));
2387        priv->wpa.rsn_enabled = 0;
2388        priv->wpa.mic_failure.failure = 0;
2389        priv->wpa.mic_failure.last_failure_time = 0;
2390        priv->wpa.mic_failure.stop = 0;
2391}
2392
2393static inline void hostif_power_save_init(struct ks_wlan_private *priv)
2394{
2395        atomic_set(&priv->psstatus.status, PS_NONE);
2396        atomic_set(&priv->psstatus.confirm_wait, 0);
2397        atomic_set(&priv->psstatus.snooze_guard, 0);
2398        init_completion(&priv->psstatus.wakeup_wait);
2399        INIT_WORK(&priv->wakeup_work, ks_wlan_hw_wakeup_task);
2400}
2401
2402static inline void hostif_pmklist_init(struct ks_wlan_private *priv)
2403{
2404        int i;
2405
2406        memset(&priv->pmklist, 0, sizeof(priv->pmklist));
2407        INIT_LIST_HEAD(&priv->pmklist.head);
2408        for (i = 0; i < PMK_LIST_MAX; i++)
2409                INIT_LIST_HEAD(&priv->pmklist.pmk[i].list);
2410}
2411
2412static inline void hostif_counters_init(struct ks_wlan_private *priv)
2413{
2414        priv->dev_count = 0;
2415        atomic_set(&priv->event_count, 0);
2416        atomic_set(&priv->rec_count, 0);
2417}
2418
2419int hostif_init(struct ks_wlan_private *priv)
2420{
2421        hostif_aplist_init(priv);
2422        hostif_status_init(priv);
2423
2424        spin_lock_init(&priv->multicast_spin);
2425        spin_lock_init(&priv->dev_read_lock);
2426        init_waitqueue_head(&priv->devread_wait);
2427
2428        hostif_counters_init(priv);
2429        hostif_power_save_init(priv);
2430        hostif_wpa_init(priv);
2431        hostif_pmklist_init(priv);
2432        hostif_sme_init(priv);
2433
2434        return 0;
2435}
2436
2437void hostif_exit(struct ks_wlan_private *priv)
2438{
2439        tasklet_kill(&priv->sme_task);
2440}
2441