linux/drivers/staging/ks7010/ks7010_sdio.c
<<
>>
Prefs
   1/*
   2 *   Driver for KeyStream, KS7010 based SDIO cards.
   3 *
   4 *   Copyright (C) 2006-2008 KeyStream Corp.
   5 *   Copyright (C) 2009 Renesas Technology Corp.
   6 *   Copyright (C) 2016 Sang Engineering, Wolfram Sang
   7 *
   8 *   This program is free software; you can redistribute it and/or modify
   9 *   it under the terms of the GNU General Public License version 2 as
  10 *   published by the Free Software Foundation.
  11 */
  12
  13#include <linux/firmware.h>
  14#include <linux/mmc/card.h>
  15#include <linux/mmc/sdio_func.h>
  16#include <linux/workqueue.h>
  17#include <linux/atomic.h>
  18
  19#include "ks_wlan.h"
  20#include "ks_wlan_ioctl.h"
  21#include "ks_hostif.h"
  22#include "ks7010_sdio.h"
  23
  24#define KS7010_FUNC_NUM 1
  25#define KS7010_IO_BLOCK_SIZE 512
  26#define KS7010_MAX_CLOCK 25000000
  27
  28static const struct sdio_device_id ks7010_sdio_ids[] = {
  29        {SDIO_DEVICE(SDIO_VENDOR_ID_KS_CODE_A, SDIO_DEVICE_ID_KS_7010)},
  30        {SDIO_DEVICE(SDIO_VENDOR_ID_KS_CODE_B, SDIO_DEVICE_ID_KS_7010)},
  31        { /* all zero */ }
  32};
  33MODULE_DEVICE_TABLE(sdio, ks7010_sdio_ids);
  34
  35static inline void inc_txqhead(struct ks_wlan_private *priv)
  36{
  37        priv->tx_dev.qhead = (priv->tx_dev.qhead + 1) % TX_DEVICE_BUFF_SIZE;
  38}
  39
  40static inline void inc_txqtail(struct ks_wlan_private *priv)
  41{
  42        priv->tx_dev.qtail = (priv->tx_dev.qtail + 1) % TX_DEVICE_BUFF_SIZE;
  43}
  44
  45static inline unsigned int cnt_txqbody(struct ks_wlan_private *priv)
  46{
  47        unsigned int tx_cnt = priv->tx_dev.qtail - priv->tx_dev.qhead;
  48
  49        return (tx_cnt + TX_DEVICE_BUFF_SIZE) % TX_DEVICE_BUFF_SIZE;
  50}
  51
  52static inline void inc_rxqhead(struct ks_wlan_private *priv)
  53{
  54        priv->rx_dev.qhead = (priv->rx_dev.qhead + 1) % RX_DEVICE_BUFF_SIZE;
  55}
  56
  57static inline void inc_rxqtail(struct ks_wlan_private *priv)
  58{
  59        priv->rx_dev.qtail = (priv->rx_dev.qtail + 1) % RX_DEVICE_BUFF_SIZE;
  60}
  61
  62static inline unsigned int cnt_rxqbody(struct ks_wlan_private *priv)
  63{
  64        unsigned int rx_cnt = priv->rx_dev.qtail - priv->rx_dev.qhead;
  65
  66        return (rx_cnt + RX_DEVICE_BUFF_SIZE) % RX_DEVICE_BUFF_SIZE;
  67}
  68
  69/* Read single byte from device address into byte (CMD52) */
  70static int ks7010_sdio_readb(struct ks_wlan_private *priv, unsigned int address,
  71                             unsigned char *byte)
  72{
  73        struct sdio_func *func = priv->ks_sdio_card->func;
  74        int ret;
  75
  76        *byte = sdio_readb(func, address, &ret);
  77
  78        return ret;
  79}
  80
  81/* Read length bytes from device address into buffer (CMD53) */
  82static int ks7010_sdio_read(struct ks_wlan_private *priv, unsigned int address,
  83                            unsigned char *buffer, int length)
  84{
  85        struct sdio_func *func = priv->ks_sdio_card->func;
  86
  87        return sdio_memcpy_fromio(func, buffer, address, length);
  88}
  89
  90/* Write single byte to device address (CMD52) */
  91static int ks7010_sdio_writeb(struct ks_wlan_private *priv,
  92                              unsigned int address, unsigned char byte)
  93{
  94        struct sdio_func *func = priv->ks_sdio_card->func;
  95        int ret;
  96
  97        sdio_writeb(func, byte, address, &ret);
  98
  99        return ret;
 100}
 101
 102/* Write length bytes to device address from buffer (CMD53) */
 103static int ks7010_sdio_write(struct ks_wlan_private *priv, unsigned int address,
 104                             unsigned char *buffer, int length)
 105{
 106        struct sdio_func *func = priv->ks_sdio_card->func;
 107
 108        return sdio_memcpy_toio(func, address, buffer, length);
 109}
 110
 111static void ks_wlan_hw_sleep_doze_request(struct ks_wlan_private *priv)
 112{
 113        int ret;
 114
 115        /* clear request */
 116        atomic_set(&priv->sleepstatus.doze_request, 0);
 117
 118        if (atomic_read(&priv->sleepstatus.status) == 0) {
 119                ret = ks7010_sdio_writeb(priv, GCR_B, GCR_B_DOZE);
 120                if (ret) {
 121                        netdev_err(priv->net_dev, " error : GCR_B\n");
 122                        goto set_sleep_mode;
 123                }
 124                atomic_set(&priv->sleepstatus.status, 1);
 125                priv->last_doze = jiffies;
 126        }
 127
 128set_sleep_mode:
 129        priv->sleep_mode = atomic_read(&priv->sleepstatus.status);
 130}
 131
 132static void ks_wlan_hw_sleep_wakeup_request(struct ks_wlan_private *priv)
 133{
 134        int ret;
 135
 136        /* clear request */
 137        atomic_set(&priv->sleepstatus.wakeup_request, 0);
 138
 139        if (atomic_read(&priv->sleepstatus.status) == 1) {
 140                ret = ks7010_sdio_writeb(priv, WAKEUP, WAKEUP_REQ);
 141                if (ret) {
 142                        netdev_err(priv->net_dev, " error : WAKEUP\n");
 143                        goto set_sleep_mode;
 144                }
 145                atomic_set(&priv->sleepstatus.status, 0);
 146                priv->last_wakeup = jiffies;
 147                ++priv->wakeup_count;
 148        }
 149
 150set_sleep_mode:
 151        priv->sleep_mode = atomic_read(&priv->sleepstatus.status);
 152}
 153
 154void ks_wlan_hw_wakeup_request(struct ks_wlan_private *priv)
 155{
 156        int ret;
 157
 158        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
 159                ret = ks7010_sdio_writeb(priv, WAKEUP, WAKEUP_REQ);
 160                if (ret)
 161                        netdev_err(priv->net_dev, " error : WAKEUP\n");
 162
 163                priv->last_wakeup = jiffies;
 164                ++priv->wakeup_count;
 165        }
 166}
 167
 168static void _ks_wlan_hw_power_save(struct ks_wlan_private *priv)
 169{
 170        unsigned char byte;
 171        int ret;
 172
 173        if (priv->reg.power_mgmt == POWER_MGMT_ACTIVE)
 174                return;
 175
 176        if (priv->reg.operation_mode != MODE_INFRASTRUCTURE)
 177                return;
 178
 179        if (!is_connect_status(priv->connect_status))
 180                return;
 181
 182        if (priv->dev_state != DEVICE_STATE_SLEEP)
 183                return;
 184
 185        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE)
 186                return;
 187
 188        netdev_dbg(priv->net_dev, "\npsstatus.status=%d\npsstatus.confirm_wait=%d\npsstatus.snooze_guard=%d\ncnt_txqbody=%d\n",
 189                   atomic_read(&priv->psstatus.status),
 190                   atomic_read(&priv->psstatus.confirm_wait),
 191                   atomic_read(&priv->psstatus.snooze_guard),
 192                   cnt_txqbody(priv));
 193
 194        if (atomic_read(&priv->psstatus.confirm_wait) ||
 195            atomic_read(&priv->psstatus.snooze_guard) ||
 196            cnt_txqbody(priv)) {
 197                queue_delayed_work(priv->wq, &priv->rw_dwork, 0);
 198                return;
 199        }
 200
 201        ret = ks7010_sdio_readb(priv, INT_PENDING, &byte);
 202        if (ret) {
 203                netdev_err(priv->net_dev, " error : INT_PENDING\n");
 204                goto queue_delayed_work;
 205        }
 206        if (byte)
 207                goto queue_delayed_work;
 208
 209        ret = ks7010_sdio_writeb(priv, GCR_B, GCR_B_DOZE);
 210        if (ret) {
 211                netdev_err(priv->net_dev, " error : GCR_B\n");
 212                goto queue_delayed_work;
 213        }
 214        atomic_set(&priv->psstatus.status, PS_SNOOZE);
 215
 216        return;
 217
 218queue_delayed_work:
 219        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 220}
 221
 222int ks_wlan_hw_power_save(struct ks_wlan_private *priv)
 223{
 224        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 225        return 0;
 226}
 227
 228static int enqueue_txdev(struct ks_wlan_private *priv, unsigned char *p,
 229                         unsigned long size,
 230                         void (*complete_handler)(struct ks_wlan_private *priv,
 231                                                  struct sk_buff *skb),
 232                         struct sk_buff *skb)
 233{
 234        struct tx_device_buffer *sp;
 235        int ret;
 236
 237        if (priv->dev_state < DEVICE_STATE_BOOT) {
 238                ret = -EPERM;
 239                goto err_complete;
 240        }
 241
 242        if ((TX_DEVICE_BUFF_SIZE - 1) <= cnt_txqbody(priv)) {
 243                netdev_err(priv->net_dev, "tx buffer overflow\n");
 244                ret = -EOVERFLOW;
 245                goto err_complete;
 246        }
 247
 248        sp = &priv->tx_dev.tx_dev_buff[priv->tx_dev.qtail];
 249        sp->sendp = p;
 250        sp->size = size;
 251        sp->complete_handler = complete_handler;
 252        sp->skb = skb;
 253        inc_txqtail(priv);
 254
 255        return 0;
 256
 257err_complete:
 258        kfree(p);
 259        if (complete_handler)
 260                (*complete_handler)(priv, skb);
 261
 262        return ret;
 263}
 264
 265/* write data */
 266static int write_to_device(struct ks_wlan_private *priv, unsigned char *buffer,
 267                           unsigned long size)
 268{
 269        struct hostif_hdr *hdr;
 270        int ret;
 271
 272        hdr = (struct hostif_hdr *)buffer;
 273
 274        if (le16_to_cpu(hdr->event) < HIF_DATA_REQ ||
 275            le16_to_cpu(hdr->event) > HIF_REQ_MAX) {
 276                netdev_err(priv->net_dev, "unknown event=%04X\n", hdr->event);
 277                return 0;
 278        }
 279
 280        ret = ks7010_sdio_write(priv, DATA_WINDOW, buffer, size);
 281        if (ret) {
 282                netdev_err(priv->net_dev, " write error : retval=%d\n", ret);
 283                return ret;
 284        }
 285
 286        ret = ks7010_sdio_writeb(priv, WRITE_STATUS, REG_STATUS_BUSY);
 287        if (ret) {
 288                netdev_err(priv->net_dev, " error : WRITE_STATUS\n");
 289                return ret;
 290        }
 291
 292        return 0;
 293}
 294
 295static void tx_device_task(struct ks_wlan_private *priv)
 296{
 297        struct tx_device_buffer *sp;
 298        int ret;
 299
 300        if (cnt_txqbody(priv) <= 0 ||
 301            atomic_read(&priv->psstatus.status) == PS_SNOOZE)
 302                return;
 303
 304        sp = &priv->tx_dev.tx_dev_buff[priv->tx_dev.qhead];
 305        if (priv->dev_state >= DEVICE_STATE_BOOT) {
 306                ret = write_to_device(priv, sp->sendp, sp->size);
 307                if (ret) {
 308                        netdev_err(priv->net_dev, "write_to_device error !!(%d)\n", ret);
 309                        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 310                        return;
 311                }
 312        }
 313        kfree(sp->sendp);
 314        if (sp->complete_handler)       /* TX Complete */
 315                (*sp->complete_handler)(priv, sp->skb);
 316        inc_txqhead(priv);
 317
 318        if (cnt_txqbody(priv) > 0)
 319                queue_delayed_work(priv->wq, &priv->rw_dwork, 0);
 320}
 321
 322int ks_wlan_hw_tx(struct ks_wlan_private *priv, void *p, unsigned long size,
 323                  void (*complete_handler)(struct ks_wlan_private *priv,
 324                                           struct sk_buff *skb),
 325                  struct sk_buff *skb)
 326{
 327        int result = 0;
 328        struct hostif_hdr *hdr;
 329
 330        hdr = (struct hostif_hdr *)p;
 331
 332        if (le16_to_cpu(hdr->event) < HIF_DATA_REQ ||
 333            le16_to_cpu(hdr->event) > HIF_REQ_MAX) {
 334                netdev_err(priv->net_dev, "unknown event=%04X\n", hdr->event);
 335                return 0;
 336        }
 337
 338        /* add event to hostt buffer */
 339        priv->hostt.buff[priv->hostt.qtail] = le16_to_cpu(hdr->event);
 340        priv->hostt.qtail = (priv->hostt.qtail + 1) % SME_EVENT_BUFF_SIZE;
 341
 342        spin_lock(&priv->tx_dev.tx_dev_lock);
 343        result = enqueue_txdev(priv, p, size, complete_handler, skb);
 344        spin_unlock(&priv->tx_dev.tx_dev_lock);
 345
 346        if (cnt_txqbody(priv) > 0)
 347                queue_delayed_work(priv->wq, &priv->rw_dwork, 0);
 348
 349        return result;
 350}
 351
 352static void rx_event_task(unsigned long dev)
 353{
 354        struct ks_wlan_private *priv = (struct ks_wlan_private *)dev;
 355        struct rx_device_buffer *rp;
 356
 357        if (cnt_rxqbody(priv) > 0 && priv->dev_state >= DEVICE_STATE_BOOT) {
 358                rp = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qhead];
 359                hostif_receive(priv, rp->data, rp->size);
 360                inc_rxqhead(priv);
 361
 362                if (cnt_rxqbody(priv) > 0)
 363                        tasklet_schedule(&priv->rx_bh_task);
 364        }
 365}
 366
 367static void ks_wlan_hw_rx(struct ks_wlan_private *priv, uint16_t size)
 368{
 369        int ret;
 370        struct rx_device_buffer *rx_buffer;
 371        struct hostif_hdr *hdr;
 372        unsigned short event = 0;
 373
 374        /* receive data */
 375        if (cnt_rxqbody(priv) >= (RX_DEVICE_BUFF_SIZE - 1)) {
 376                netdev_err(priv->net_dev, "rx buffer overflow\n");
 377                return;
 378        }
 379        rx_buffer = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qtail];
 380
 381        ret = ks7010_sdio_read(priv, DATA_WINDOW, &rx_buffer->data[0],
 382                               hif_align_size(size));
 383        if (ret)
 384                return;
 385
 386        /* length check */
 387        if (size > 2046 || size == 0) {
 388#ifdef DEBUG
 389                print_hex_dump_bytes("INVALID DATA dump: ",
 390                                     DUMP_PREFIX_OFFSET,
 391                                     rx_buffer->data, 32);
 392#endif
 393                ret = ks7010_sdio_writeb(priv, READ_STATUS, REG_STATUS_IDLE);
 394                if (ret)
 395                        netdev_err(priv->net_dev, " error : READ_STATUS\n");
 396
 397                /* length check fail */
 398                return;
 399        }
 400
 401        hdr = (struct hostif_hdr *)&rx_buffer->data[0];
 402        rx_buffer->size = le16_to_cpu(hdr->size) + sizeof(hdr->size);
 403        event = le16_to_cpu(hdr->event);
 404        inc_rxqtail(priv);
 405
 406        ret = ks7010_sdio_writeb(priv, READ_STATUS, REG_STATUS_IDLE);
 407        if (ret)
 408                netdev_err(priv->net_dev, " error : READ_STATUS\n");
 409
 410        if (atomic_read(&priv->psstatus.confirm_wait)) {
 411                if (IS_HIF_CONF(event)) {
 412                        netdev_dbg(priv->net_dev, "IS_HIF_CONF true !!\n");
 413                        atomic_dec(&priv->psstatus.confirm_wait);
 414                }
 415        }
 416
 417        tasklet_schedule(&priv->rx_bh_task);
 418}
 419
 420static void ks7010_rw_function(struct work_struct *work)
 421{
 422        struct ks_wlan_private *priv;
 423        unsigned char byte;
 424        int ret;
 425
 426        priv = container_of(work, struct ks_wlan_private, rw_dwork.work);
 427
 428        /* wait after DOZE */
 429        if (time_after(priv->last_doze + ((30 * HZ) / 1000), jiffies)) {
 430                netdev_dbg(priv->net_dev, "wait after DOZE\n");
 431                queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 432                return;
 433        }
 434
 435        /* wait after WAKEUP */
 436        while (time_after(priv->last_wakeup + ((30 * HZ) / 1000), jiffies)) {
 437                netdev_dbg(priv->net_dev, "wait after WAKEUP\n");
 438                dev_info(&priv->ks_sdio_card->func->dev,
 439                         "wake: %lu %lu\n",
 440                         priv->last_wakeup + (30 * HZ) / 1000,
 441                                jiffies);
 442                msleep(30);
 443        }
 444
 445        sdio_claim_host(priv->ks_sdio_card->func);
 446
 447        /* power save wakeup */
 448        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
 449                if (cnt_txqbody(priv) > 0) {
 450                        ks_wlan_hw_wakeup_request(priv);
 451                        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 452                }
 453                goto release_host;
 454        }
 455
 456        /* sleep mode doze */
 457        if (atomic_read(&priv->sleepstatus.doze_request) == 1) {
 458                ks_wlan_hw_sleep_doze_request(priv);
 459                goto release_host;
 460        }
 461        /* sleep mode wakeup */
 462        if (atomic_read(&priv->sleepstatus.wakeup_request) == 1) {
 463                ks_wlan_hw_sleep_wakeup_request(priv);
 464                goto release_host;
 465        }
 466
 467        /* read (WriteStatus/ReadDataSize FN1:00_0014) */
 468        ret = ks7010_sdio_readb(priv, WSTATUS_RSIZE, &byte);
 469        if (ret) {
 470                netdev_err(priv->net_dev, " error : WSTATUS_RSIZE psstatus=%d\n",
 471                           atomic_read(&priv->psstatus.status));
 472                goto release_host;
 473        }
 474
 475        if (byte & RSIZE_MASK) {        /* Read schedule */
 476                ks_wlan_hw_rx(priv, (uint16_t)((byte & RSIZE_MASK) << 4));
 477        }
 478        if ((byte & WSTATUS_MASK))
 479                tx_device_task(priv);
 480
 481        _ks_wlan_hw_power_save(priv);
 482
 483release_host:
 484        sdio_release_host(priv->ks_sdio_card->func);
 485}
 486
 487static void ks_sdio_interrupt(struct sdio_func *func)
 488{
 489        int ret;
 490        struct ks_sdio_card *card;
 491        struct ks_wlan_private *priv;
 492        unsigned char status, rsize, byte;
 493
 494        card = sdio_get_drvdata(func);
 495        priv = card->priv;
 496
 497        if (priv->dev_state < DEVICE_STATE_BOOT)
 498                goto queue_delayed_work;
 499
 500        ret = ks7010_sdio_readb(priv, INT_PENDING, &status);
 501        if (ret) {
 502                netdev_err(priv->net_dev, "error : INT_PENDING\n");
 503                goto queue_delayed_work;
 504        }
 505
 506        /* schedule task for interrupt status */
 507        /* bit7 -> Write General Communication B register */
 508        /* read (General Communication B register) */
 509        /* bit5 -> Write Status Idle */
 510        /* bit2 -> Read Status Busy  */
 511        if (status & INT_GCR_B ||
 512            atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
 513                ret = ks7010_sdio_readb(priv, GCR_B, &byte);
 514                if (ret) {
 515                        netdev_err(priv->net_dev, " error : GCR_B\n");
 516                        goto queue_delayed_work;
 517                }
 518                if (byte == GCR_B_ACTIVE) {
 519                        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
 520                                atomic_set(&priv->psstatus.status, PS_WAKEUP);
 521                                priv->wakeup_count = 0;
 522                        }
 523                        complete(&priv->psstatus.wakeup_wait);
 524                }
 525        }
 526
 527        do {
 528                /* read (WriteStatus/ReadDataSize FN1:00_0014) */
 529                ret = ks7010_sdio_readb(priv, WSTATUS_RSIZE, &byte);
 530                if (ret) {
 531                        netdev_err(priv->net_dev, " error : WSTATUS_RSIZE\n");
 532                        goto queue_delayed_work;
 533                }
 534                rsize = byte & RSIZE_MASK;
 535                if (rsize != 0)         /* Read schedule */
 536                        ks_wlan_hw_rx(priv, (uint16_t)(rsize << 4));
 537
 538                if (byte & WSTATUS_MASK) {
 539                        if (atomic_read(&priv->psstatus.status) == PS_SNOOZE) {
 540                                if (cnt_txqbody(priv)) {
 541                                        ks_wlan_hw_wakeup_request(priv);
 542                                        queue_delayed_work(priv->wq, &priv->rw_dwork, 1);
 543                                        return;
 544                                }
 545                        } else {
 546                                tx_device_task(priv);
 547                        }
 548                }
 549        } while (rsize);
 550
 551queue_delayed_work:
 552        queue_delayed_work(priv->wq, &priv->rw_dwork, 0);
 553}
 554
 555static int trx_device_init(struct ks_wlan_private *priv)
 556{
 557        priv->tx_dev.qhead = 0;
 558        priv->tx_dev.qtail = 0;
 559
 560        priv->rx_dev.qhead = 0;
 561        priv->rx_dev.qtail = 0;
 562
 563        spin_lock_init(&priv->tx_dev.tx_dev_lock);
 564        spin_lock_init(&priv->rx_dev.rx_dev_lock);
 565
 566        tasklet_init(&priv->rx_bh_task, rx_event_task, (unsigned long)priv);
 567
 568        return 0;
 569}
 570
 571static void trx_device_exit(struct ks_wlan_private *priv)
 572{
 573        struct tx_device_buffer *sp;
 574
 575        /* tx buffer clear */
 576        while (cnt_txqbody(priv) > 0) {
 577                sp = &priv->tx_dev.tx_dev_buff[priv->tx_dev.qhead];
 578                kfree(sp->sendp);
 579                if (sp->complete_handler)       /* TX Complete */
 580                        (*sp->complete_handler)(priv, sp->skb);
 581                inc_txqhead(priv);
 582        }
 583
 584        tasklet_kill(&priv->rx_bh_task);
 585}
 586
 587static int ks7010_sdio_update_index(struct ks_wlan_private *priv, u32 index)
 588{
 589        int ret;
 590        unsigned char *data_buf;
 591
 592        data_buf = kmalloc(sizeof(u32), GFP_KERNEL);
 593        if (!data_buf)
 594                return -ENOMEM;
 595
 596        memcpy(data_buf, &index, sizeof(index));
 597        ret = ks7010_sdio_write(priv, WRITE_INDEX, data_buf, sizeof(index));
 598        if (ret)
 599                goto err_free_data_buf;
 600
 601        ret = ks7010_sdio_write(priv, READ_INDEX, data_buf, sizeof(index));
 602        if (ret)
 603                goto err_free_data_buf;
 604
 605        return 0;
 606
 607err_free_data_buf:
 608        kfree(data_buf);
 609
 610        return ret;
 611}
 612
 613#define ROM_BUFF_SIZE (64 * 1024)
 614static int ks7010_sdio_data_compare(struct ks_wlan_private *priv, u32 address,
 615                                    unsigned char *data, unsigned int size)
 616{
 617        int ret;
 618        unsigned char *read_buf;
 619
 620        read_buf = kmalloc(ROM_BUFF_SIZE, GFP_KERNEL);
 621        if (!read_buf)
 622                return -ENOMEM;
 623
 624        ret = ks7010_sdio_read(priv, address, read_buf, size);
 625        if (ret)
 626                goto err_free_read_buf;
 627
 628        if (memcmp(data, read_buf, size) != 0) {
 629                ret = -EIO;
 630                netdev_err(priv->net_dev, "data compare error (%d)\n", ret);
 631                goto err_free_read_buf;
 632        }
 633
 634        return 0;
 635
 636err_free_read_buf:
 637        kfree(read_buf);
 638
 639        return ret;
 640}
 641
 642static int ks7010_upload_firmware(struct ks_sdio_card *card)
 643{
 644        struct ks_wlan_private *priv = card->priv;
 645        unsigned int size, offset, n = 0;
 646        unsigned char *rom_buf;
 647        unsigned char byte = 0;
 648        int ret;
 649        unsigned int length;
 650        const struct firmware *fw_entry = NULL;
 651
 652        rom_buf = kmalloc(ROM_BUFF_SIZE, GFP_KERNEL);
 653        if (!rom_buf)
 654                return -ENOMEM;
 655
 656        sdio_claim_host(card->func);
 657
 658        /* Firmware running ? */
 659        ret = ks7010_sdio_readb(priv, GCR_A, &byte);
 660        if (byte == GCR_A_RUN) {
 661                netdev_dbg(priv->net_dev, "MAC firmware running ...\n");
 662                goto release_host_and_free;
 663        }
 664
 665        ret = request_firmware(&fw_entry, ROM_FILE,
 666                               &priv->ks_sdio_card->func->dev);
 667        if (ret)
 668                goto release_host_and_free;
 669
 670        length = fw_entry->size;
 671
 672        n = 0;
 673        do {
 674                if (length >= ROM_BUFF_SIZE) {
 675                        size = ROM_BUFF_SIZE;
 676                        length = length - ROM_BUFF_SIZE;
 677                } else {
 678                        size = length;
 679                        length = 0;
 680                }
 681                if (size == 0)
 682                        break;
 683                memcpy(rom_buf, fw_entry->data + n, size);
 684
 685                offset = n;
 686                ret = ks7010_sdio_update_index(priv, KS7010_IRAM_ADDRESS + offset);
 687                if (ret)
 688                        goto release_firmware;
 689
 690                ret = ks7010_sdio_write(priv, DATA_WINDOW, rom_buf, size);
 691                if (ret)
 692                        goto release_firmware;
 693
 694                ret = ks7010_sdio_data_compare(priv, DATA_WINDOW, rom_buf, size);
 695                if (ret)
 696                        goto release_firmware;
 697
 698                n += size;
 699
 700        } while (size);
 701
 702        ret = ks7010_sdio_writeb(priv, GCR_A, GCR_A_REMAP);
 703        if (ret)
 704                goto release_firmware;
 705
 706        /* Firmware running check */
 707        for (n = 0; n < 50; ++n) {
 708                mdelay(10);     /* wait_ms(10); */
 709                ret = ks7010_sdio_readb(priv, GCR_A, &byte);
 710                if (ret)
 711                        goto release_firmware;
 712
 713                if (byte == GCR_A_RUN)
 714                        break;
 715        }
 716        if ((50) <= n) {
 717                netdev_err(priv->net_dev, "firmware can't start\n");
 718                ret = -EIO;
 719                goto release_firmware;
 720        }
 721
 722        ret = 0;
 723
 724 release_firmware:
 725        release_firmware(fw_entry);
 726 release_host_and_free:
 727        sdio_release_host(card->func);
 728        kfree(rom_buf);
 729
 730        return ret;
 731}
 732
 733static void ks7010_card_init(struct ks_wlan_private *priv)
 734{
 735        init_completion(&priv->confirm_wait);
 736
 737        /* get mac address & firmware version */
 738        hostif_sme_enqueue(priv, SME_START);
 739
 740        if (!wait_for_completion_interruptible_timeout
 741            (&priv->confirm_wait, 5 * HZ)) {
 742                netdev_dbg(priv->net_dev, "wait time out!! SME_START\n");
 743        }
 744
 745        if (priv->mac_address_valid && priv->version_size != 0)
 746                priv->dev_state = DEVICE_STATE_PREINIT;
 747
 748        hostif_sme_enqueue(priv, SME_GET_EEPROM_CKSUM);
 749
 750        /* load initial wireless parameter */
 751        hostif_sme_enqueue(priv, SME_STOP_REQUEST);
 752
 753        hostif_sme_enqueue(priv, SME_RTS_THRESHOLD_REQUEST);
 754        hostif_sme_enqueue(priv, SME_FRAGMENTATION_THRESHOLD_REQUEST);
 755
 756        hostif_sme_enqueue(priv, SME_WEP_INDEX_REQUEST);
 757        hostif_sme_enqueue(priv, SME_WEP_KEY1_REQUEST);
 758        hostif_sme_enqueue(priv, SME_WEP_KEY2_REQUEST);
 759        hostif_sme_enqueue(priv, SME_WEP_KEY3_REQUEST);
 760        hostif_sme_enqueue(priv, SME_WEP_KEY4_REQUEST);
 761
 762        hostif_sme_enqueue(priv, SME_WEP_FLAG_REQUEST);
 763        hostif_sme_enqueue(priv, SME_RSN_ENABLED_REQUEST);
 764        hostif_sme_enqueue(priv, SME_MODE_SET_REQUEST);
 765        hostif_sme_enqueue(priv, SME_START_REQUEST);
 766
 767        if (!wait_for_completion_interruptible_timeout
 768            (&priv->confirm_wait, 5 * HZ)) {
 769                netdev_dbg(priv->net_dev, "wait time out!! wireless parameter set\n");
 770        }
 771
 772        if (priv->dev_state >= DEVICE_STATE_PREINIT) {
 773                netdev_dbg(priv->net_dev, "DEVICE READY!!\n");
 774                priv->dev_state = DEVICE_STATE_READY;
 775        }
 776}
 777
 778static void ks7010_init_defaults(struct ks_wlan_private *priv)
 779{
 780        priv->reg.tx_rate = TX_RATE_AUTO;
 781        priv->reg.preamble = LONG_PREAMBLE;
 782        priv->reg.power_mgmt = POWER_MGMT_ACTIVE;
 783        priv->reg.scan_type = ACTIVE_SCAN;
 784        priv->reg.beacon_lost_count = 20;
 785        priv->reg.rts = 2347UL;
 786        priv->reg.fragment = 2346UL;
 787        priv->reg.phy_type = D_11BG_COMPATIBLE_MODE;
 788        priv->reg.cts_mode = CTS_MODE_FALSE;
 789        priv->reg.rate_set.body[11] = TX_RATE_54M;
 790        priv->reg.rate_set.body[10] = TX_RATE_48M;
 791        priv->reg.rate_set.body[9] = TX_RATE_36M;
 792        priv->reg.rate_set.body[8] = TX_RATE_18M;
 793        priv->reg.rate_set.body[7] = TX_RATE_9M;
 794        priv->reg.rate_set.body[6] = TX_RATE_24M | BASIC_RATE;
 795        priv->reg.rate_set.body[5] = TX_RATE_12M | BASIC_RATE;
 796        priv->reg.rate_set.body[4] = TX_RATE_6M | BASIC_RATE;
 797        priv->reg.rate_set.body[3] = TX_RATE_11M | BASIC_RATE;
 798        priv->reg.rate_set.body[2] = TX_RATE_5M | BASIC_RATE;
 799        priv->reg.rate_set.body[1] = TX_RATE_2M | BASIC_RATE;
 800        priv->reg.rate_set.body[0] = TX_RATE_1M | BASIC_RATE;
 801        priv->reg.tx_rate = TX_RATE_FULL_AUTO;
 802        priv->reg.rate_set.size = 12;
 803}
 804
 805static int ks7010_sdio_probe(struct sdio_func *func,
 806                             const struct sdio_device_id *device)
 807{
 808        struct ks_wlan_private *priv;
 809        struct ks_sdio_card *card;
 810        struct net_device *netdev;
 811        unsigned char byte;
 812        int ret;
 813
 814        priv = NULL;
 815        netdev = NULL;
 816
 817        card = kzalloc(sizeof(*card), GFP_KERNEL);
 818        if (!card)
 819                return -ENOMEM;
 820
 821        card->func = func;
 822
 823        sdio_claim_host(func);
 824
 825        ret = sdio_set_block_size(func, KS7010_IO_BLOCK_SIZE);
 826        dev_dbg(&card->func->dev, "multi_block=%d sdio_set_block_size()=%d %d\n",
 827                func->card->cccr.multi_block, func->cur_blksize, ret);
 828
 829        ret = sdio_enable_func(func);
 830        if (ret)
 831                goto err_free_card;
 832
 833        /* interrupt disable */
 834        sdio_writeb(func, 0, INT_ENABLE, &ret);
 835        if (ret)
 836                goto err_free_card;
 837        sdio_writeb(func, 0xff, INT_PENDING, &ret);
 838        if (ret)
 839                goto err_disable_func;
 840
 841        /* setup interrupt handler */
 842        ret = sdio_claim_irq(func, ks_sdio_interrupt);
 843        if (ret)
 844                goto err_disable_func;
 845
 846        sdio_release_host(func);
 847
 848        sdio_set_drvdata(func, card);
 849
 850        dev_dbg(&card->func->dev, "class = 0x%X, vendor = 0x%X, device = 0x%X\n",
 851                func->class, func->vendor, func->device);
 852
 853        /* private memory allocate */
 854        netdev = alloc_etherdev(sizeof(*priv));
 855        if (!netdev) {
 856                dev_err(&card->func->dev, "ks7010 : Unable to alloc new net device\n");
 857                goto err_release_irq;
 858        }
 859        if (dev_alloc_name(netdev, "wlan%d") < 0) {
 860                dev_err(&card->func->dev,
 861                        "ks7010 :  Couldn't get name!\n");
 862                goto err_free_netdev;
 863        }
 864
 865        priv = netdev_priv(netdev);
 866
 867        card->priv = priv;
 868        SET_NETDEV_DEV(netdev, &card->func->dev);       /* for create sysfs symlinks */
 869
 870        /* private memory initialize */
 871        priv->ks_sdio_card = card;
 872
 873        priv->dev_state = DEVICE_STATE_PREBOOT;
 874        priv->net_dev = netdev;
 875        priv->firmware_version[0] = '\0';
 876        priv->version_size = 0;
 877        priv->last_doze = jiffies;
 878        priv->last_wakeup = jiffies;
 879        memset(&priv->nstats, 0, sizeof(priv->nstats));
 880        memset(&priv->wstats, 0, sizeof(priv->wstats));
 881
 882        /* sleep mode */
 883        atomic_set(&priv->sleepstatus.doze_request, 0);
 884        atomic_set(&priv->sleepstatus.wakeup_request, 0);
 885        atomic_set(&priv->sleepstatus.wakeup_request, 0);
 886
 887        trx_device_init(priv);
 888        hostif_init(priv);
 889        ks_wlan_net_start(netdev);
 890
 891        ks7010_init_defaults(priv);
 892
 893        ret = ks7010_upload_firmware(card);
 894        if (ret) {
 895                netdev_err(priv->net_dev,
 896                           "ks7010: firmware load failed !! return code = %d\n",
 897                           ret);
 898                goto err_free_netdev;
 899        }
 900
 901        /* interrupt setting */
 902        /* clear Interrupt status write (ARMtoSD_InterruptPending FN1:00_0024) */
 903        sdio_claim_host(func);
 904        ret = ks7010_sdio_writeb(priv, INT_PENDING, 0xff);
 905        sdio_release_host(func);
 906        if (ret)
 907                netdev_err(priv->net_dev, " error : INT_PENDING\n");
 908
 909        /* enable ks7010sdio interrupt */
 910        byte = (INT_GCR_B | INT_READ_STATUS | INT_WRITE_STATUS);
 911        sdio_claim_host(func);
 912        ret = ks7010_sdio_writeb(priv, INT_ENABLE, byte);
 913        sdio_release_host(func);
 914        if (ret)
 915                netdev_err(priv->net_dev, " err : INT_ENABLE\n");
 916
 917        priv->dev_state = DEVICE_STATE_BOOT;
 918
 919        priv->wq = create_workqueue("wq");
 920        if (!priv->wq) {
 921                netdev_err(priv->net_dev, "create_workqueue failed !!\n");
 922                goto err_free_netdev;
 923        }
 924
 925        INIT_DELAYED_WORK(&priv->rw_dwork, ks7010_rw_function);
 926        ks7010_card_init(priv);
 927
 928        ret = register_netdev(priv->net_dev);
 929        if (ret)
 930                goto err_free_netdev;
 931
 932        return 0;
 933
 934 err_free_netdev:
 935        free_netdev(priv->net_dev);
 936        card->priv = NULL;
 937 err_release_irq:
 938        sdio_claim_host(func);
 939        sdio_release_irq(func);
 940 err_disable_func:
 941        sdio_disable_func(func);
 942 err_free_card:
 943        sdio_release_host(func);
 944        sdio_set_drvdata(func, NULL);
 945        kfree(card);
 946
 947        return -ENODEV;
 948}
 949
 950/* send stop request to MAC */
 951static int send_stop_request(struct sdio_func *func)
 952{
 953        struct hostif_stop_request_t *pp;
 954        struct ks_sdio_card *card;
 955        size_t size;
 956
 957        card = sdio_get_drvdata(func);
 958
 959        pp = kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL);
 960        if (!pp) {
 961                netdev_err(card->priv->net_dev, "allocate memory failed..\n");
 962                return -ENOMEM;
 963        }
 964
 965        size = sizeof(*pp) - sizeof(pp->header.size);
 966        pp->header.size = cpu_to_le16((uint16_t)size);
 967        pp->header.event = cpu_to_le16((uint16_t)HIF_STOP_REQ);
 968
 969        sdio_claim_host(func);
 970        write_to_device(card->priv, (unsigned char *)pp,
 971                        hif_align_size(sizeof(*pp)));
 972        sdio_release_host(func);
 973
 974        kfree(pp);
 975        return 0;
 976}
 977
 978static void ks7010_sdio_remove(struct sdio_func *func)
 979{
 980        int ret;
 981        struct ks_sdio_card *card;
 982        struct ks_wlan_private *priv;
 983
 984        card = sdio_get_drvdata(func);
 985
 986        if (!card)
 987                return;
 988
 989        priv = card->priv;
 990        if (priv) {
 991                struct net_device *netdev = priv->net_dev;
 992
 993                ks_wlan_net_stop(netdev);
 994
 995                /* interrupt disable */
 996                sdio_claim_host(func);
 997                sdio_writeb(func, 0, INT_ENABLE, &ret);
 998                sdio_writeb(func, 0xff, INT_PENDING, &ret);
 999                sdio_release_host(func);
1000
1001                ret = send_stop_request(func);
1002                if (ret)        /* memory allocation failure */
1003                        return;
1004
1005                if (priv->wq) {
1006                        flush_workqueue(priv->wq);
1007                        destroy_workqueue(priv->wq);
1008                }
1009
1010                hostif_exit(priv);
1011
1012                unregister_netdev(netdev);
1013
1014                trx_device_exit(priv);
1015                free_netdev(priv->net_dev);
1016                card->priv = NULL;
1017        }
1018
1019        sdio_claim_host(func);
1020        sdio_release_irq(func);
1021        sdio_disable_func(func);
1022        sdio_release_host(func);
1023        sdio_set_drvdata(func, NULL);
1024        kfree(card);
1025}
1026
1027static struct sdio_driver ks7010_sdio_driver = {
1028        .name = "ks7010_sdio",
1029        .id_table = ks7010_sdio_ids,
1030        .probe = ks7010_sdio_probe,
1031        .remove = ks7010_sdio_remove,
1032};
1033
1034module_driver(ks7010_sdio_driver, sdio_register_driver, sdio_unregister_driver);
1035MODULE_AUTHOR("Sang Engineering, Qi-Hardware, KeyStream");
1036MODULE_DESCRIPTION("Driver for KeyStream KS7010 based SDIO cards");
1037MODULE_LICENSE("GPL v2");
1038MODULE_FIRMWARE(ROM_FILE);
1039