linux/drivers/staging/vt6656/main_usb.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   3 * All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License as published by
   7 * the Free Software Foundation; either version 2 of the License, or
   8 * (at your option) any later version.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 *
  16 * File: main_usb.c
  17 *
  18 * Purpose: driver entry for initial, open, close, tx and rx.
  19 *
  20 * Author: Lyndon Chen
  21 *
  22 * Date: Dec 8, 2005
  23 *
  24 * Functions:
  25 *
  26 *   vt6656_probe - module initial (insmod) driver entry
  27 *   vnt_free_tx_bufs - free tx buffer function
  28 *   vnt_init_registers- initial MAC & BBP & RF internal registers.
  29 *
  30 * Revision History:
  31 */
  32#undef __NO_VERSION__
  33
  34#include <linux/etherdevice.h>
  35#include <linux/file.h>
  36#include "device.h"
  37#include "card.h"
  38#include "baseband.h"
  39#include "mac.h"
  40#include "power.h"
  41#include "wcmd.h"
  42#include "rxtx.h"
  43#include "dpc.h"
  44#include "rf.h"
  45#include "firmware.h"
  46#include "usbpipe.h"
  47#include "channel.h"
  48#include "int.h"
  49
  50/*
  51 * define module options
  52 */
  53
  54/* version information */
  55#define DRIVER_AUTHOR \
  56        "VIA Networking Technologies, Inc., <lyndonchen@vntek.com.tw>"
  57MODULE_AUTHOR(DRIVER_AUTHOR);
  58MODULE_LICENSE("GPL");
  59MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM);
  60
  61#define RX_DESC_DEF0 64
  62static int vnt_rx_buffers = RX_DESC_DEF0;
  63module_param_named(rx_buffers, vnt_rx_buffers, int, 0644);
  64MODULE_PARM_DESC(rx_buffers, "Number of receive usb rx buffers");
  65
  66#define TX_DESC_DEF0 64
  67static int vnt_tx_buffers = TX_DESC_DEF0;
  68module_param_named(tx_buffers, vnt_tx_buffers, int, 0644);
  69MODULE_PARM_DESC(tx_buffers, "Number of receive usb tx buffers");
  70
  71#define RTS_THRESH_DEF     2347
  72#define FRAG_THRESH_DEF     2346
  73#define SHORT_RETRY_DEF     8
  74#define LONG_RETRY_DEF     4
  75
  76/* BasebandType[] baseband type selected
  77 * 0: indicate 802.11a type
  78 * 1: indicate 802.11b type
  79 * 2: indicate 802.11g type
  80 */
  81
  82#define BBP_TYPE_DEF     2
  83
  84/*
  85 * Static vars definitions
  86 */
  87
  88static struct usb_device_id vt6656_table[] = {
  89        {USB_DEVICE(VNT_USB_VENDOR_ID, VNT_USB_PRODUCT_ID)},
  90        {}
  91};
  92
  93static void vnt_set_options(struct vnt_private *priv)
  94{
  95        /* Set number of TX buffers */
  96        if (vnt_tx_buffers < CB_MIN_TX_DESC || vnt_tx_buffers > CB_MAX_TX_DESC)
  97                priv->num_tx_context = TX_DESC_DEF0;
  98        else
  99                priv->num_tx_context = vnt_tx_buffers;
 100
 101        /* Set number of RX buffers */
 102        if (vnt_rx_buffers < CB_MIN_RX_DESC || vnt_rx_buffers > CB_MAX_RX_DESC)
 103                priv->num_rcb = RX_DESC_DEF0;
 104        else
 105                priv->num_rcb = vnt_rx_buffers;
 106
 107        priv->short_retry_limit = SHORT_RETRY_DEF;
 108        priv->long_retry_limit = LONG_RETRY_DEF;
 109        priv->op_mode = NL80211_IFTYPE_UNSPECIFIED;
 110        priv->bb_type = BBP_TYPE_DEF;
 111        priv->packet_type = priv->bb_type;
 112        priv->auto_fb_ctrl = AUTO_FB_0;
 113        priv->preamble_type = 0;
 114        priv->exist_sw_net_addr = false;
 115}
 116
 117/*
 118 * initialization of MAC & BBP registers
 119 */
 120static int vnt_init_registers(struct vnt_private *priv)
 121{
 122        struct vnt_cmd_card_init *init_cmd = &priv->init_command;
 123        struct vnt_rsp_card_init *init_rsp = &priv->init_response;
 124        u8 antenna;
 125        int ii;
 126        int status = STATUS_SUCCESS;
 127        u8 tmp;
 128        u8 calib_tx_iq = 0, calib_tx_dc = 0, calib_rx_iq = 0;
 129
 130        dev_dbg(&priv->usb->dev, "---->INIbInitAdapter. [%d][%d]\n",
 131                                DEVICE_INIT_COLD, priv->packet_type);
 132
 133        if (!vnt_check_firmware_version(priv)) {
 134                if (vnt_download_firmware(priv) == true) {
 135                        if (vnt_firmware_branch_to_sram(priv) == false) {
 136                                dev_dbg(&priv->usb->dev,
 137                                        " vnt_firmware_branch_to_sram fail\n");
 138                                return false;
 139                        }
 140                } else {
 141                        dev_dbg(&priv->usb->dev, "FIRMWAREbDownload fail\n");
 142                        return false;
 143                }
 144        }
 145
 146        if (!vnt_vt3184_init(priv)) {
 147                dev_dbg(&priv->usb->dev, "vnt_vt3184_init fail\n");
 148                return false;
 149        }
 150
 151        init_cmd->init_class = DEVICE_INIT_COLD;
 152        init_cmd->exist_sw_net_addr = priv->exist_sw_net_addr;
 153        for (ii = 0; ii < 6; ii++)
 154                init_cmd->sw_net_addr[ii] = priv->current_net_addr[ii];
 155        init_cmd->short_retry_limit = priv->short_retry_limit;
 156        init_cmd->long_retry_limit = priv->long_retry_limit;
 157
 158        /* issue card_init command to device */
 159        status = vnt_control_out(priv,
 160                MESSAGE_TYPE_CARDINIT, 0, 0,
 161                sizeof(struct vnt_cmd_card_init), (u8 *)init_cmd);
 162        if (status != STATUS_SUCCESS) {
 163                dev_dbg(&priv->usb->dev, "Issue Card init fail\n");
 164                return false;
 165        }
 166
 167        status = vnt_control_in(priv, MESSAGE_TYPE_INIT_RSP, 0, 0,
 168                sizeof(struct vnt_rsp_card_init), (u8 *)init_rsp);
 169        if (status != STATUS_SUCCESS) {
 170                dev_dbg(&priv->usb->dev,
 171                        "Cardinit request in status fail!\n");
 172                return false;
 173        }
 174
 175        /* local ID for AES functions */
 176        status = vnt_control_in(priv, MESSAGE_TYPE_READ,
 177                MAC_REG_LOCALID, MESSAGE_REQUEST_MACREG, 1,
 178                        &priv->local_id);
 179        if (status != STATUS_SUCCESS)
 180                return false;
 181
 182        /* do MACbSoftwareReset in MACvInitialize */
 183
 184        priv->top_ofdm_basic_rate = RATE_24M;
 185        priv->top_cck_basic_rate = RATE_1M;
 186
 187        /* target to IF pin while programming to RF chip */
 188        priv->power = 0xFF;
 189
 190        priv->cck_pwr = priv->eeprom[EEP_OFS_PWR_CCK];
 191        priv->ofdm_pwr_g = priv->eeprom[EEP_OFS_PWR_OFDMG];
 192        /* load power table */
 193        for (ii = 0; ii < 14; ii++) {
 194                priv->cck_pwr_tbl[ii] =
 195                        priv->eeprom[ii + EEP_OFS_CCK_PWR_TBL];
 196                if (priv->cck_pwr_tbl[ii] == 0)
 197                        priv->cck_pwr_tbl[ii] = priv->cck_pwr;
 198
 199                priv->ofdm_pwr_tbl[ii] =
 200                                priv->eeprom[ii + EEP_OFS_OFDM_PWR_TBL];
 201                if (priv->ofdm_pwr_tbl[ii] == 0)
 202                        priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_g;
 203        }
 204
 205        /*
 206         * original zonetype is USA, but custom zonetype is Europe,
 207         * then need to recover 12, 13, 14 channels with 11 channel
 208         */
 209        for (ii = 11; ii < 14; ii++) {
 210                priv->cck_pwr_tbl[ii] = priv->cck_pwr_tbl[10];
 211                priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_tbl[10];
 212        }
 213
 214        priv->ofdm_pwr_a = 0x34; /* same as RFbMA2829SelectChannel */
 215
 216        /* load OFDM A power table */
 217        for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) {
 218                priv->ofdm_a_pwr_tbl[ii] =
 219                        priv->eeprom[ii + EEP_OFS_OFDMA_PWR_TBL];
 220
 221                if (priv->ofdm_a_pwr_tbl[ii] == 0)
 222                        priv->ofdm_a_pwr_tbl[ii] = priv->ofdm_pwr_a;
 223        }
 224
 225        antenna = priv->eeprom[EEP_OFS_ANTENNA];
 226
 227        if (antenna & EEP_ANTINV)
 228                priv->tx_rx_ant_inv = true;
 229        else
 230                priv->tx_rx_ant_inv = false;
 231
 232        antenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
 233
 234        if (antenna == 0) /* if not set default is both */
 235                antenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN);
 236
 237        if (antenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) {
 238                priv->tx_antenna_mode = ANT_B;
 239                priv->rx_antenna_sel = 1;
 240
 241                if (priv->tx_rx_ant_inv == true)
 242                        priv->rx_antenna_mode = ANT_A;
 243                else
 244                        priv->rx_antenna_mode = ANT_B;
 245        } else  {
 246                priv->rx_antenna_sel = 0;
 247
 248                if (antenna & EEP_ANTENNA_AUX) {
 249                        priv->tx_antenna_mode = ANT_A;
 250
 251                        if (priv->tx_rx_ant_inv == true)
 252                                priv->rx_antenna_mode = ANT_B;
 253                        else
 254                                priv->rx_antenna_mode = ANT_A;
 255                } else {
 256                        priv->tx_antenna_mode = ANT_B;
 257
 258                if (priv->tx_rx_ant_inv == true)
 259                        priv->rx_antenna_mode = ANT_A;
 260                else
 261                        priv->rx_antenna_mode = ANT_B;
 262                }
 263        }
 264
 265        /* Set initial antenna mode */
 266        vnt_set_antenna_mode(priv, priv->rx_antenna_mode);
 267
 268        /* get Auto Fall Back type */
 269        priv->auto_fb_ctrl = AUTO_FB_0;
 270
 271        /* default Auto Mode */
 272        priv->bb_type = BB_TYPE_11G;
 273
 274        /* get RFType */
 275        priv->rf_type = init_rsp->rf_type;
 276
 277        /* load vt3266 calibration parameters in EEPROM */
 278        if (priv->rf_type == RF_VT3226D0) {
 279                if ((priv->eeprom[EEP_OFS_MAJOR_VER] == 0x1) &&
 280                    (priv->eeprom[EEP_OFS_MINOR_VER] >= 0x4)) {
 281
 282                        calib_tx_iq = priv->eeprom[EEP_OFS_CALIB_TX_IQ];
 283                        calib_tx_dc = priv->eeprom[EEP_OFS_CALIB_TX_DC];
 284                        calib_rx_iq = priv->eeprom[EEP_OFS_CALIB_RX_IQ];
 285                        if (calib_tx_iq || calib_tx_dc || calib_rx_iq) {
 286                                /* CR255, enable TX/RX IQ and
 287                                 * DC compensation mode
 288                                 */
 289                                vnt_control_out_u8(priv,
 290                                                   MESSAGE_REQUEST_BBREG,
 291                                                   0xff,
 292                                                   0x03);
 293                                /* CR251, TX I/Q Imbalance Calibration */
 294                                vnt_control_out_u8(priv,
 295                                                   MESSAGE_REQUEST_BBREG,
 296                                                   0xfb,
 297                                                   calib_tx_iq);
 298                                /* CR252, TX DC-Offset Calibration */
 299                                vnt_control_out_u8(priv,
 300                                                   MESSAGE_REQUEST_BBREG,
 301                                                   0xfC,
 302                                                   calib_tx_dc);
 303                                /* CR253, RX I/Q Imbalance Calibration */
 304                                vnt_control_out_u8(priv,
 305                                                   MESSAGE_REQUEST_BBREG,
 306                                                   0xfd,
 307                                                   calib_rx_iq);
 308                        } else {
 309                                /* CR255, turn off
 310                                 * BB Calibration compensation
 311                                 */
 312                                vnt_control_out_u8(priv,
 313                                                   MESSAGE_REQUEST_BBREG,
 314                                                   0xff,
 315                                                   0x0);
 316                        }
 317                }
 318        }
 319
 320        /* get permanent network address */
 321        memcpy(priv->permanent_net_addr, init_rsp->net_addr, 6);
 322        ether_addr_copy(priv->current_net_addr, priv->permanent_net_addr);
 323
 324        /* if exist SW network address, use it */
 325        dev_dbg(&priv->usb->dev, "Network address = %pM\n",
 326                priv->current_net_addr);
 327
 328        /*
 329        * set BB and packet type at the same time
 330        * set Short Slot Time, xIFS, and RSPINF
 331        */
 332        if (priv->bb_type == BB_TYPE_11A)
 333                priv->short_slot_time = true;
 334        else
 335                priv->short_slot_time = false;
 336
 337        vnt_set_short_slot_time(priv);
 338
 339        priv->radio_ctl = priv->eeprom[EEP_OFS_RADIOCTL];
 340
 341        if ((priv->radio_ctl & EEP_RADIOCTL_ENABLE) != 0) {
 342                status = vnt_control_in(priv, MESSAGE_TYPE_READ,
 343                        MAC_REG_GPIOCTL1, MESSAGE_REQUEST_MACREG, 1, &tmp);
 344
 345                if (status != STATUS_SUCCESS)
 346                        return false;
 347
 348                if ((tmp & GPIO3_DATA) == 0)
 349                        vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL1,
 350                                                                GPIO3_INTMD);
 351                else
 352                        vnt_mac_reg_bits_off(priv, MAC_REG_GPIOCTL1,
 353                                                                GPIO3_INTMD);
 354        }
 355
 356        vnt_mac_set_led(priv, LEDSTS_TMLEN, 0x38);
 357
 358        vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_SLOW);
 359
 360        vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL0, 0x01);
 361
 362        vnt_radio_power_on(priv);
 363
 364        dev_dbg(&priv->usb->dev, "<----INIbInitAdapter Exit\n");
 365
 366        return true;
 367}
 368
 369static void vnt_free_tx_bufs(struct vnt_private *priv)
 370{
 371        struct vnt_usb_send_context *tx_context;
 372        int ii;
 373
 374        for (ii = 0; ii < priv->num_tx_context; ii++) {
 375                tx_context = priv->tx_context[ii];
 376                /* deallocate URBs */
 377                if (tx_context->urb) {
 378                        usb_kill_urb(tx_context->urb);
 379                        usb_free_urb(tx_context->urb);
 380                }
 381
 382                kfree(tx_context);
 383        }
 384}
 385
 386static void vnt_free_rx_bufs(struct vnt_private *priv)
 387{
 388        struct vnt_rcb *rcb;
 389        int ii;
 390
 391        for (ii = 0; ii < priv->num_rcb; ii++) {
 392                rcb = priv->rcb[ii];
 393                if (!rcb)
 394                        continue;
 395
 396                /* deallocate URBs */
 397                if (rcb->urb) {
 398                        usb_kill_urb(rcb->urb);
 399                        usb_free_urb(rcb->urb);
 400                }
 401
 402                /* deallocate skb */
 403                if (rcb->skb)
 404                        dev_kfree_skb(rcb->skb);
 405
 406                kfree(rcb);
 407        }
 408}
 409
 410static void usb_device_reset(struct vnt_private *priv)
 411{
 412        int status;
 413
 414        status = usb_reset_device(priv->usb);
 415        if (status)
 416                dev_warn(&priv->usb->dev,
 417                         "usb_device_reset fail status=%d\n", status);
 418}
 419
 420static void vnt_free_int_bufs(struct vnt_private *priv)
 421{
 422        kfree(priv->int_buf.data_buf);
 423}
 424
 425static bool vnt_alloc_bufs(struct vnt_private *priv)
 426{
 427        struct vnt_usb_send_context *tx_context;
 428        struct vnt_rcb *rcb;
 429        int ii;
 430
 431        for (ii = 0; ii < priv->num_tx_context; ii++) {
 432                tx_context = kmalloc(sizeof(struct vnt_usb_send_context),
 433                                                                GFP_KERNEL);
 434                if (!tx_context)
 435                        goto free_tx;
 436
 437                priv->tx_context[ii] = tx_context;
 438                tx_context->priv = priv;
 439                tx_context->pkt_no = ii;
 440
 441                /* allocate URBs */
 442                tx_context->urb = usb_alloc_urb(0, GFP_KERNEL);
 443                if (!tx_context->urb) {
 444                        dev_err(&priv->usb->dev, "alloc tx urb failed\n");
 445                        goto free_tx;
 446                }
 447
 448                tx_context->in_use = false;
 449        }
 450
 451        for (ii = 0; ii < priv->num_rcb; ii++) {
 452                priv->rcb[ii] = kzalloc(sizeof(struct vnt_rcb), GFP_KERNEL);
 453                if (!priv->rcb[ii]) {
 454                        dev_err(&priv->usb->dev,
 455                                        "failed to allocate rcb no %d\n", ii);
 456                        goto free_rx_tx;
 457                }
 458
 459                rcb = priv->rcb[ii];
 460
 461                rcb->priv = priv;
 462
 463                /* allocate URBs */
 464                rcb->urb = usb_alloc_urb(0, GFP_KERNEL);
 465                if (!rcb->urb) {
 466                        dev_err(&priv->usb->dev, "Failed to alloc rx urb\n");
 467                        goto free_rx_tx;
 468                }
 469
 470                rcb->skb = dev_alloc_skb(priv->rx_buf_sz);
 471                if (!rcb->skb)
 472                        goto free_rx_tx;
 473
 474                rcb->in_use = false;
 475
 476                /* submit rx urb */
 477                if (vnt_submit_rx_urb(priv, rcb))
 478                        goto free_rx_tx;
 479        }
 480
 481        priv->interrupt_urb = usb_alloc_urb(0, GFP_KERNEL);
 482        if (!priv->interrupt_urb) {
 483                dev_err(&priv->usb->dev, "Failed to alloc int urb\n");
 484                goto free_rx_tx;
 485        }
 486
 487        priv->int_buf.data_buf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL);
 488        if (!priv->int_buf.data_buf) {
 489                usb_free_urb(priv->interrupt_urb);
 490                goto free_rx_tx;
 491        }
 492
 493        return true;
 494
 495free_rx_tx:
 496        vnt_free_rx_bufs(priv);
 497
 498free_tx:
 499        vnt_free_tx_bufs(priv);
 500
 501        return false;
 502}
 503
 504static void vnt_tx_80211(struct ieee80211_hw *hw,
 505        struct ieee80211_tx_control *control, struct sk_buff *skb)
 506{
 507        struct vnt_private *priv = hw->priv;
 508
 509        if (vnt_tx_packet(priv, skb))
 510                ieee80211_free_txskb(hw, skb);
 511}
 512
 513static int vnt_start(struct ieee80211_hw *hw)
 514{
 515        struct vnt_private *priv = hw->priv;
 516
 517        priv->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS;
 518
 519        if (!vnt_alloc_bufs(priv)) {
 520                dev_dbg(&priv->usb->dev, "vnt_alloc_bufs fail...\n");
 521                return -ENOMEM;
 522        }
 523
 524        clear_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags);
 525
 526        if (vnt_init_registers(priv) == false) {
 527                dev_dbg(&priv->usb->dev, " init register fail\n");
 528                goto free_all;
 529        }
 530
 531        priv->int_interval = 1;  /* bInterval is set to 1 */
 532
 533        vnt_int_start_interrupt(priv);
 534
 535        ieee80211_wake_queues(hw);
 536
 537        return 0;
 538
 539free_all:
 540        vnt_free_rx_bufs(priv);
 541        vnt_free_tx_bufs(priv);
 542        vnt_free_int_bufs(priv);
 543
 544        usb_kill_urb(priv->interrupt_urb);
 545        usb_free_urb(priv->interrupt_urb);
 546
 547        return -ENOMEM;
 548}
 549
 550static void vnt_stop(struct ieee80211_hw *hw)
 551{
 552        struct vnt_private *priv = hw->priv;
 553        int i;
 554
 555        if (!priv)
 556                return;
 557
 558        for (i = 0; i < MAX_KEY_TABLE; i++)
 559                vnt_mac_disable_keyentry(priv, i);
 560
 561        /* clear all keys */
 562        priv->key_entry_inuse = 0;
 563
 564        if (!test_bit(DEVICE_FLAGS_UNPLUG, &priv->flags))
 565                vnt_mac_shutdown(priv);
 566
 567        ieee80211_stop_queues(hw);
 568
 569        set_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags);
 570
 571        cancel_delayed_work_sync(&priv->run_command_work);
 572
 573        priv->cmd_running = false;
 574
 575        vnt_free_tx_bufs(priv);
 576        vnt_free_rx_bufs(priv);
 577        vnt_free_int_bufs(priv);
 578
 579        usb_kill_urb(priv->interrupt_urb);
 580        usb_free_urb(priv->interrupt_urb);
 581}
 582
 583static int vnt_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 584{
 585        struct vnt_private *priv = hw->priv;
 586
 587        priv->vif = vif;
 588
 589        switch (vif->type) {
 590        case NL80211_IFTYPE_STATION:
 591                break;
 592        case NL80211_IFTYPE_ADHOC:
 593                vnt_mac_reg_bits_off(priv, MAC_REG_RCR, RCR_UNICAST);
 594
 595                vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_ADHOC);
 596
 597                break;
 598        case NL80211_IFTYPE_AP:
 599                vnt_mac_reg_bits_off(priv, MAC_REG_RCR, RCR_UNICAST);
 600
 601                vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_AP);
 602
 603                break;
 604        default:
 605                return -EOPNOTSUPP;
 606        }
 607
 608        priv->op_mode = vif->type;
 609
 610        vnt_set_bss_mode(priv);
 611
 612        /* LED blink on TX */
 613        vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_INTER);
 614
 615        return 0;
 616}
 617
 618static void vnt_remove_interface(struct ieee80211_hw *hw,
 619                struct ieee80211_vif *vif)
 620{
 621        struct vnt_private *priv = hw->priv;
 622
 623        switch (vif->type) {
 624        case NL80211_IFTYPE_STATION:
 625                break;
 626        case NL80211_IFTYPE_ADHOC:
 627                vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX);
 628                vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
 629                vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_ADHOC);
 630                break;
 631        case NL80211_IFTYPE_AP:
 632                vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX);
 633                vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
 634                vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_AP);
 635                break;
 636        default:
 637                break;
 638        }
 639
 640        vnt_radio_power_off(priv);
 641
 642        priv->op_mode = NL80211_IFTYPE_UNSPECIFIED;
 643
 644        /* LED slow blink */
 645        vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_SLOW);
 646}
 647
 648static int vnt_config(struct ieee80211_hw *hw, u32 changed)
 649{
 650        struct vnt_private *priv = hw->priv;
 651        struct ieee80211_conf *conf = &hw->conf;
 652        u8 bb_type;
 653
 654        if (changed & IEEE80211_CONF_CHANGE_PS) {
 655                if (conf->flags & IEEE80211_CONF_PS)
 656                        vnt_enable_power_saving(priv, conf->listen_interval);
 657                else
 658                        vnt_disable_power_saving(priv);
 659        }
 660
 661        if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) ||
 662                        (conf->flags & IEEE80211_CONF_OFFCHANNEL)) {
 663                vnt_set_channel(priv, conf->chandef.chan->hw_value);
 664
 665                if (conf->chandef.chan->band == IEEE80211_BAND_5GHZ)
 666                        bb_type = BB_TYPE_11A;
 667                else
 668                        bb_type = BB_TYPE_11G;
 669
 670                if (priv->bb_type != bb_type) {
 671                        priv->bb_type = bb_type;
 672
 673                        vnt_set_bss_mode(priv);
 674                }
 675        }
 676
 677        if (changed & IEEE80211_CONF_CHANGE_POWER) {
 678                if (priv->bb_type == BB_TYPE_11B)
 679                        priv->current_rate = RATE_1M;
 680                else
 681                        priv->current_rate = RATE_54M;
 682
 683                vnt_rf_setpower(priv, priv->current_rate,
 684                                conf->chandef.chan->hw_value);
 685        }
 686
 687        return 0;
 688}
 689
 690static void vnt_bss_info_changed(struct ieee80211_hw *hw,
 691                struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf,
 692                u32 changed)
 693{
 694        struct vnt_private *priv = hw->priv;
 695
 696        priv->current_aid = conf->aid;
 697
 698        if (changed & BSS_CHANGED_BSSID && conf->bssid)
 699                vnt_mac_set_bssid_addr(priv, (u8 *)conf->bssid);
 700
 701
 702        if (changed & BSS_CHANGED_BASIC_RATES) {
 703                priv->basic_rates = conf->basic_rates;
 704
 705                vnt_update_top_rates(priv);
 706
 707                dev_dbg(&priv->usb->dev, "basic rates %x\n", conf->basic_rates);
 708        }
 709
 710        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
 711                if (conf->use_short_preamble) {
 712                        vnt_mac_enable_barker_preamble_mode(priv);
 713                        priv->preamble_type = true;
 714                } else {
 715                        vnt_mac_disable_barker_preamble_mode(priv);
 716                        priv->preamble_type = false;
 717                }
 718        }
 719
 720        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
 721                if (conf->use_cts_prot)
 722                        vnt_mac_enable_protect_mode(priv);
 723                else
 724                        vnt_mac_disable_protect_mode(priv);
 725        }
 726
 727        if (changed & BSS_CHANGED_ERP_SLOT) {
 728                if (conf->use_short_slot)
 729                        priv->short_slot_time = true;
 730                else
 731                        priv->short_slot_time = false;
 732
 733                vnt_set_short_slot_time(priv);
 734                vnt_set_vga_gain_offset(priv, priv->bb_vga[0]);
 735                vnt_update_pre_ed_threshold(priv, false);
 736        }
 737
 738        if (changed & BSS_CHANGED_TXPOWER)
 739                vnt_rf_setpower(priv, priv->current_rate,
 740                                        conf->chandef.chan->hw_value);
 741
 742        if (changed & BSS_CHANGED_BEACON_ENABLED) {
 743                dev_dbg(&priv->usb->dev,
 744                                "Beacon enable %d\n", conf->enable_beacon);
 745
 746                if (conf->enable_beacon) {
 747                        vnt_beacon_enable(priv, vif, conf);
 748
 749                        vnt_mac_reg_bits_on(priv, MAC_REG_TCR, TCR_AUTOBCNTX);
 750                } else {
 751                        vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX);
 752                }
 753        }
 754
 755        if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_BEACON_INFO) &&
 756            priv->op_mode != NL80211_IFTYPE_AP) {
 757                if (conf->assoc && conf->beacon_rate) {
 758                        vnt_mac_reg_bits_on(priv, MAC_REG_TFTCTL,
 759                                            TFTCTL_TSFCNTREN);
 760
 761                        vnt_adjust_tsf(priv, conf->beacon_rate->hw_value,
 762                                       conf->sync_tsf, priv->current_tsf);
 763
 764                        vnt_mac_set_beacon_interval(priv, conf->beacon_int);
 765
 766                        vnt_reset_next_tbtt(priv, conf->beacon_int);
 767                } else {
 768                        vnt_clear_current_tsf(priv);
 769
 770                        vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL,
 771                                             TFTCTL_TSFCNTREN);
 772                }
 773        }
 774}
 775
 776static u64 vnt_prepare_multicast(struct ieee80211_hw *hw,
 777        struct netdev_hw_addr_list *mc_list)
 778{
 779        struct vnt_private *priv = hw->priv;
 780        struct netdev_hw_addr *ha;
 781        u64 mc_filter = 0;
 782        u32 bit_nr = 0;
 783
 784        netdev_hw_addr_list_for_each(ha, mc_list) {
 785                bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26;
 786
 787                mc_filter |= 1ULL << (bit_nr & 0x3f);
 788        }
 789
 790        priv->mc_list_count = mc_list->count;
 791
 792        return mc_filter;
 793}
 794
 795static void vnt_configure(struct ieee80211_hw *hw,
 796        unsigned int changed_flags, unsigned int *total_flags, u64 multicast)
 797{
 798        struct vnt_private *priv = hw->priv;
 799        u8 rx_mode = 0;
 800        int rc;
 801
 802        *total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC;
 803
 804        rc = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_RCR,
 805                MESSAGE_REQUEST_MACREG, sizeof(u8), &rx_mode);
 806
 807        if (!rc)
 808                rx_mode = RCR_MULTICAST | RCR_BROADCAST;
 809
 810        dev_dbg(&priv->usb->dev, "rx mode in = %x\n", rx_mode);
 811
 812        if (changed_flags & FIF_ALLMULTI) {
 813                if (*total_flags & FIF_ALLMULTI) {
 814                        if (priv->mc_list_count > 2)
 815                                vnt_mac_set_filter(priv, ~0);
 816                        else
 817                                vnt_mac_set_filter(priv, multicast);
 818
 819                        rx_mode |= RCR_MULTICAST | RCR_BROADCAST;
 820                } else {
 821                        rx_mode &= ~(RCR_MULTICAST | RCR_BROADCAST);
 822                }
 823
 824        }
 825
 826        if (changed_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)) {
 827                if (*total_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC))
 828                        rx_mode &= ~RCR_BSSID;
 829                else
 830                        rx_mode |= RCR_BSSID;
 831        }
 832
 833        vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, rx_mode);
 834
 835        dev_dbg(&priv->usb->dev, "rx mode out= %x\n", rx_mode);
 836}
 837
 838static int vnt_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
 839        struct ieee80211_vif *vif, struct ieee80211_sta *sta,
 840                struct ieee80211_key_conf *key)
 841{
 842        struct vnt_private *priv = hw->priv;
 843
 844        switch (cmd) {
 845        case SET_KEY:
 846                if (vnt_set_keys(hw, sta, vif, key))
 847                        return -EOPNOTSUPP;
 848                break;
 849        case DISABLE_KEY:
 850                if (test_bit(key->hw_key_idx, &priv->key_entry_inuse))
 851                        clear_bit(key->hw_key_idx, &priv->key_entry_inuse);
 852        default:
 853                break;
 854        }
 855
 856        return 0;
 857}
 858
 859static void vnt_sw_scan_start(struct ieee80211_hw *hw,
 860                              struct ieee80211_vif *vif,
 861                              const u8 *addr)
 862{
 863        struct vnt_private *priv = hw->priv;
 864
 865        vnt_set_bss_mode(priv);
 866        /* Set max sensitivity*/
 867        vnt_update_pre_ed_threshold(priv, true);
 868}
 869
 870static void vnt_sw_scan_complete(struct ieee80211_hw *hw,
 871                                 struct ieee80211_vif *vif)
 872{
 873        struct vnt_private *priv = hw->priv;
 874
 875        /* Return sensitivity to channel level*/
 876        vnt_update_pre_ed_threshold(priv, false);
 877}
 878
 879static int vnt_get_stats(struct ieee80211_hw *hw,
 880                                struct ieee80211_low_level_stats *stats)
 881{
 882        struct vnt_private *priv = hw->priv;
 883
 884        memcpy(stats, &priv->low_stats, sizeof(*stats));
 885
 886        return 0;
 887}
 888
 889static u64 vnt_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 890{
 891        struct vnt_private *priv = hw->priv;
 892
 893        return priv->current_tsf;
 894}
 895
 896static void vnt_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 897                        u64 tsf)
 898{
 899        struct vnt_private *priv = hw->priv;
 900
 901        vnt_update_next_tbtt(priv, tsf, vif->bss_conf.beacon_int);
 902}
 903
 904static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 905{
 906        struct vnt_private *priv = hw->priv;
 907
 908        vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN);
 909
 910        vnt_clear_current_tsf(priv);
 911}
 912
 913static const struct ieee80211_ops vnt_mac_ops = {
 914        .tx                     = vnt_tx_80211,
 915        .start                  = vnt_start,
 916        .stop                   = vnt_stop,
 917        .add_interface          = vnt_add_interface,
 918        .remove_interface       = vnt_remove_interface,
 919        .config                 = vnt_config,
 920        .bss_info_changed       = vnt_bss_info_changed,
 921        .prepare_multicast      = vnt_prepare_multicast,
 922        .configure_filter       = vnt_configure,
 923        .set_key                = vnt_set_key,
 924        .sw_scan_start          = vnt_sw_scan_start,
 925        .sw_scan_complete       = vnt_sw_scan_complete,
 926        .get_stats              = vnt_get_stats,
 927        .get_tsf                = vnt_get_tsf,
 928        .set_tsf                = vnt_set_tsf,
 929        .reset_tsf              = vnt_reset_tsf,
 930};
 931
 932int vnt_init(struct vnt_private *priv)
 933{
 934
 935        if (!(vnt_init_registers(priv)))
 936                return -EAGAIN;
 937
 938        SET_IEEE80211_PERM_ADDR(priv->hw, priv->permanent_net_addr);
 939
 940        vnt_init_bands(priv);
 941
 942        if (ieee80211_register_hw(priv->hw))
 943                return -ENODEV;
 944
 945        priv->mac_hw = true;
 946
 947        vnt_radio_power_off(priv);
 948
 949        return 0;
 950}
 951
 952static int
 953vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id)
 954{
 955        struct usb_device *udev;
 956        struct vnt_private *priv;
 957        struct ieee80211_hw *hw;
 958        struct wiphy *wiphy;
 959        int rc = 0;
 960
 961        udev = usb_get_dev(interface_to_usbdev(intf));
 962
 963        dev_notice(&udev->dev, "%s Ver. %s\n",
 964                                        DEVICE_FULL_DRV_NAM, DEVICE_VERSION);
 965        dev_notice(&udev->dev,
 966                "Copyright (c) 2004 VIA Networking Technologies, Inc.\n");
 967
 968        hw = ieee80211_alloc_hw(sizeof(struct vnt_private), &vnt_mac_ops);
 969        if (!hw) {
 970                dev_err(&udev->dev, "could not register ieee80211_hw\n");
 971                rc = -ENOMEM;
 972                goto err_nomem;
 973        }
 974
 975        priv = hw->priv;
 976        priv->hw = hw;
 977        priv->usb = udev;
 978
 979        vnt_set_options(priv);
 980
 981        spin_lock_init(&priv->lock);
 982        mutex_init(&priv->usb_lock);
 983
 984        INIT_DELAYED_WORK(&priv->run_command_work, vnt_run_command);
 985
 986        usb_set_intfdata(intf, priv);
 987
 988        wiphy = priv->hw->wiphy;
 989
 990        wiphy->frag_threshold = FRAG_THRESH_DEF;
 991        wiphy->rts_threshold = RTS_THRESH_DEF;
 992        wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
 993                BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
 994
 995        ieee80211_hw_set(priv->hw, TIMING_BEACON_ONLY);
 996        ieee80211_hw_set(priv->hw, SIGNAL_DBM);
 997        ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
 998        ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS);
 999        ieee80211_hw_set(priv->hw, SUPPORTS_PS);
