root/drivers/net/wireless/ath/ath9k/hif_usb.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. hif_usb_regout_cb
  2. hif_usb_send_regout
  3. hif_usb_mgmt_cb
  4. hif_usb_send_mgmt
  5. ath9k_skb_queue_purge
  6. ath9k_skb_queue_complete
  7. hif_usb_tx_cb
  8. __hif_usb_tx
  9. hif_usb_send_tx
  10. hif_usb_start
  11. hif_usb_stop
  12. hif_usb_send
  13. check_index
  14. hif_usb_sta_drain
  15. ath9k_hif_usb_rx_stream
  16. ath9k_hif_usb_rx_cb
  17. ath9k_hif_usb_reg_in_cb
  18. ath9k_hif_usb_dealloc_tx_urbs
  19. ath9k_hif_usb_alloc_tx_urbs
  20. ath9k_hif_usb_dealloc_rx_urbs
  21. ath9k_hif_usb_alloc_rx_urbs
  22. ath9k_hif_usb_dealloc_reg_in_urbs
  23. ath9k_hif_usb_alloc_reg_in_urbs
  24. ath9k_hif_usb_alloc_urbs
  25. ath9k_hif_usb_dealloc_urbs
  26. ath9k_hif_usb_download_fw
  27. ath9k_hif_usb_dev_init
  28. ath9k_hif_usb_dev_deinit
  29. ath9k_hif_usb_firmware_fail
  30. ath9k_hif_request_firmware
  31. ath9k_hif_usb_firmware_cb
  32. send_eject_command
  33. ath9k_hif_usb_probe
  34. ath9k_hif_usb_reboot
  35. ath9k_hif_usb_disconnect
  36. ath9k_hif_usb_suspend
  37. ath9k_hif_usb_resume
  38. ath9k_hif_usb_init
  39. ath9k_hif_usb_exit

   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 
  20 MODULE_FIRMWARE(HTC_7010_MODULE_FW);
  21 MODULE_FIRMWARE(HTC_9271_MODULE_FW);
  22 
  23 static 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 
  69 MODULE_DEVICE_TABLE(usb, ath9k_hif_usb_ids);
  70 
  71 static int __hif_usb_tx(struct hif_device_usb *hif_dev);
  72 
  73 static 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;
  96 free:
  97         kfree_skb(cmd->skb);
  98         kfree(cmd);
  99 }
 100 
 101 static 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 
 137 static 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 
 183 static 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 
 224 static 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 
 234 static 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 
 255 static 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 */
 310 static 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 
 379 static 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 
 427 static 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 
 439 static 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 
 460 static 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 
 482 static 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 
 495 static 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 
 516 static 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 
 529 static 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 
 635 err:
 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 
 644 static 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 
 674 resubmit:
 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;
 686 free:
 687         kfree_skb(skb);
 688         kfree(rx_buf);
 689 }
 690 
 691 static 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                 usb_fill_int_urb(urb, hif_dev->udev,
 737                                  usb_rcvintpipe(hif_dev->udev,
 738                                                  USB_REG_IN_PIPE),
 739                                  nskb->data, MAX_REG_IN_BUF_SIZE,
 740                                  ath9k_hif_usb_reg_in_cb, nskb, 1);
 741         }
 742 
 743 resubmit:
 744         usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
 745         ret = usb_submit_urb(urb, GFP_ATOMIC);
 746         if (ret) {
 747                 usb_unanchor_urb(urb);
 748                 goto free;
 749         }
 750 
 751         return;
 752 free:
 753         kfree_skb(skb);
 754         kfree(rx_buf);
 755         urb->context = NULL;
 756 }
 757 
 758 static void ath9k_hif_usb_dealloc_tx_urbs(struct hif_device_usb *hif_dev)
 759 {
 760         struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL;
 761         unsigned long flags;
 762 
 763         list_for_each_entry_safe(tx_buf, tx_buf_tmp,
 764                                  &hif_dev->tx.tx_buf, list) {
 765                 usb_kill_urb(tx_buf->urb);
 766                 list_del(&tx_buf->list);
 767                 usb_free_urb(tx_buf->urb);
 768                 kfree(tx_buf->buf);
 769                 kfree(tx_buf);
 770         }
 771 
 772         spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
 773         hif_dev->tx.flags |= HIF_USB_TX_FLUSH;
 774         spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
 775 
 776         list_for_each_entry_safe(tx_buf, tx_buf_tmp,
 777                                  &hif_dev->tx.tx_pending, list) {
 778                 usb_kill_urb(tx_buf->urb);
 779                 list_del(&tx_buf->list);
 780                 usb_free_urb(tx_buf->urb);
 781                 kfree(tx_buf->buf);
 782                 kfree(tx_buf);
 783         }
 784 
 785         usb_kill_anchored_urbs(&hif_dev->mgmt_submitted);
 786 }
 787 
 788 static int ath9k_hif_usb_alloc_tx_urbs(struct hif_device_usb *hif_dev)
 789 {
 790         struct tx_buf *tx_buf;
 791         int i;
 792 
 793         INIT_LIST_HEAD(&hif_dev->tx.tx_buf);
 794         INIT_LIST_HEAD(&hif_dev->tx.tx_pending);
 795         spin_lock_init(&hif_dev->tx.tx_lock);
 796         __skb_queue_head_init(&hif_dev->tx.tx_skb_queue);
 797         init_usb_anchor(&hif_dev->mgmt_submitted);
 798 
 799         for (i = 0; i < MAX_TX_URB_NUM; i++) {
 800                 tx_buf = kzalloc(sizeof(*tx_buf), GFP_KERNEL);
 801                 if (!tx_buf)
 802                         goto err;
 803 
 804                 tx_buf->buf = kzalloc(MAX_TX_BUF_SIZE, GFP_KERNEL);
 805                 if (!tx_buf->buf)
 806                         goto err;
 807 
 808                 tx_buf->urb = usb_alloc_urb(0, GFP_KERNEL);
 809                 if (!tx_buf->urb)
 810                         goto err;
 811 
 812                 tx_buf->hif_dev = hif_dev;
 813                 __skb_queue_head_init(&tx_buf->skb_queue);
 814 
 815                 list_add_tail(&tx_buf->list, &hif_dev->tx.tx_buf);
 816         }
 817 
 818         hif_dev->tx.tx_buf_cnt = MAX_TX_URB_NUM;
 819 
 820         return 0;
 821 err:
 822         if (tx_buf) {
 823                 kfree(tx_buf->buf);
 824                 kfree(tx_buf);
 825         }
 826         ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
 827         return -ENOMEM;
 828 }
 829 
 830 static void ath9k_hif_usb_dealloc_rx_urbs(struct hif_device_usb *hif_dev)
 831 {
 832         usb_kill_anchored_urbs(&hif_dev->rx_submitted);
 833 }
 834 
 835 static int ath9k_hif_usb_alloc_rx_urbs(struct hif_device_usb *hif_dev)
 836 {
 837         struct rx_buf *rx_buf = NULL;
 838         struct sk_buff *skb = NULL;
 839         struct urb *urb = NULL;
 840         int i, ret;
 841 
 842         init_usb_anchor(&hif_dev->rx_submitted);
 843         spin_lock_init(&hif_dev->rx_lock);
 844 
 845         for (i = 0; i < MAX_RX_URB_NUM; i++) {
 846 
 847                 rx_buf = kzalloc(sizeof(*rx_buf), GFP_KERNEL);
 848                 if (!rx_buf) {
 849                         ret = -ENOMEM;
 850                         goto err_rxb;
 851                 }
 852 
 853                 /* Allocate URB */
 854                 urb = usb_alloc_urb(0, GFP_KERNEL);
 855                 if (urb == NULL) {
 856                         ret = -ENOMEM;
 857                         goto err_urb;
 858                 }
 859 
 860                 /* Allocate buffer */
 861                 skb = alloc_skb(MAX_RX_BUF_SIZE, GFP_KERNEL);
 862                 if (!skb) {
 863                         ret = -ENOMEM;
 864                         goto err_skb;
 865                 }
 866 
 867                 rx_buf->hif_dev = hif_dev;
 868                 rx_buf->skb = skb;
 869 
 870                 usb_fill_bulk_urb(urb, hif_dev->udev,
 871                                   usb_rcvbulkpipe(hif_dev->udev,
 872                                                   USB_WLAN_RX_PIPE),
 873                                   skb->data, MAX_RX_BUF_SIZE,
 874                                   ath9k_hif_usb_rx_cb, rx_buf);
 875 
 876                 /* Anchor URB */
 877                 usb_anchor_urb(urb, &hif_dev->rx_submitted);
 878 
 879                 /* Submit URB */
 880                 ret = usb_submit_urb(urb, GFP_KERNEL);
 881                 if (ret) {
 882                         usb_unanchor_urb(urb);
 883                         goto err_submit;
 884                 }
 885 
 886                 /*
 887                  * Drop reference count.
 888                  * This ensures that the URB is freed when killing them.
 889                  */
 890                 usb_free_urb(urb);
 891         }
 892 
 893         return 0;
 894 
 895 err_submit:
 896         kfree_skb(skb);
 897 err_skb:
 898         usb_free_urb(urb);
 899 err_urb:
 900         kfree(rx_buf);
 901 err_rxb:
 902         ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
 903         return ret;
 904 }
 905 
 906 static void ath9k_hif_usb_dealloc_reg_in_urbs(struct hif_device_usb *hif_dev)
 907 {
 908         usb_kill_anchored_urbs(&hif_dev->reg_in_submitted);
 909 }
 910 
 911 static int ath9k_hif_usb_alloc_reg_in_urbs(struct hif_device_usb *hif_dev)
 912 {
 913         struct rx_buf *rx_buf = NULL;
 914         struct sk_buff *skb = NULL;
 915         struct urb *urb = NULL;
 916         int i, ret;
 917 
 918         init_usb_anchor(&hif_dev->reg_in_submitted);
 919 
 920         for (i = 0; i < MAX_REG_IN_URB_NUM; i++) {
 921 
 922                 rx_buf = kzalloc(sizeof(*rx_buf), GFP_KERNEL);
 923                 if (!rx_buf) {
 924                         ret = -ENOMEM;
 925                         goto err_rxb;
 926                 }
 927 
 928                 /* Allocate URB */
 929                 urb = usb_alloc_urb(0, GFP_KERNEL);
 930                 if (urb == NULL) {
 931                         ret = -ENOMEM;
 932                         goto err_urb;
 933                 }
 934 
 935                 /* Allocate buffer */
 936                 skb = alloc_skb(MAX_REG_IN_BUF_SIZE, GFP_KERNEL);
 937                 if (!skb) {
 938                         ret = -ENOMEM;
 939                         goto err_skb;
 940                 }
 941 
 942                 rx_buf->hif_dev = hif_dev;
 943                 rx_buf->skb = skb;
 944 
 945                 usb_fill_int_urb(urb, hif_dev->udev,
 946                                   usb_rcvintpipe(hif_dev->udev,
 947                                                   USB_REG_IN_PIPE),
 948                                   skb->data, MAX_REG_IN_BUF_SIZE,
 949                                   ath9k_hif_usb_reg_in_cb, rx_buf, 1);
 950 
 951                 /* Anchor URB */
 952                 usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
 953 
 954                 /* Submit URB */
 955                 ret = usb_submit_urb(urb, GFP_KERNEL);
 956                 if (ret) {
 957                         usb_unanchor_urb(urb);
 958                         goto err_submit;
 959                 }
 960 
 961                 /*
 962                  * Drop reference count.
 963                  * This ensures that the URB is freed when killing them.
 964                  */
 965                 usb_free_urb(urb);
 966         }
 967 
 968         return 0;
 969 
 970 err_submit:
 971         kfree_skb(skb);
 972 err_skb:
 973         usb_free_urb(urb);
 974 err_urb:
 975         kfree(rx_buf);
 976 err_rxb:
 977         ath9k_hif_usb_dealloc_reg_in_urbs(hif_dev);
 978         return ret;
 979 }
 980 
 981 static int ath9k_hif_usb_alloc_urbs(struct hif_device_usb *hif_dev)
 982 {
 983         /* Register Write */
 984         init_usb_anchor(&hif_dev->regout_submitted);
 985 
 986         /* TX */
 987         if (ath9k_hif_usb_alloc_tx_urbs(hif_dev) < 0)
 988                 goto err;
 989 
 990         /* RX */
 991         if (ath9k_hif_usb_alloc_rx_urbs(hif_dev) < 0)
 992                 goto err_rx;
 993 
 994         /* Register Read */
 995         if (ath9k_hif_usb_alloc_reg_in_urbs(hif_dev) < 0)
 996                 goto err_reg;
 997 
 998         return 0;
 999 err_reg:
1000         ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
1001 err_rx:
1002         ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
1003 err:
1004         return -ENOMEM;
1005 }
1006 
1007 void ath9k_hif_usb_dealloc_urbs(struct hif_device_usb *hif_dev)
1008 {
1009         usb_kill_anchored_urbs(&hif_dev->regout_submitted);
1010         ath9k_hif_usb_dealloc_reg_in_urbs(hif_dev);
1011         ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
1012         ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
1013 }
1014 
1015 static int ath9k_hif_usb_download_fw(struct hif_device_usb *hif_dev)
1016 {
1017         int transfer, err;
1018         const void *data = hif_dev->fw_data;
1019         size_t len = hif_dev->fw_size;
1020         u32 addr = AR9271_FIRMWARE;
1021         u8 *buf = kzalloc(4096, GFP_KERNEL);
1022         u32 firm_offset;
1023 
1024         if (!buf)
1025                 return -ENOMEM;
1026 
1027         while (len) {
1028                 transfer = min_t(size_t, len, 4096);
1029                 memcpy(buf, data, transfer);
1030 
1031                 err = usb_control_msg(hif_dev->udev,
1032                                       usb_sndctrlpipe(hif_dev->udev, 0),
1033                                       FIRMWARE_DOWNLOAD, 0x40 | USB_DIR_OUT,
1034                                       addr >> 8, 0, buf, transfer,
1035                                       USB_MSG_TIMEOUT);
1036                 if (err < 0) {
1037                         kfree(buf);
1038                         return err;
1039                 }
1040 
1041                 len -= transfer;
1042                 data += transfer;
1043                 addr += transfer;
1044         }
1045         kfree(buf);
1046 
1047         if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1048                 firm_offset = AR7010_FIRMWARE_TEXT;
1049         else
1050                 firm_offset = AR9271_FIRMWARE_TEXT;
1051 
1052         /*
1053          * Issue FW download complete command to firmware.
1054          */
1055         err = usb_control_msg(hif_dev->udev, usb_sndctrlpipe(hif_dev->udev, 0),
1056                               FIRMWARE_DOWNLOAD_COMP,
1057                               0x40 | USB_DIR_OUT,
1058                               firm_offset >> 8, 0, NULL, 0, USB_MSG_TIMEOUT);
1059         if (err)
1060                 return -EIO;
1061 
1062         dev_info(&hif_dev->udev->dev, "ath9k_htc: Transferred FW: %s, size: %ld\n",
1063                  hif_dev->fw_name, (unsigned long) hif_dev->fw_size);
1064 
1065         return 0;
1066 }
1067 
1068 static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev)
1069 {
1070         int ret;
1071 
1072         ret = ath9k_hif_usb_download_fw(hif_dev);
1073         if (ret) {
1074                 dev_err(&hif_dev->udev->dev,
1075                         "ath9k_htc: Firmware - %s download failed\n",
1076                         hif_dev->fw_name);
1077                 return ret;
1078         }
1079 
1080         /* Alloc URBs */
1081         ret = ath9k_hif_usb_alloc_urbs(hif_dev);
1082         if (ret) {
1083                 dev_err(&hif_dev->udev->dev,
1084                         "ath9k_htc: Unable to allocate URBs\n");
1085                 return ret;
1086         }
1087 
1088         return 0;
1089 }
1090 
1091 static void ath9k_hif_usb_dev_deinit(struct hif_device_usb *hif_dev)
1092 {
1093         ath9k_hif_usb_dealloc_urbs(hif_dev);
1094 }
1095 
1096 /*
1097  * If initialization fails or the FW cannot be retrieved,
1098  * detach the device.
1099  */
1100 static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
1101 {
1102         struct device *dev = &hif_dev->udev->dev;
1103         struct device *parent = dev->parent;
1104 
1105         complete_all(&hif_dev->fw_done);
1106 
1107         if (parent)
1108                 device_lock(parent);
1109 
1110         device_release_driver(dev);
1111 
1112         if (parent)
1113                 device_unlock(parent);
1114 }
1115 
1116 static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context);
1117 
1118 /* taken from iwlwifi */
1119 static int ath9k_hif_request_firmware(struct hif_device_usb *hif_dev,
1120                                       bool first)
1121 {
1122         char index[8], *chip;
1123         int ret;
1124 
1125         if (first) {
1126                 if (htc_use_dev_fw) {
1127                         hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX + 1;
1128                         sprintf(index, "%s", "dev");
1129                 } else {
1130                         hif_dev->fw_minor_index = FIRMWARE_MINOR_IDX_MAX;
1131                         sprintf(index, "%d", hif_dev->fw_minor_index);
1132                 }
1133         } else {
1134                 hif_dev->fw_minor_index--;
1135                 sprintf(index, "%d", hif_dev->fw_minor_index);
1136         }
1137 
1138         /* test for FW 1.3 */
1139         if (MAJOR_VERSION_REQ == 1 && hif_dev->fw_minor_index == 3) {
1140                 const char *filename;
1141 
1142                 if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1143                         filename = FIRMWARE_AR7010_1_1;
1144                 else
1145                         filename = FIRMWARE_AR9271;
1146 
1147                 /* expected fw locations:
1148                  * - htc_9271.fw   (stable version 1.3, depricated)
1149                  */
1150                 snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
1151                          "%s", filename);
1152 
1153         } else if (hif_dev->fw_minor_index < FIRMWARE_MINOR_IDX_MIN) {
1154                 dev_err(&hif_dev->udev->dev, "no suitable firmware found!\n");
1155 
1156                 return -ENOENT;
1157         } else {
1158                 if (IS_AR7010_DEVICE(hif_dev->usb_device_id->driver_info))
1159                         chip = "7010";
1160                 else
1161                         chip = "9271";
1162 
1163                 /* expected fw locations:
1164                  * - ath9k_htc/htc_9271-1.dev.0.fw (development version)
1165                  * - ath9k_htc/htc_9271-1.4.0.fw   (stable version)
1166                  */
1167                 snprintf(hif_dev->fw_name, sizeof(hif_dev->fw_name),
1168                          "%s/htc_%s-%d.%s.0.fw", HTC_FW_PATH,
1169                          chip, MAJOR_VERSION_REQ, index);
1170         }
1171 
1172         ret = request_firmware_nowait(THIS_MODULE, true, hif_dev->fw_name,
1173                                       &hif_dev->udev->dev, GFP_KERNEL,
1174                                       hif_dev, ath9k_hif_usb_firmware_cb);
1175         if (ret) {
1176                 dev_err(&hif_dev->udev->dev,
1177                         "ath9k_htc: Async request for firmware %s failed\n",
1178                         hif_dev->fw_name);
1179                 return ret;
1180         }
1181 
1182         dev_info(&hif_dev->udev->dev, "ath9k_htc: Firmware %s requested\n",
1183                  hif_dev->fw_name);
1184 
1185         return ret;
1186 }
1187 
1188 static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
1189 {
1190         struct hif_device_usb *hif_dev = context;
1191         int ret;
1192 
1193         if (!fw) {
1194                 ret = ath9k_hif_request_firmware(hif_dev, false);
1195                 if (!ret)
1196                         return;
1197 
1198                 dev_err(&hif_dev->udev->dev,
1199                         "ath9k_htc: Failed to get firmware %s\n",
1200                         hif_dev->fw_name);
1201                 goto err_fw;
1202         }
1203 
1204         hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
1205                                                  &hif_dev->udev->dev);
1206         if (hif_dev->htc_handle == NULL)
1207                 goto err_dev_alloc;
1208 
1209         hif_dev->fw_data = fw->data;
1210         hif_dev->fw_size = fw->size;
1211 
1212         /* Proceed with initialization */
1213 
1214         ret = ath9k_hif_usb_dev_init(hif_dev);
1215         if (ret)
1216                 goto err_dev_init;
1217 
1218         ret = ath9k_htc_hw_init(hif_dev->htc_handle,
1219                                 &hif_dev->interface->dev,
1220                                 hif_dev->usb_device_id->idProduct,
1221                                 hif_dev->udev->product,
1222                                 hif_dev->usb_device_id->driver_info);
1223         if (ret) {
1224                 ret = -EINVAL;
1225                 goto err_htc_hw_init;
1226         }
1227 
1228         release_firmware(fw);
1229         hif_dev->flags |= HIF_USB_READY;
1230         complete_all(&hif_dev->fw_done);
1231 
1232         return;
1233 
1234 err_htc_hw_init:
1235         ath9k_hif_usb_dev_deinit(hif_dev);
1236 err_dev_init:
1237         ath9k_htc_hw_free(hif_dev->htc_handle);
1238 err_dev_alloc:
1239         release_firmware(fw);
1240 err_fw:
1241         ath9k_hif_usb_firmware_fail(hif_dev);
1242 }
1243 
1244 /*
1245  * An exact copy of the function from zd1211rw.
1246  */
1247 static int send_eject_command(struct usb_interface *interface)
1248 {
1249         struct usb_device *udev = interface_to_usbdev(interface);
1250         struct usb_host_interface *iface_desc = interface->cur_altsetting;
1251         struct usb_endpoint_descriptor *endpoint;
1252         unsigned char *cmd;
1253         u8 bulk_out_ep;
1254         int r;
1255 
1256         if (iface_desc->desc.bNumEndpoints < 2)
1257                 return -ENODEV;
1258 
1259         /* Find bulk out endpoint */
1260         for (r = 1; r >= 0; r--) {
1261                 endpoint = &iface_desc->endpoint[r].desc;
1262                 if (usb_endpoint_dir_out(endpoint) &&
1263                     usb_endpoint_xfer_bulk(endpoint)) {
1264                         bulk_out_ep = endpoint->bEndpointAddress;
1265                         break;
1266                 }
1267         }
1268         if (r == -1) {
1269                 dev_err(&udev->dev,
1270                         "ath9k_htc: Could not find bulk out endpoint\n");
1271                 return -ENODEV;
1272         }
1273 
1274         cmd = kzalloc(31, GFP_KERNEL);
1275         if (cmd == NULL)
1276                 return -ENODEV;
1277 
1278         /* USB bulk command block */
1279         cmd[0] = 0x55;  /* bulk command signature */
1280         cmd[1] = 0x53;  /* bulk command signature */
1281         cmd[2] = 0x42;  /* bulk command signature */
1282         cmd[3] = 0x43;  /* bulk command signature */
1283         cmd[14] = 6;    /* command length */
1284 
1285         cmd[15] = 0x1b; /* SCSI command: START STOP UNIT */
1286         cmd[19] = 0x2;  /* eject disc */
1287 
1288         dev_info(&udev->dev, "Ejecting storage device...\n");
1289         r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, bulk_out_ep),
1290                 cmd, 31, NULL, 2 * USB_MSG_TIMEOUT);
1291         kfree(cmd);
1292         if (r)
1293                 return r;
1294 
1295         /* At this point, the device disconnects and reconnects with the real
1296          * ID numbers. */
1297 
1298         usb_set_intfdata(interface, NULL);
1299         return 0;
1300 }
1301 
1302 static int ath9k_hif_usb_probe(struct usb_interface *interface,
1303                                const struct usb_device_id *id)
1304 {
1305         struct usb_device *udev = interface_to_usbdev(interface);
1306         struct hif_device_usb *hif_dev;
1307         int ret = 0;
1308 
1309         if (id->driver_info == STORAGE_DEVICE)
1310                 return send_eject_command(interface);
1311 
1312         hif_dev = kzalloc(sizeof(struct hif_device_usb), GFP_KERNEL);
1313         if (!hif_dev) {
1314                 ret = -ENOMEM;
1315                 goto err_alloc;
1316         }
1317 
1318         usb_get_dev(udev);
1319 
1320         hif_dev->udev = udev;
1321         hif_dev->interface = interface;
1322         hif_dev->usb_device_id = id;
1323 #ifdef CONFIG_PM
1324         udev->reset_resume = 1;
1325 #endif
1326         usb_set_intfdata(interface, hif_dev);
1327 
1328         init_completion(&hif_dev->fw_done);
1329 
1330         ret = ath9k_hif_request_firmware(hif_dev, true);
1331         if (ret)
1332                 goto err_fw_req;
1333 
1334         return ret;
1335 
1336 err_fw_req:
1337         usb_set_intfdata(interface, NULL);
1338         kfree(hif_dev);
1339         usb_put_dev(udev);
1340 err_alloc:
1341         return ret;
1342 }
1343 
1344 static void ath9k_hif_usb_reboot(struct usb_device *udev)
1345 {
1346         u32 reboot_cmd = 0xffffffff;
1347         void *buf;
1348         int ret;
1349 
1350         buf = kmemdup(&reboot_cmd, 4, GFP_KERNEL);
1351         if (!buf)
1352                 return;
1353 
1354         ret = usb_interrupt_msg(udev, usb_sndintpipe(udev, USB_REG_OUT_PIPE),
1355                            buf, 4, NULL, USB_MSG_TIMEOUT);
1356         if (ret)
1357                 dev_err(&udev->dev, "ath9k_htc: USB reboot failed\n");
1358 
1359         kfree(buf);
1360 }
1361 
1362 static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
1363 {
1364         struct usb_device *udev = interface_to_usbdev(interface);
1365         struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1366         bool unplugged = (udev->state == USB_STATE_NOTATTACHED) ? true : false;
1367 
1368         if (!hif_dev)
1369                 return;
1370 
1371         wait_for_completion(&hif_dev->fw_done);
1372 
1373         if (hif_dev->flags & HIF_USB_READY) {
1374                 ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
1375                 ath9k_hif_usb_dev_deinit(hif_dev);
1376                 ath9k_destoy_wmi(hif_dev->htc_handle->drv_priv);
1377                 ath9k_htc_hw_free(hif_dev->htc_handle);
1378         }
1379 
1380         usb_set_intfdata(interface, NULL);
1381 
1382         /* If firmware was loaded we should drop it
1383          * go back to first stage bootloader. */
1384         if (!unplugged && (hif_dev->flags & HIF_USB_READY))
1385                 ath9k_hif_usb_reboot(udev);
1386 
1387         kfree(hif_dev);
1388         dev_info(&udev->dev, "ath9k_htc: USB layer deinitialized\n");
1389         usb_put_dev(udev);
1390 }
1391 
1392 #ifdef CONFIG_PM
1393 static int ath9k_hif_usb_suspend(struct usb_interface *interface,
1394                                  pm_message_t message)
1395 {
1396         struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1397 
1398         /*
1399          * The device has to be set to FULLSLEEP mode in case no
1400          * interface is up.
1401          */
1402         if (!(hif_dev->flags & HIF_USB_START))
1403                 ath9k_htc_suspend(hif_dev->htc_handle);
1404 
1405         wait_for_completion(&hif_dev->fw_done);
1406 
1407         if (hif_dev->flags & HIF_USB_READY)
1408                 ath9k_hif_usb_dealloc_urbs(hif_dev);
1409 
1410         return 0;
1411 }
1412 
1413 static int ath9k_hif_usb_resume(struct usb_interface *interface)
1414 {
1415         struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
1416         struct htc_target *htc_handle = hif_dev->htc_handle;
1417         int ret;
1418         const struct firmware *fw;
1419 
1420         ret = ath9k_hif_usb_alloc_urbs(hif_dev);
1421         if (ret)
1422                 return ret;
1423 
1424         if (hif_dev->flags & HIF_USB_READY) {
1425                 /* request cached firmware during suspend/resume cycle */
1426                 ret = request_firmware(&fw, hif_dev->fw_name,
1427                                        &hif_dev->udev->dev);
1428                 if (ret)
1429                         goto fail_resume;
1430 
1431                 hif_dev->fw_data = fw->data;
1432                 hif_dev->fw_size = fw->size;
1433                 ret = ath9k_hif_usb_download_fw(hif_dev);
1434                 release_firmware(fw);
1435                 if (ret)
1436                         goto fail_resume;
1437         } else {
1438                 ath9k_hif_usb_dealloc_urbs(hif_dev);
1439                 return -EIO;
1440         }
1441 
1442         mdelay(100);
1443 
1444         ret = ath9k_htc_resume(htc_handle);
1445 
1446         if (ret)
1447                 goto fail_resume;
1448 
1449         return 0;
1450 
1451 fail_resume:
1452         ath9k_hif_usb_dealloc_urbs(hif_dev);
1453 
1454         return ret;
1455 }
1456 #endif
1457 
1458 static struct usb_driver ath9k_hif_usb_driver = {
1459         .name = KBUILD_MODNAME,
1460         .probe = ath9k_hif_usb_probe,
1461         .disconnect = ath9k_hif_usb_disconnect,
1462 #ifdef CONFIG_PM
1463         .suspend = ath9k_hif_usb_suspend,
1464         .resume = ath9k_hif_usb_resume,
1465         .reset_resume = ath9k_hif_usb_resume,
1466 #endif
1467         .id_table = ath9k_hif_usb_ids,
1468         .soft_unbind = 1,
1469         .disable_hub_initiated_lpm = 1,
1470 };
1471 
1472 int ath9k_hif_usb_init(void)
1473 {
1474         return usb_register(&ath9k_hif_usb_driver);
1475 }
1476 
1477 void ath9k_hif_usb_exit(void)
1478 {
1479         usb_deregister(&ath9k_hif_usb_driver);
1480 }

/* [<][>][^][v][top][bottom][index][help] */