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