1000
1001        priv->hw->max_signal = 100;
1002
1003        SET_IEEE80211_DEV(priv->hw, &intf->dev);
1004
1005        usb_device_reset(priv);
1006
1007        clear_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags);
1008        vnt_reset_command_timer(priv);
1009
1010        vnt_schedule_command(priv, WLAN_CMD_INIT_MAC80211);
1011
1012        return 0;
1013
1014err_nomem:
1015        usb_put_dev(udev);
1016
1017        return rc;
1018}
1019
1020static void vt6656_disconnect(struct usb_interface *intf)
1021{
1022        struct vnt_private *priv = usb_get_intfdata(intf);
1023
1024        if (!priv)
1025                return;
1026
1027        if (priv->mac_hw)
1028                ieee80211_unregister_hw(priv->hw);
1029
1030        usb_set_intfdata(intf, NULL);
1031        usb_put_dev(interface_to_usbdev(intf));
1032
1033        set_bit(DEVICE_FLAGS_UNPLUG, &priv->flags);
1034
1035        ieee80211_free_hw(priv->hw);
1036}
1037
1038#ifdef CONFIG_PM
1039
1040static int vt6656_suspend(struct usb_interface *intf, pm_message_t message)
1041{
1042        return 0;
1043}
1044
1045static int vt6656_resume(struct usb_interface *intf)
1046{
1047        return 0;
1048}
1049
1050#endif /* CONFIG_PM */
1051
1052MODULE_DEVICE_TABLE(usb, vt6656_table);
1053
1054static struct usb_driver vt6656_driver = {
1055        .name =         DEVICE_NAME,
1056        .probe =        vt6656_probe,
1057        .disconnect =   vt6656_disconnect,
1058        .id_table =     vt6656_table,
1059#ifdef CONFIG_PM
1060        .suspend = vt6656_suspend,
1061        .resume = vt6656_resume,
1062#endif /* CONFIG_PM */
1063};
1064
1065module_usb_driver(vt6656_driver);
1066