linux/drivers/net/wireless/ath/ath9k/hif_usb.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2010-2011 Atheros Communications Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#include <asm/unaligned.h>
  18#include "htc.h"
  19
  20MODULE_FIRMWARE(HTC_7010_MODULE_FW);
  21MODULE_FIRMWARE(HTC_9271_MODULE_FW);
  22
  23static const struct usb_device_id ath9k_hif_usb_ids[] = {
  24        { USB_DEVICE(0x0cf3, 0x9271) }, /* Atheros */
  25        { USB_DEVICE(0x0cf3, 0x1006) }, /* Atheros */
  26        { USB_DEVICE(0x0846, 0x9030) }, /* Netgear N150 */
  27        { USB_DEVICE(0x07b8, 0x9271) }, /* Altai WA1011N-GU */
  28        { USB_DEVICE(0x07D1, 0x3A10) }, /* Dlink Wireless 150 */
  29        { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */
  30        { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */
  31        { USB_DEVICE(0x13D3, 0x3346) }, /* IMC Networks */
  32        { USB_DEVICE(0x13D3, 0x3348) }, /* Azurewave */
  33        { USB_DEVICE(0x13D3, 0x3349) }, /* Azurewave */
  34        { USB_DEVICE(0x13D3, 0x3350) }, /* Azurewave */
  35        { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */
  36        { USB_DEVICE(0x040D, 0x3801) }, /* VIA */
  37        { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */
  38        { USB_DEVICE(0x0cf3, 0xb002) }, /* Ubiquiti WifiStation */
  39        { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */
  40        { USB_DEVICE(0x0471, 0x209e) }, /* Philips (or NXP) PTA01 */
  41        { USB_DEVICE(0x1eda, 0x2315) }, /* AirTies */
  42
  43        { USB_DEVICE(0x0cf3, 0x7015),
  44          .driver_info = AR9287_USB },  /* Atheros */
  45        { USB_DEVICE(0x1668, 0x1200),
  46          .driver_info = AR9287_USB },  /* Verizon */
  47
  48        { USB_DEVICE(0x0cf3, 0x7010),
  49          .driver_info = AR9280_USB },  /* Atheros */
  50        { USB_DEVICE(0x0846, 0x9018),
  51          .driver_info = AR9280_USB },  /* Netgear WNDA3200 */
  52        { USB_DEVICE(0x083A, 0xA704),
  53          .driver_info = AR9280_USB },  /* SMC Networks */
  54        { USB_DEVICE(0x0411, 0x017f),
  55          .driver_info = AR9280_USB },  /* Sony UWA-BR100 */
  56        { USB_DEVICE(0x0411, 0x0197),
  57          .driver_info = AR9280_USB },  /* Buffalo WLI-UV-AG300P */
  58        { USB_DEVICE(0x04da, 0x3904),
  59          .driver_info = AR9280_USB },
  60        { USB_DEVICE(0x0930, 0x0a08),
  61          .driver_info = AR9280_USB },  /* Toshiba WLM-20U2 and GN-1080 */
  62
  63        { USB_DEVICE(0x0cf3, 0x20ff),
  64          .driver_info = STORAGE_DEVICE },
  65
  66        { },
  67};
  68
  69MODULE_DEVICE_TABLE(usb, ath9k_hif_usb_ids);
  70
  71static int __hif_usb_tx(struct hif_device_usb *hif_dev);
  72
  73static void hif_usb_regout_cb(struct urb *urb)
  74{
  75        struct cmd_buf *cmd = (struct cmd_buf *)urb->context;
  76
  77        switch (urb->status) {
  78        case 0:
  79                break;
  80        case -ENOENT:
  81        case -ECONNRESET:
  82        case -ENODEV:
  83        case -ESHUTDOWN:
  84                goto free;
  85        default:
  86                break;
  87        }
  88
  89        if (cmd) {
  90                ath9k_htc_txcompletion_cb(cmd->hif_dev->htc_handle,
  91                                          cmd->skb, true);
  92                kfree(cmd);
  93        }
  94
  95        return;
  96free:
  97        kfree_skb(cmd->skb);
  98        kfree(cmd);
  99}
 100
 101static int hif_usb_send_regout(struct hif_device_usb *hif_dev,
 102                               struct sk_buff *skb)
 103{
 104        struct urb *urb;
 105        struct cmd_buf *cmd;
 106        int ret = 0;
 107
 108        urb = usb_alloc_urb(0, GFP_KERNEL);
 109        if (urb == NULL)
 110                return -ENOMEM;
 111
 112        cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
 113        if (cmd == NULL) {
 114                usb_free_urb(urb);
 115                return -ENOMEM;
 116        }
 117
 118        cmd->skb = skb;
 119        cmd->hif_dev = hif_dev;
 120
 121        usb_fill_int_urb(urb, hif_dev->udev,
 122                         usb_sndintpipe(hif_dev->udev, USB_REG_OUT_PIPE),
 123                         skb->data, skb->len,
 124                         hif_usb_regout_cb, cmd, 1);
 125
 126        usb_anchor_urb(urb, &hif_dev->regout_submitted);
 127        ret = usb_submit_urb(urb, GFP_KERNEL);
 128        if (ret) {
 129                usb_unanchor_urb(urb);
 130                kfree(cmd);
 131        }
 132        usb_free_urb(urb);
 133
 134        return ret;
 135}
 136
 137static void hif_usb_mgmt_cb(struct urb *urb)
 138{
 139        struct cmd_buf *cmd = (struct cmd_buf *)urb->context;
 140        struct hif_device_usb *hif_dev;
 141        bool txok = true;
 142
 143        if (!cmd || !cmd->skb || !cmd->hif_dev)
 144                return;
 145
 146        hif_dev = cmd->hif_dev;
 147
 148        switch (urb->status) {
 149        case 0:
 150                break;
 151        case -ENOENT:
 152        case -ECONNRESET:
 153        case -ENODEV:
 154        case -ESHUTDOWN:
 155                txok = false;
 156
 157                /*
 158                 * If the URBs are being flushed, no need to complete
 159                 * this packet.
 160                 */
 161                spin_lock(&hif_dev->tx.tx_lock);
 162                if (hif_dev->tx.flags & HIF_USB_TX_FLUSH) {
 163                        spin_unlock(&hif_dev->tx.tx_lock);
 164                        dev_kfree_skb_any(cmd->skb);
 165                        kfree(cmd);
 166                        return;
 167                }
 168                spin_unlock(&hif_dev->tx.tx_lock);
 169
 170                break;
 171        default:
 172                txok = false;
 173                break;
 174        }
 175
 176        skb_pull(cmd->skb, 4);
 177        ath9k_htc_txcompletion_cb(cmd->hif_dev->htc_handle,
 178                                  cmd->skb, txok);
 179        kfree(cmd);
 180}
 181
 182static int hif_usb_send_mgmt(struct hif_device_usb *hif_dev,
 183                             struct sk_buff *skb)
 184{
 185        struct urb *urb;
 186        struct cmd_buf *cmd;
 187        int ret = 0;
 188        __le16 *hdr;
 189
 190        urb = usb_alloc_urb(0, GFP_ATOMIC);
 191        if (urb == NULL)
 192                return -ENOMEM;
 193
 194        cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC);
 195        if (cmd == NULL) {
 196                usb_free_urb(urb);
 197                return -ENOMEM;
 198        }
 199
 200        cmd->skb = skb;
 201        cmd->hif_dev = hif_dev;
 202
 203        hdr = skb_push(skb, 4);
 204        *hdr++ = cpu_to_le16(skb->len - 4);
 205        *hdr++ = cpu_to_le16(ATH_USB_TX_STREAM_MODE_TAG);
 206
 207        usb_fill_bulk_urb(urb, hif_dev->udev,
 208                         usb_sndbulkpipe(hif_dev->udev, USB_WLAN_TX_PIPE),
 209                         skb->data, skb->len,
 210                         hif_usb_mgmt_cb, cmd);
 211
 212        usb_anchor_urb(urb, &hif_dev->mgmt_submitted);
 213        ret = usb_submit_urb(urb, GFP_ATOMIC);
 214        if (ret) {
 215                usb_unanchor_urb(urb);
 216                kfree(cmd);
 217        }
 218        usb_free_urb(urb);
 219
 220        return ret;
 221}
 222
 223static inline void ath9k_skb_queue_purge(struct hif_device_usb *hif_dev,
 224                                         struct sk_buff_head *list)
 225{
 226        struct sk_buff *skb;
 227
 228        while ((skb = __skb_dequeue(list)) != NULL) {
 229                dev_kfree_skb_any(skb);
 230        }
 231}
 232
 233static inline void ath9k_skb_queue_complete(struct hif_device_usb *hif_dev,
 234                                            struct sk_buff_head *queue,
 235                                            bool txok)
 236{
 237        struct sk_buff *skb;
 238
 239        while ((skb = __skb_dequeue(queue)) != NULL) {
 240#ifdef CONFIG_ATH9K_HTC_DEBUGFS
 241                int ln = skb->len;
 242#endif
 243                ath9k_htc_txcompletion_cb(hif_dev->htc_handle,
 244                                          skb, txok);
 245                if (txok) {
 246                        TX_STAT_INC(skb_success);
 247                        TX_STAT_ADD(skb_success_bytes, ln);
 248                }
 249                else
 250                        TX_STAT_INC(skb_failed);
 251        }
 252}
 253
 254static void hif_usb_tx_cb(struct urb *urb)
 255{
 256        struct tx_buf *tx_buf = (struct tx_buf *) urb->context;
 257        struct hif_device_usb *hif_dev;
 258        bool txok = true;
 259
 260        if (!tx_buf || !tx_buf->hif_dev)
 261                return;
 262
 263        hif_dev = tx_buf->hif_dev;
 264
 265        switch (urb->status) {
 266        case 0:
 267                break;
 268        case -ENOENT:
 269        case -ECONNRESET:
 270        case -ENODEV:
 271        case -ESHUTDOWN:
 272                txok = false;
 273
 274                /*
 275                 * If the URBs are being flushed, no need to add this
 276                 * URB to the free list.
 277                 */
 278                spin_lock(&hif_dev->tx.tx_lock);
 279                if (hif_dev->tx.flags & HIF_USB_TX_FLUSH) {
 280                        spin_unlock(&hif_dev->tx.tx_lock);
 281                        ath9k_skb_queue_purge(hif_dev, &tx_buf->skb_queue);
 282                        return;
 283                }
 284                spin_unlock(&hif_dev->tx.tx_lock);
 285
 286                break;
 287        default:
 288                txok = false;
 289                break;
 290        }
 291
 292        ath9k_skb_queue_complete(hif_dev, &tx_buf->skb_queue, txok);
 293
 294        /* Re-initialize the SKB queue */
 295        tx_buf->len = tx_buf->offset = 0;
 296        __skb_queue_head_init(&tx_buf->skb_queue);
 297
 298        /* Add this TX buffer to the free list */
 299        spin_lock(&hif_dev->tx.tx_lock);
 300        list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
 301        hif_dev->tx.tx_buf_cnt++;
 302        if (!(hif_dev->tx.flags & HIF_USB_TX_STOP))
 303                __hif_usb_tx(hif_dev); /* Check for pending SKBs */
 304        TX_STAT_INC(buf_completed);
 305        spin_unlock(&hif_dev->tx.tx_lock);
 306}
 307
 308/* TX lock has to be taken */
 309static int __hif_usb_tx(struct hif_device_usb *hif_dev)
 310{
 311        struct tx_buf *tx_buf = NULL;
 312        struct sk_buff *nskb = NULL;
 313        int ret = 0, i;
 314        u16 tx_skb_cnt = 0;
 315        u8 *buf;
 316        __le16 *hdr;
 317
 318        if (hif_dev->tx.tx_skb_cnt == 0)
 319                return 0;
 320
 321        /* Check if a free TX buffer is available */
 322        if (list_empty(&hif_dev->tx.tx_buf))
 323                return 0;
 324
 325        tx_buf = list_first_entry(&hif_dev->tx.tx_buf, struct tx_buf, list);
 326        list_move_tail(&tx_buf->list, &hif_dev->tx.tx_pending);
 327        hif_dev->tx.tx_buf_cnt--;
 328
 329        tx_skb_cnt = min_t(u16, hif_dev->tx.tx_skb_cnt, MAX_TX_AGGR_NUM);
 330
 331        for (i = 0; i < tx_skb_cnt; i++) {
 332                nskb = __skb_dequeue(&hif_dev->tx.tx_skb_queue);
 333
 334                /* Should never be NULL */
 335                BUG_ON(!nskb);
 336
 337                hif_dev->tx.tx_skb_cnt--;
 338
 339                buf = tx_buf->buf;
 340                buf += tx_buf->offset;
 341                hdr = (__le16 *)buf;
 342                *hdr++ = cpu_to_le16(nskb->len);
 343                *hdr++ = cpu_to_le16(ATH_USB_TX_STREAM_MODE_TAG);
 344                buf += 4;
 345                memcpy(buf, nskb->data, nskb->len);
 346                tx_buf->len = nskb->len + 4;
 347
 348                if (i < (tx_skb_cnt - 1))
 349                        tx_buf->offset += (((tx_buf->len - 1) / 4) + 1) * 4;
 350
 351                if (i == (tx_skb_cnt - 1))
 352                        tx_buf->len += tx_buf->offset;
 353
 354                __skb_queue_tail(&tx_buf->skb_queue, nskb);
 355                TX_STAT_INC(skb_queued);
 356        }
 357
 358        usb_fill_bulk_urb(tx_buf->urb, hif_dev->udev,
 359                          usb_sndbulkpipe(hif_dev->udev, USB_WLAN_TX_PIPE),
 360                          tx_buf->buf, tx_buf->len,
 361                          hif_usb_tx_cb, tx_buf);
 362
 363        ret = usb_submit_urb(tx_buf->urb, GFP_ATOMIC);
 364        if (ret) {
 365                tx_buf->len = tx_buf->offset = 0;
 366                ath9k_skb_queue_complete(hif_dev, &tx_buf->skb_queue, false);
 367                __skb_queue_head_init(&tx_buf->skb_queue);
 368                list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
 369                hif_dev->tx.tx_buf_cnt++;
 370        }
 371
 372        if (!ret)
 373                TX_STAT_INC(buf_queued);
 374
 375        return ret;
 376}
 377
 378static int hif_usb_send_tx(struct hif_device_usb *hif_dev, struct sk_buff *skb)
 379{
 380        struct ath9k_htc_tx_ctl *tx_ctl;
 381        unsigned long flags;
 382        int ret = 0;
 383
 384        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 385
 386        if (hif_dev->tx.flags & HIF_USB_TX_STOP) {
 387                spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 388                return -ENODEV;
 389        }
 390
 391        /* Check if the max queue count has been reached */
 392        if (hif_dev->tx.tx_skb_cnt > MAX_TX_BUF_NUM) {
 393                spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 394                return -ENOMEM;
 395        }
 396
 397        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 398
 399        tx_ctl = HTC_SKB_CB(skb);
 400
 401        /* Mgmt/Beacon frames don't use the TX buffer pool */
 402        if ((tx_ctl->type == ATH9K_HTC_MGMT) ||
 403            (tx_ctl->type == ATH9K_HTC_BEACON)) {
 404                ret = hif_usb_send_mgmt(hif_dev, skb);
 405        }
 406
 407        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 408
 409        if ((tx_ctl->type == ATH9K_HTC_NORMAL) ||
 410            (tx_ctl->type == ATH9K_HTC_AMPDU)) {
 411                __skb_queue_tail(&hif_dev->tx.tx_skb_queue, skb);
 412                hif_dev->tx.tx_skb_cnt++;
 413        }
 414
 415        /* Check if AMPDUs have to be sent immediately */
 416        if ((hif_dev->tx.tx_buf_cnt == MAX_TX_URB_NUM) &&
 417            (hif_dev->tx.tx_skb_cnt < 2)) {
 418                __hif_usb_tx(hif_dev);
 419        }
 420
 421        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 422
 423        return ret;
 424}
 425
 426static void hif_usb_start(void *hif_handle)
 427{
 428        struct hif_device_usb *hif_dev = hif_handle;
 429        unsigned long flags;
 430
 431        hif_dev->flags |= HIF_USB_START;
 432
 433        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 434        hif_dev->tx.flags &= ~HIF_USB_TX_STOP;
 435        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 436}
 437
 438static void hif_usb_stop(void *hif_handle)
 439{
 440        struct hif_device_usb *hif_dev = hif_handle;
 441        struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL;
 442        unsigned long flags;
 443
 444        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 445        ath9k_skb_queue_complete(hif_dev, &hif_dev->tx.tx_skb_queue, false);
 446        hif_dev->tx.tx_skb_cnt = 0;
 447        hif_dev->tx.flags |= HIF_USB_TX_STOP;
 448        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 449
 450        /* The pending URBs have to be canceled. */
 451        list_for_each_entry_safe(tx_buf, tx_buf_tmp,
 452                                 &hif_dev->tx.tx_pending, list) {
 453                usb_kill_urb(tx_buf->urb);
 454        }
 455
 456        usb_kill_anchored_urbs(&hif_dev->mgmt_submitted);
 457}
 458
 459static int hif_usb_send(void *hif_handle, u8 pipe_id, struct sk_buff *skb)
 460{
 461        struct hif_device_usb *hif_dev = hif_handle;
 462        int ret = 0;
 463
 464        switch (pipe_id) {
 465        case USB_WLAN_TX_PIPE:
 466                ret = hif_usb_send_tx(hif_dev, skb);
 467                break;
 468        case USB_REG_OUT_PIPE:
 469                ret = hif_usb_send_regout(hif_dev, skb);
 470                break;
 471        default:
 472                dev_err(&hif_dev->udev->dev,
 473                        "ath9k_htc: Invalid TX pipe: %d\n", pipe_id);
 474                ret = -EINVAL;
 475                break;
 476        }
 477
 478        return ret;
 479}
 480
 481static inline bool check_index(struct sk_buff *skb, u8 idx)
 482{
 483        struct ath9k_htc_tx_ctl *tx_ctl;
 484
 485        tx_ctl = HTC_SKB_CB(skb);
 486
 487        if ((tx_ctl->type == ATH9K_HTC_AMPDU) &&
 488            (tx_ctl->sta_idx == idx))
 489                return true;
 490
 491        return false;
 492}
 493
 494static void hif_usb_sta_drain(void *hif_handle, u8 idx)
 495{
 496        struct hif_device_usb *hif_dev = hif_handle;
 497        struct sk_buff *skb, *tmp;
 498        unsigned long flags;
 499
 500        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 501
 502        skb_queue_walk_safe(&hif_dev->tx.tx_skb_queue, skb, tmp) {
 503                if (check_index(skb, idx)) {
 504                        __skb_unlink(skb, &hif_dev->tx.tx_skb_queue);
 505                        ath9k_htc_txcompletion_cb(hif_dev->htc_handle,
 506                                                  skb, false);
 507                        hif_dev->tx.tx_skb_cnt--;
 508                        TX_STAT_INC(skb_failed);
 509                }
 510        }
 511
 512        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 513}
 514
 515static struct ath9k_htc_hif hif_usb = {
 516        .transport = ATH9K_HIF_USB,
 517        .name = "ath9k_hif_usb",
 518
 519        .control_ul_pipe = USB_REG_OUT_PIPE,
 520        .control_dl_pipe = USB_REG_IN_PIPE,
 521
 522        .start = hif_usb_start,
 523        .stop = hif_usb_stop,
 524        .sta_drain = hif_usb_sta_drain,
 525        .send = hif_usb_send,
 526};
 527
 528static void ath9k_hif_usb_rx_stream(struct hif_device_usb *hif_dev,
 529                                    struct sk_buff *skb)
 530{
 531        struct sk_buff *nskb, *skb_pool[MAX_PKT_NUM_IN_TRANSFER];
 532        int index = 0, i, len = skb->len;
 533        int rx_remain_len, rx_pkt_len;
 534        u16 pool_index = 0;
 535        u8 *ptr;
 536
 537        spin_lock(&hif_dev->rx_lock);
 538
 539        rx_remain_len = hif_dev->rx_remain_len;
 540        rx_pkt_len = hif_dev->rx_transfer_len;
 541
 542        if (rx_remain_len != 0) {
 543                struct sk_buff *remain_skb = hif_dev->remain_skb;
 544
 545                if (remain_skb) {
 546                        ptr = (u8 *) remain_skb->data;
 547
 548                        index = rx_remain_len;
 549                        rx_remain_len -= hif_dev->rx_pad_len;
 550                        ptr += rx_pkt_len;
 551
 552                        memcpy(ptr, skb->data, rx_remain_len);
 553
 554                        rx_pkt_len += rx_remain_len;
 555                        hif_dev->rx_remain_len = 0;
 556                        skb_put(remain_skb, rx_pkt_len);
 557
 558                        skb_pool[pool_index++] = remain_skb;
 559
 560                } else {
 561                        index = rx_remain_len;
 562                }
 563        }
 564
 565        spin_unlock(&hif_dev->rx_lock);
 566
 567        while (index < len) {
 568                u16 pkt_len;
 569                u16 pkt_tag;
 570                u16 pad_len;
 571                int chk_idx;
 572
 573                ptr = (u8 *) skb->data;
 574
 575                pkt_len = get_unaligned_le16(ptr + index);
 576                pkt_tag = get_unaligned_le16(ptr + index + 2);
 577
 578                if (pkt_tag != ATH_USB_RX_STREAM_MODE_TAG) {
 579                        RX_STAT_INC(skb_dropped);
 580                        return;
 581                }
 582
 583                pad_len = 4 - (pkt_len & 0x3);
 584                if (pad_len == 4)
 585                        pad_len = 0;
 586
 587                chk_idx = index;
 588                index = index + 4 + pkt_len + pad_len;
 589
 590                if (index > MAX_RX_BUF_SIZE) {
 591                        spin_lock(&hif_dev->rx_lock);
 592                        hif_dev->rx_remain_len = index - MAX_RX_BUF_SIZE;
 593                        hif_dev->rx_transfer_len =
 594                                MAX_RX_BUF_SIZE - chk_idx - 4;
 595                        hif_dev->rx_pad_len = pad_len;
 596
 597                        nskb = __dev_alloc_skb(pkt_len + 32, GFP_ATOMIC);
 598                        if (!nskb) {
 599                                dev_err(&hif_dev->udev->dev,
 600                                        "ath9k_htc: RX memory allocation error\n");
 601                                spin_unlock(&hif_dev->rx_lock);
 602                                goto err;
 603                        }
 604                        skb_reserve(nskb, 32);
 605                        RX_STAT_INC(skb_allocated);
 606
 607                        memcpy(nskb->data, &(skb->data[chk_idx+4]),
 608                               hif_dev->rx_transfer_len);
 609
 610                        /* Record the buffer pointer */
 611                        hif_dev->remain_skb = nskb;
 612                        spin_unlock(&hif_dev->rx_lock);
 613                } else {
 614                        nskb = __dev_alloc_skb(pkt_len + 32, GFP_ATOMIC);
 615                        if (!nskb) {
 616                                dev_err(&hif_dev->udev->dev,
 617                                        "ath9k_htc: RX memory allocation error\n");
 618                                goto err;
 619                        }
 620                        skb_reserve(nskb, 32);
 621                        RX_STAT_INC(skb_allocated);
 622
 623                        memcpy(nskb->data, &(skb->data[chk_idx+4]), pkt_len);
 624                        skb_put(nskb, pkt_len);
 625                        skb_pool[pool_index++] = nskb;
 626                }
 627        }
 628
 629err:
 630        for (i = 0; i < pool_index; i++) {
 631                RX_STAT_ADD(skb_completed_bytes, skb_pool[i]->len);
 632                ath9k_htc_rx_msg(hif_dev->htc_handle, skb_pool[i],
 633                                 skb_pool[i]->len, USB_WLAN_RX_PIPE);
 634                RX_STAT_INC(skb_completed);
 635        }
 636}
 637
 638static void ath9k_hif_usb_rx_cb(struct urb *urb)
 639{
 640        struct sk_buff *skb = (struct sk_buff *) urb->context;
 641        struct hif_device_usb *hif_dev =
 642                usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
 643        int ret;
 644
 645        if (!skb)
 646                return;
 647
 648        if (!hif_dev)
 649                goto free;
 650
 651        switch (urb->status) {
 652        case 0:
 653                break;
 654        case -ENOENT:
 655        case -ECONNRESET:
 656        case -ENODEV:
 657        case -ESHUTDOWN:
 658                goto free;
 659        default:
 660                goto resubmit;
 661        }
 662
 663        if (likely(urb->actual_length != 0)) {
 664                skb_put(skb, urb->actual_length);
 665                ath9k_hif_usb_rx_stream(hif_dev, skb);
 666        }
 667
 668resubmit:
 669        skb_reset_tail_pointer(skb);
 670        skb_trim(skb, 0);
 671
 672        usb_anchor_urb(urb, &hif_dev->rx_submitted);
 673        ret = usb_submit_urb(urb, GFP_ATOMIC);
 674        if (ret) {
 675                usb_unanchor_urb(urb);
 676                goto free;
 677        }
 678
 679        return;
 680free:
 681        kfree_skb(skb);
 682}
 683
 684static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
 685{
 686        struct sk_buff *skb = (struct sk_buff *) urb->context;
 687        struct sk_buff *nskb;
 688        struct hif_device_usb *hif_dev =
 689                usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
 690        int ret;
 691
 692        if (!skb)
 693                return;
 694
 695        if (!hif_dev)
 696                goto free;
 697
 698        switch (urb->status) {
 699        case 0:
 700                break;
 701        case -ENOENT:
 702        case -ECONNRESET:
 703        case -ENODEV:
 704        case -ESHUTDOWN:
 705                goto free;
 706        default:
 707                skb_reset_tail_pointer(skb);
 708                skb_trim(skb, 0);
 709
 710                goto resubmit;
 711        }
 712
 713        if (likely(urb->actual_length != 0)) {
 714                skb_put(skb, urb->actual_length);
 715
 716                /* Process the command first */
 717                ath9k_htc_rx_msg(hif_dev->htc_handle, skb,
 718                                 skb->len, USB_REG_IN_PIPE);
 719
 720
 721                nskb = alloc_skb(MAX_REG_IN_BUF_SIZE, GFP_ATOMIC);
 722                if (!nskb) {
 723                        dev_err(&hif_dev->udev->dev,
 724                                "ath9k_htc: REG_IN memory allocation failure\n");
 725                        urb->context = NULL;
 726                        return;
 727                }
 728
 729                usb_fill_int_urb(urb, hif_dev->udev,
 730                                 usb_rcvintpipe(hif_dev->udev,
 731                                                 USB_REG_IN_PIPE),
 732                                 nskb->data, MAX_REG_IN_BUF_SIZE,
 733                                 ath9k_hif_usb_reg_in_cb, nskb, 1);
 734        }
 735
 736resubmit:
 737        usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
 738        ret = usb_submit_urb(urb, GFP_ATOMIC);
 739        if (ret) {
 740                usb_unanchor_urb(urb);
 741                goto free;
 742        }
 743
 744        return;
 745free:
 746        kfree_skb(skb);
 747        urb->context = NULL;
 748}
 749
 750static void ath9k_hif_usb_dealloc_tx_urbs(struct hif_device_usb *hif_dev)
 751{
 752        struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL;
 753        unsigned long flags;
 754
 755        list_for_each_entry_safe(tx_buf, tx_buf_tmp,
 756                                 &hif_dev->tx.tx_buf, list) {
 757                usb_kill_urb(tx_buf->urb);
 758                list_del(&tx_buf->list);
 759                usb_free_urb(tx_buf->urb);
 760                kfree(tx_buf->buf);
 761                kfree(tx_buf);
 762        }
 763
 764        spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 765        hif_dev->tx.flags |= HIF_USB_TX_FLUSH;
 766        spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 767
 768        list_for_each_entry_safe(tx_buf, tx_buf_tmp,
 769                                 &hif_dev->tx.tx_pending, list) {
 770                usb_kill_urb(tx_buf->urb);
 771                list_del(&tx_buf->list);
 772                usb_free_urb(tx_buf->urb);
 773                kfree(tx_buf->buf);
 774                kfree(tx_buf);
 775        }
 776
 777        usb_kill_anchored_urbs(&hif_dev->mgmt_submitted);
 778}
 779
 780static int ath9k_hif_usb_alloc_tx_urbs(struct hif_device_usb *hif_dev)
 781{
 782        struct tx_buf *tx_buf;
 783        int i;
 784
 785        INIT_LIST_HEAD(&hif_dev->tx.tx_buf);
 786        INIT_LIST_HEAD(&hif_dev->tx.tx_pending);
 787        spin_lock_init(&hif_dev->tx.tx_lock);
 788        __skb_queue_head_init(&hif_dev->tx.tx_skb_queue);
 789        init_usb_anchor(&hif_dev->mgmt_submitted);
 790
 791        for (i = 0; i < MAX_TX_URB_NUM; i++) {
 792                tx_buf = kzalloc(sizeof(struct tx_buf), GFP_KERNEL);
 793                if (!tx_buf)
 794                        goto err;
 795
 796                tx_buf->buf = kzalloc(MAX_TX_BUF_SIZE, GFP_KERNEL);
 797                if (!tx_buf->buf)
 798                        goto err;
 799
 800                tx_buf->urb = usb_alloc_urb(0, GFP_KERNEL);
 801                if (!tx_buf->urb)
 802                        goto err;
 803
 804                tx_buf->hif_dev = hif_dev;
 805                __skb_queue_head_init(&tx_buf->skb_queue);
 806
 807                list_add_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
 808        }
 809
 810        hif_dev->tx.tx_buf_cnt = MAX_TX_URB_NUM;
 811
 812        return 0;
 813err:
 814        if (tx_buf) {
 815                kfree(tx_buf->buf);
 816                kfree(tx_buf);
 817        }
 818        ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
 819        return -ENOMEM;
 820}
 821
 822static void ath9k_hif_usb_dealloc_rx_urbs(struct hif_device_usb *hif_dev)
 823{
 824        usb_kill_anchored_urbs(&hif_dev->rx_submitted);
 825}
 826
 827static int ath9k_hif_usb_alloc_rx_urbs(struct hif_device_usb *hif_dev)
 828{
 829        struct urb *urb = NULL;
 830        struct sk_buff *skb = NULL;
 831        int i, ret;
 832
 833        init_usb_anchor(&hif_dev->rx_submitted);
 834        spin_lock_init(&hif_dev->rx_lock);
 835
 836        for (i = 0; i < MAX_RX_URB_NUM; i++) {
 837
 838                /* Allocate URB */
 839                urb = usb_alloc_urb(0, GFP_KERNEL);
 840                if (urb == NULL) {
 841                        ret = -ENOMEM;
 842                        goto err_urb;
 843                }
 844
 845                /* Allocate buffer */
 846                skb = alloc_skb(MAX_RX_BUF_SIZE, GFP_KERNEL);
 847                if (!skb) {
 848                        ret = -ENOMEM;
 849                        goto err_skb;
 850                }
 851
 852                usb_fill_bulk_urb(urb, hif_dev->udev,
 853                                  usb_rcvbulkpipe(hif_dev->udev,
 854                                                  USB_WLAN_RX_PIPE),
 855                                  skb->data, MAX_RX_BUF_SIZE,
 856                                  ath9k_hif_usb_rx_cb, skb);
 857
 858                /* Anchor URB */
 859                usb_anchor_urb(urb, &hif_dev->rx_submitted);
 860
 861                /* Submit URB */
 862                ret = usb_submit_urb(urb, GFP_KERNEL);
 863                if (ret) {
 864                        usb_unanchor_urb(urb);
 865                        goto err_submit;
 866                }
 867
 868                /*
 869                 * Drop reference count.
 870                 * This ensures that the URB is freed when killing them.
 871                 */
 872                usb_free_urb(urb);
 873        }
 874
 875        return 0;
 876
 877err_submit:
 878        kfree_skb(skb);
 879err_skb:
 880        usb_free_urb(urb);
 881err_urb:
 882        ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 883        return ret;
 884}
 885
 886static void ath9k_hif_usb_dealloc_reg_in_urbs(struct hif_device_usb *hif_dev)
 887{
 888        usb_kill_anchored_urbs(&hif_dev->reg_in_submitted);
 889}
 890
 891static int ath9k_hif_usb_alloc_reg_in_urbs(struct hif_device_usb *hif_dev)
 892{
 893        struct urb *urb = NULL;
 894        struct sk_buff *skb = NULL;
 895        int i, ret;
 896
 897        init_usb_anchor(&hif_dev->reg_in_submitted);
 898
 899        for (i = 0; i < MAX_REG_IN_URB_NUM; i++) {
 900
 901                /* Allocate URB */
 902                urb = usb_alloc_urb(0, GFP_KERNEL);
 903                if (urb == NULL) {
 904                        ret = -ENOMEM;
 905                        goto err_urb;
 906                }
 907
 908                /* Allocate buffer */
 909                skb = alloc_skb(MAX_REG_IN_BUF_SIZE, GFP_KERNEL);
 910                if (!skb) {
 911                        ret = -ENOMEM;
 912                        goto err_skb;
 913                }
 914
 915                usb_fill_int_urb(urb, hif_dev->udev,
 916                                  usb_rcvintpipe(hif_dev->udev,
 917                                                  USB_REG_IN_PIPE),
 918                                  skb->data, MAX_REG_IN_BUF_SIZE,
 919                                  ath9k_hif_usb_reg_in_cb, skb, 1);
 920
 921                /* Anchor URB */
 922                usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
 923
 924                /* Submit URB */
 925                ret = usb_submit_urb(urb, GFP_KERNEL);
 926                if (ret) {
 927                        usb_unanchor_urb(urb);
 928                        goto err_submit;
 929                }
 930
 931                /*
 932                 * Drop reference count.
 933                 * This ensures that the URB is freed when killing them.
 934                 */
 935                usb_free_urb(urb);
 936        }
 937
 938        return 0;
 939
 940err_submit:
 941        kfree_skb(skb);
 942err_skb:
 943        usb_free_urb(urb);
 944err_urb:
 945        ath9k_hif_usb_dealloc_reg_in_urbs(hif_dev);
 946        return ret;
 947}
 948
 949static int ath9k_hif_usb_alloc_urbs(struct hif_device_usb *hif_dev)
 950{
 951        /* Register Write */
 952        init_usb_anchor(&hif_dev->regout_submitted);
 953
 954        /* TX */
 955        if (ath9k_hif_usb_alloc_tx_urbs(hif_dev) < 0)
 956                goto err;
 957
 958        /* RX */
 959        if (ath9k_hif_usb_alloc_rx_urbs(hif_dev) < 0)
 960                goto err_rx;
 961
 962        /* Register Read */
 963        if (ath9k_hif_usb_alloc_reg_in_urbs(hif_dev) < 0)
 964                goto err_reg;
 965
 966        return 0;
 967err_reg:
 968        ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 969err_rx:
 970        ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
 971err:
 972        return -ENOMEM;
 973}
 974
 975static void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev)
 976{
 977        usb_kill_anchored_urbs(&hif_dev->regout_submitted);
 978        ath9k_hif_usb_dealloc_reg_in_urbs(hif_dev);
 979        ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
 980        ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 981}
 982
 983static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
 984{
 985        int transfer, err;
 986        const void *data = hif_dev->fw_data;
 987        size_t len = hif_dev->fw_size;
 988        u32 addr = AR9271_FIRMWARE;
 989        u8 *buf = kzalloc(4096, GFP_KERNEL);
 990        u32 firm_offset;
 991
 992        if (!buf)
 993                return -ENOMEM;
 994
 995        while (len) {
 996                transfer = min_t(size_t, len, 4096);
 997                memcpy(buf, data, transfer);
 998
 999                err = usb_control_msg(hif_dev->udev,
1000                                      usb_sndctrlpipe(hif_dev->udev, 0),
1001                                      FIRMWARE_DOWNLOAD, 0x40 | USB_DIR_OUT,
1002                                      addr >> 8, 0, buf, transfer,
1003                                      USB_MSG_TIMEOUT);
1004                if (err < 0) {
1005                        kfree(buf);
1006                        return err;
1007                }
1008
1009                len -= transfer;
1010                data += transfer;
1011                addr += transfer;
1012        }
1013        kfree(buf);
1014
1015        if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1016                firm_offset = AR7010_FIRMWARE_TEXT;
1017        else
1018                firm_offset = AR9271_FIRMWARE_TEXT;
1019
1020        /*
1021         * Issue FW download complete command to firmware.
1022         */
1023        err = usb_control_msg(hif_dev->udev, usb_sndctrlpipe(hif_dev->udev, 0),
1024                              FIRMWARE_DOWNLOAD_COMP,
1025                              0x40 | USB_DIR_OUT,
1026                              firm_offset >> 8, 0, NULL, 0, USB_MSG_TIMEOUT);
1027        if (err)
1028                return -EIO;
1029
1030        dev_info(&hif_dev->udev->dev, "ath9k_htc: Transferred FW: %s, size: %ld\n",
1031                 hif_dev->fw_name, (unsigned long) hif_dev->fw_size);
1032
1033        return 0;
1034}
1035
1036static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
1037{
1038        int ret;
1039
1040        ret = ath9k_hif_usb_download_fw(hif_dev);
1041        if (ret) {
1042                dev_err(&hif_dev->udev->dev,
1043                        "ath9k_htc: Firmware - %s download failed\n",
1044                        hif_dev->fw_name);
1045                return ret;
1046        }
1047
1048        /* Alloc URBs */
1049        ret = ath9k_hif_usb_alloc_urbs(hif_dev);
1050        if (ret) {
1051                dev_err(&hif_dev->udev->dev,
1052                        "ath9k_htc: Unable to allocate URBs\n");
1053                return ret;
1054        }
1055
1056        return 0;
1057}
1058
1059static void ath9k_hif_usb_dev_deinit(struct hif_device_usb *hif_dev)
1060{
1061        ath9k_hif_usb_dealloc_urbs(hif_dev);
1062}
1063
1064/*
1065 * If initialization fails or the FW cannot be retrieved,
1066 * detach the device.
1067 */
1068static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
1069{
1070        struct device *dev = &hif_dev->udev->dev;
1071        struct device *parent = dev->parent;
1072
1073        complete_all(&hif_dev->fw_done);
1074
1075        if (parent)
1076                device_lock(parent);
1077
1078        device_release_driver(dev);
1079
1080        if (parent)
1081                device_unlock(parent);
1082}
1083
1084static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context);
1085
1086/* taken from iwlwifi */
1087static int ath9k_hif_request_firmware(struct hif_device_usb *hif_dev,
1088                                      bool first)
1089{
1090        char index[8], *chip;
1091        int ret;
1092
1093        if (first) {
1094                if (htc_use_dev_fw) {
1095                        hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX + 1;
1096                        sprintf(index, "%s", "dev");
1097                } else {
1098                        hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX;
1099                        sprintf(index, "%d", hif_dev->fw_minor_index);
1100                }
1101        } else {
1102                hif_dev->fw_minor_index--;
1103                sprintf(index, "%d", hif_dev->fw_minor_index);
1104        }
1105
1106        /* test for FW 1.3 */
1107        if (MAJOR_VERSION_REQ == 1 && hif_dev->fw_minor_index == 3) {
1108                const char *filename;
1109
1110                if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1111                        filename = FIRMWARE_AR7010_1_1;
1112                else
1113                        filename = FIRMWARE_AR9271;
1114
1115                /* expected fw locations:
1116                 * - htc_9271.fw   (stable version 1.3, depricated)
1117                 */
1118                snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
1119                         "%s", filename);
1120
1121        } else if (hif_dev->fw_minor_index < FIRMWARE_MINOR_IDX_MIN) {
1122                dev_err(&hif_dev->udev->dev, "no suitable firmware found!\n");
1123
1124                return -ENOENT;
1125        } else {
1126                if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1127                        chip = "7010";
1128                else
1129                        chip = "9271";
1130
1131                /* expected fw locations:
1132                 * - ath9k_htc/htc_9271-1.dev.0.fw (development version)
1133                 * - ath9k_htc/htc_9271-1.4.0.fw   (stable version)
1134                 */
1135                snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
1136                         "%s/htc_%s-%d.%s.0.fw", HTC_FW_PATH,
1137                         chip, MAJOR_VERSION_REQ, index);
1138        }
1139
1140        ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
1141                                      &hif_dev->udev->dev, GFP_KERNEL,
1142                                      hif_dev, ath9k_hif_usb_firmware_cb);
1143        if (ret) {
1144                dev_err(&hif_dev->udev->dev,
1145                        "ath9k_htc: Async request for firmware %s failed\n",
1146                        hif_dev->fw_name);
1147                return ret;
1148        }
1149
1150        dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
1151                 hif_dev->fw_name);
1152
1153        return ret;
1154}
1155
1156static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
1157{
1158        struct hif_device_usb *hif_dev = context;
1159        int ret;
1160
1161        if (!fw) {
1162                ret = ath9k_hif_request_firmware(hif_dev, false);
1163                if (!ret)
1164                        return;
1165
1166                dev_err(&hif_dev->udev->dev,
1167                        "ath9k_htc: Failed to get firmware %s\n",
1168                        hif_dev->fw_name);
1169                goto err_fw;
1170        }
1171
1172        hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
1173                                                 &hif_dev->udev->dev);
1174        if (hif_dev->htc_handle == NULL)
1175                goto err_dev_alloc;
1176
1177        hif_dev->fw_data = fw->data;
1178        hif_dev->fw_size = fw->size;
1179
1180        /* Proceed with initialization */
1181
1182        ret = ath9k_hif_usb_dev_init(hif_dev);
1183        if (ret)
1184                goto err_dev_init;
1185
1186        ret = ath9k_htc_hw_init(hif_dev->htc_handle,
1187                                &hif_dev->interface->dev,
1188                                hif_dev->usb_device_id->idProduct,
1189                                hif_dev->udev->product,
1190                                hif_dev->usb_device_id->driver_info);
1191        if (ret) {
1192                ret = -EINVAL;
1193                goto err_htc_hw_init;
1194        }
1195
1196        release_firmware(fw);
1197        hif_dev->flags |= HIF_USB_READY;
1198        complete_all(&hif_dev->fw_done);
1199
1200        return;
1201
1202err_htc_hw_init:
1203        ath9k_hif_usb_dev_deinit(hif_dev);
1204err_dev_init:
1205        ath9k_htc_hw_free(hif_dev->htc_handle);
1206err_dev_alloc:
1207        release_firmware(fw);
1208err_fw:
1209        ath9k_hif_usb_firmware_fail(hif_dev);
1210}
1211
1212/*
1213 * An exact copy of the function from zd1211rw.
1214 */
1215static int send_eject_command(struct usb_interface *interface)
1216{
1217        struct usb_device *udev = interface_to_usbdev(interface);
1218        struct usb_host_interface *iface_desc = &interface->altsetting[0];
1219        struct usb_endpoint_descriptor *endpoint;
1220        unsigned char *cmd;
1221        u8 bulk_out_ep;
1222        int r;
1223
1224        if (iface_desc->desc.bNumEndpoints < 2)
1225                return -ENODEV;
1226
1227        /* Find bulk out endpoint */
1228        for (r = 1; r >= 0; r--) {
1229                endpoint = &iface_desc->endpoint[r].desc;
1230                if (usb_endpoint_dir_out(endpoint) &&
1231                    usb_endpoint_xfer_bulk(endpoint)) {
1232                        bulk_out_ep = endpoint->bEndpointAddress;
1233                        break;
1234                }
1235        }
1236        if (r == -1) {
1237                dev_err(&udev->dev,
1238                        "ath9k_htc: Could not find bulk out endpoint\n");
1239                return -ENODEV;
1240        }
1241
1242        cmd = kzalloc(31, GFP_KERNEL);
1243        if (cmd == NULL)
1244                return -ENODEV;
1245
1246        /* USB bulk command block */
1247        cmd[0] = 0x55;  /* bulk command signature */
1248        cmd[1] = 0x53;  /* bulk command signature */
1249        cmd[2] = 0x42;  /* bulk command signature */
1250        cmd[3] = 0x43;  /* bulk command signature */
1251        cmd[14] = 6;    /* command length */
1252
1253        cmd[15] = 0x1b; /* SCSI command: START STOP UNIT */
1254        cmd[19] = 0x2;  /* eject disc */
1255
1256        dev_info(&udev->dev, "Ejecting storage device...\n");
1257        r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, bulk_out_ep),
1258                cmd, 31, NULL, 2 * USB_MSG_TIMEOUT);
1259        kfree(cmd);
1260        if (r)
1261                return r;
1262
1263        /* At this point, the device disconnects and reconnects with the real
1264         * ID numbers. */
1265
1266        usb_set_intfdata(interface, NULL);
1267        return 0;
1268}
1269
1270static int ath9k_hif_usb_probe(struct usb_interface *interface,
1271                               const struct usb_device_id *id)
1272{
1273        struct usb_device *udev = interface_to_usbdev(interface);
1274        struct hif_device_usb *hif_dev;
1275        int ret = 0;
1276
1277        if (id->driver_info == STORAGE_DEVICE)
1278                return send_eject_command(interface);
1279
1280        hif_dev = kzalloc(sizeof(struct hif_device_usb), GFP_KERNEL);
1281        if (!hif_dev) {
1282                ret = -ENOMEM;
1283                goto err_alloc;
1284        }
1285
1286        usb_get_dev(udev);
1287
1288        hif_dev->udev = udev;
1289        hif_dev->interface = interface;
1290        hif_dev->usb_device_id = id;
1291#ifdef CONFIG_PM
1292        udev->reset_resume = 1;
1293#endif
1294        usb_set_intfdata(interface, hif_dev);
1295
1296        init_completion(&hif_dev->fw_done);
1297
1298        ret = ath9k_hif_request_firmware(hif_dev, true);
1299        if (ret)
1300                goto err_fw_req;
1301
1302        return ret;
1303
1304err_fw_req:
1305        usb_set_intfdata(interface, NULL);
1306        kfree(hif_dev);
1307        usb_put_dev(udev);
1308err_alloc:
1309        return ret;
1310}
1311
1312static void ath9k_hif_usb_reboot(struct usb_device *udev)
1313{
1314        u32 reboot_cmd = 0xffffffff;
1315        void *buf;
1316        int ret;
1317
1318        buf = kmemdup(&reboot_cmd, 4, GFP_KERNEL);
1319        if (!buf)
1320                return;
1321
1322        ret = usb_interrupt_msg(udev, usb_sndintpipe(udev, USB_REG_OUT_PIPE),
1323                           buf, 4, NULL, USB_MSG_TIMEOUT);
1324        if (ret)
1325                dev_err(&udev->dev, "ath9k_htc: USB reboot failed\n");
1326
1327        kfree(buf);
1328}
1329
1330static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
1331{
1332        struct usb_device *udev = interface_to_usbdev(interface);
1333        struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1334        bool unplugged = (udev->state == USB_STATE_NOTATTACHED) ? true : false;
1335
1336        if (!hif_dev)
1337                return;
1338
1339        wait_for_completion(&hif_dev->fw_done);
1340
1341        if (hif_dev->flags & HIF_USB_READY) {
1342                ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
1343                ath9k_htc_hw_free(hif_dev->htc_handle);
1344                ath9k_hif_usb_dev_deinit(hif_dev);
1345        }
1346
1347        usb_set_intfdata(interface, NULL);
1348
1349        /* If firmware was loaded we should drop it
1350         * go back to first stage bootloader. */
1351        if (!unplugged && (hif_dev->flags & HIF_USB_READY))
1352                ath9k_hif_usb_reboot(udev);
1353
1354        kfree(hif_dev);
1355        dev_info(&udev->dev, "ath9k_htc: USB layer deinitialized\n");
1356        usb_put_dev(udev);
1357}
1358
1359#ifdef CONFIG_PM
1360static int ath9k_hif_usb_suspend(struct usb_interface *interface,
1361                                 pm_message_t message)
1362{
1363        struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1364
1365        /*
1366         * The device has to be set to FULLSLEEP mode in case no
1367         * interface is up.
1368         */
1369        if (!(hif_dev->flags & HIF_USB_START))
1370                ath9k_htc_suspend(hif_dev->htc_handle);
1371
1372        wait_for_completion(&hif_dev->fw_done);
1373
1374        if (hif_dev->flags & HIF_USB_READY)
1375                ath9k_hif_usb_dealloc_urbs(hif_dev);
1376
1377        return 0;
1378}
1379
1380static int ath9k_hif_usb_resume(struct usb_interface *interface)
1381{
1382        struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1383        struct htc_target *htc_handle = hif_dev->htc_handle;
1384        int ret;
1385        const struct firmware *fw;
1386
1387        ret = ath9k_hif_usb_alloc_urbs(hif_dev);
1388        if (ret)
1389                return ret;
1390
1391        if (hif_dev->flags & HIF_USB_READY) {
1392                /* request cached firmware during suspend/resume cycle */
1393                ret = request_firmware(&fw, hif_dev->fw_name,
1394                                       &hif_dev->udev->dev);
1395                if (ret)
1396                        goto fail_resume;
1397
1398                hif_dev->fw_data = fw->data;
1399                hif_dev->fw_size = fw->size;
1400                ret = ath9k_hif_usb_download_fw(hif_dev);
1401                release_firmware(fw);
1402                if (ret)
1403                        goto fail_resume;
1404        } else {
1405                ath9k_hif_usb_dealloc_urbs(hif_dev);
1406                return -EIO;
1407        }
1408
1409        mdelay(100);
1410
1411        ret = ath9k_htc_resume(htc_handle);
1412
1413        if (ret)
1414                goto fail_resume;
1415
1416        return 0;
1417
1418fail_resume:
1419        ath9k_hif_usb_dealloc_urbs(hif_dev);
1420
1421        return ret;
1422}
1423#endif
1424
1425static struct usb_driver ath9k_hif_usb_driver = {
1426        .name = KBUILD_MODNAME,
1427        .probe = ath9k_hif_usb_probe,
1428        .disconnect = ath9k_hif_usb_disconnect,
1429#ifdef CONFIG_PM
1430        .suspend = ath9k_hif_usb_suspend,
1431        .resume = ath9k_hif_usb_resume,
1432        .reset_resume = ath9k_hif_usb_resume,
1433#endif
1434        .id_table = ath9k_hif_usb_ids,
1435        .soft_unbind = 1,
1436        .disable_hub_initiated_lpm = 1,
1437};
1438
1439int ath9k_hif_usb_init(void)
1440{
1441        return usb_register(&ath9k_hif_usb_driver);
1442}
1443
1444void ath9k_hif_usb_exit(void)
1445{
1446        usb_deregister(&ath9k_hif_usb_driver);
1447}
1448