root/drivers/net/wireless/ath/ath10k/usb.c

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

DEFINITIONS

This source file includes following definitions.
  1. eid_from_htc_hdr
  2. is_trailer_only_msg
  3. ath10k_usb_alloc_urb_from_pipe
  4. ath10k_usb_free_urb_to_pipe
  5. ath10k_usb_cleanup_recv_urb
  6. ath10k_usb_free_pipe_resources
  7. ath10k_usb_cleanup_pipe_resources
  8. ath10k_usb_recv_complete
  9. ath10k_usb_transmit_complete
  10. ath10k_usb_post_recv_transfers
  11. ath10k_usb_flush_all
  12. ath10k_usb_start_recv_pipes
  13. ath10k_usb_tx_complete
  14. ath10k_usb_rx_complete
  15. ath10k_usb_io_comp_work
  16. ath10k_usb_hif_start
  17. ath10k_usb_hif_tx_sg
  18. ath10k_usb_hif_stop
  19. ath10k_usb_hif_get_free_queue_number
  20. ath10k_usb_submit_ctrl_out
  21. ath10k_usb_submit_ctrl_in
  22. ath10k_usb_ctrl_msg_exchange
  23. ath10k_usb_hif_diag_read
  24. ath10k_usb_hif_diag_write
  25. ath10k_usb_bmi_exchange_msg
  26. ath10k_usb_hif_get_default_pipe
  27. ath10k_usb_hif_map_service_to_pipe
  28. ath10k_usb_hif_send_complete_check
  29. ath10k_usb_hif_power_up
  30. ath10k_usb_hif_power_down
  31. ath10k_usb_hif_suspend
  32. ath10k_usb_hif_resume
  33. ath10k_usb_get_logical_pipe_num
  34. ath10k_usb_alloc_pipe_resources
  35. ath10k_usb_setup_pipe_resources
  36. ath10k_usb_create
  37. ath10k_usb_probe
  38. ath10k_usb_remove
  39. ath10k_usb_pm_suspend
  40. ath10k_usb_pm_resume

   1 // SPDX-License-Identifier: ISC
   2 /*
   3  * Copyright (c) 2007-2011 Atheros Communications Inc.
   4  * Copyright (c) 2011-2012,2017 Qualcomm Atheros, Inc.
   5  * Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
   6  */
   7 
   8 #include <linux/module.h>
   9 #include <linux/usb.h>
  10 
  11 #include "debug.h"
  12 #include "core.h"
  13 #include "bmi.h"
  14 #include "hif.h"
  15 #include "htc.h"
  16 #include "usb.h"
  17 
  18 static void ath10k_usb_post_recv_transfers(struct ath10k *ar,
  19                                            struct ath10k_usb_pipe *recv_pipe);
  20 
  21 /* inlined helper functions */
  22 
  23 static inline enum ath10k_htc_ep_id
  24 eid_from_htc_hdr(struct ath10k_htc_hdr *htc_hdr)
  25 {
  26         return (enum ath10k_htc_ep_id)htc_hdr->eid;
  27 }
  28 
  29 static inline bool is_trailer_only_msg(struct ath10k_htc_hdr *htc_hdr)
  30 {
  31         return __le16_to_cpu(htc_hdr->len) == htc_hdr->trailer_len;
  32 }
  33 
  34 /* pipe/urb operations */
  35 static struct ath10k_urb_context *
  36 ath10k_usb_alloc_urb_from_pipe(struct ath10k_usb_pipe *pipe)
  37 {
  38         struct ath10k_urb_context *urb_context = NULL;
  39         unsigned long flags;
  40 
  41         /* bail if this pipe is not initialized */
  42         if (!pipe->ar_usb)
  43                 return NULL;
  44 
  45         spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags);
  46         if (!list_empty(&pipe->urb_list_head)) {
  47                 urb_context = list_first_entry(&pipe->urb_list_head,
  48                                                struct ath10k_urb_context, link);
  49                 list_del(&urb_context->link);
  50                 pipe->urb_cnt--;
  51         }
  52         spin_unlock_irqrestore(&pipe->ar_usb->cs_lock, flags);
  53 
  54         return urb_context;
  55 }
  56 
  57 static void ath10k_usb_free_urb_to_pipe(struct ath10k_usb_pipe *pipe,
  58                                         struct ath10k_urb_context *urb_context)
  59 {
  60         unsigned long flags;
  61 
  62         /* bail if this pipe is not initialized */
  63         if (!pipe->ar_usb)
  64                 return;
  65 
  66         spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags);
  67 
  68         pipe->urb_cnt++;
  69         list_add(&urb_context->link, &pipe->urb_list_head);
  70 
  71         spin_unlock_irqrestore(&pipe->ar_usb->cs_lock, flags);
  72 }
  73 
  74 static void ath10k_usb_cleanup_recv_urb(struct ath10k_urb_context *urb_context)
  75 {
  76         dev_kfree_skb(urb_context->skb);
  77         urb_context->skb = NULL;
  78 
  79         ath10k_usb_free_urb_to_pipe(urb_context->pipe, urb_context);
  80 }
  81 
  82 static void ath10k_usb_free_pipe_resources(struct ath10k *ar,
  83                                            struct ath10k_usb_pipe *pipe)
  84 {
  85         struct ath10k_urb_context *urb_context;
  86 
  87         if (!pipe->ar_usb) {
  88                 /* nothing allocated for this pipe */
  89                 return;
  90         }
  91 
  92         ath10k_dbg(ar, ATH10K_DBG_USB,
  93                    "usb free resources lpipe %d hpipe 0x%x urbs %d avail %d\n",
  94                    pipe->logical_pipe_num, pipe->usb_pipe_handle,
  95                    pipe->urb_alloc, pipe->urb_cnt);
  96 
  97         if (pipe->urb_alloc != pipe->urb_cnt) {
  98                 ath10k_dbg(ar, ATH10K_DBG_USB,
  99                            "usb urb leak lpipe %d hpipe 0x%x urbs %d avail %d\n",
 100                            pipe->logical_pipe_num, pipe->usb_pipe_handle,
 101                            pipe->urb_alloc, pipe->urb_cnt);
 102         }
 103 
 104         for (;;) {
 105                 urb_context = ath10k_usb_alloc_urb_from_pipe(pipe);
 106 
 107                 if (!urb_context)
 108                         break;
 109 
 110                 kfree(urb_context);
 111         }
 112 }
 113 
 114 static void ath10k_usb_cleanup_pipe_resources(struct ath10k *ar)
 115 {
 116         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 117         int i;
 118 
 119         for (i = 0; i < ATH10K_USB_PIPE_MAX; i++)
 120                 ath10k_usb_free_pipe_resources(ar, &ar_usb->pipes[i]);
 121 }
 122 
 123 /* hif usb rx/tx completion functions */
 124 
 125 static void ath10k_usb_recv_complete(struct urb *urb)
 126 {
 127         struct ath10k_urb_context *urb_context = urb->context;
 128         struct ath10k_usb_pipe *pipe = urb_context->pipe;
 129         struct ath10k *ar = pipe->ar_usb->ar;
 130         struct sk_buff *skb;
 131         int status = 0;
 132 
 133         ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 134                    "usb recv pipe %d stat %d len %d urb 0x%pK\n",
 135                    pipe->logical_pipe_num, urb->status, urb->actual_length,
 136                    urb);
 137 
 138         if (urb->status != 0) {
 139                 status = -EIO;
 140                 switch (urb->status) {
 141                 case -ECONNRESET:
 142                 case -ENOENT:
 143                 case -ESHUTDOWN:
 144                         /* no need to spew these errors when device
 145                          * removed or urb killed due to driver shutdown
 146                          */
 147                         status = -ECANCELED;
 148                         break;
 149                 default:
 150                         ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 151                                    "usb recv pipe %d ep 0x%2.2x failed: %d\n",
 152                                    pipe->logical_pipe_num,
 153                                    pipe->ep_address, urb->status);
 154                         break;
 155                 }
 156                 goto cleanup_recv_urb;
 157         }
 158 
 159         if (urb->actual_length == 0)
 160                 goto cleanup_recv_urb;
 161 
 162         skb = urb_context->skb;
 163 
 164         /* we are going to pass it up */
 165         urb_context->skb = NULL;
 166         skb_put(skb, urb->actual_length);
 167 
 168         /* note: queue implements a lock */
 169         skb_queue_tail(&pipe->io_comp_queue, skb);
 170         schedule_work(&pipe->io_complete_work);
 171 
 172 cleanup_recv_urb:
 173         ath10k_usb_cleanup_recv_urb(urb_context);
 174 
 175         if (status == 0 &&
 176             pipe->urb_cnt >= pipe->urb_cnt_thresh) {
 177                 /* our free urbs are piling up, post more transfers */
 178                 ath10k_usb_post_recv_transfers(ar, pipe);
 179         }
 180 }
 181 
 182 static void ath10k_usb_transmit_complete(struct urb *urb)
 183 {
 184         struct ath10k_urb_context *urb_context = urb->context;
 185         struct ath10k_usb_pipe *pipe = urb_context->pipe;
 186         struct ath10k *ar = pipe->ar_usb->ar;
 187         struct sk_buff *skb;
 188 
 189         if (urb->status != 0) {
 190                 ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 191                            "pipe: %d, failed:%d\n",
 192                            pipe->logical_pipe_num, urb->status);
 193         }
 194 
 195         skb = urb_context->skb;
 196         urb_context->skb = NULL;
 197         ath10k_usb_free_urb_to_pipe(urb_context->pipe, urb_context);
 198 
 199         /* note: queue implements a lock */
 200         skb_queue_tail(&pipe->io_comp_queue, skb);
 201         schedule_work(&pipe->io_complete_work);
 202 }
 203 
 204 /* pipe operations */
 205 static void ath10k_usb_post_recv_transfers(struct ath10k *ar,
 206                                            struct ath10k_usb_pipe *recv_pipe)
 207 {
 208         struct ath10k_urb_context *urb_context;
 209         struct urb *urb;
 210         int usb_status;
 211 
 212         for (;;) {
 213                 urb_context = ath10k_usb_alloc_urb_from_pipe(recv_pipe);
 214                 if (!urb_context)
 215                         break;
 216 
 217                 urb_context->skb = dev_alloc_skb(ATH10K_USB_RX_BUFFER_SIZE);
 218                 if (!urb_context->skb)
 219                         goto err;
 220 
 221                 urb = usb_alloc_urb(0, GFP_ATOMIC);
 222                 if (!urb)
 223                         goto err;
 224 
 225                 usb_fill_bulk_urb(urb,
 226                                   recv_pipe->ar_usb->udev,
 227                                   recv_pipe->usb_pipe_handle,
 228                                   urb_context->skb->data,
 229                                   ATH10K_USB_RX_BUFFER_SIZE,
 230                                   ath10k_usb_recv_complete, urb_context);
 231 
 232                 ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 233                            "usb bulk recv submit %d 0x%x ep 0x%2.2x len %d buf 0x%pK\n",
 234                            recv_pipe->logical_pipe_num,
 235                            recv_pipe->usb_pipe_handle, recv_pipe->ep_address,
 236                            ATH10K_USB_RX_BUFFER_SIZE, urb_context->skb);
 237 
 238                 usb_anchor_urb(urb, &recv_pipe->urb_submitted);
 239                 usb_status = usb_submit_urb(urb, GFP_ATOMIC);
 240 
 241                 if (usb_status) {
 242                         ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 243                                    "usb bulk recv failed: %d\n",
 244                                    usb_status);
 245                         usb_unanchor_urb(urb);
 246                         usb_free_urb(urb);
 247                         goto err;
 248                 }
 249                 usb_free_urb(urb);
 250         }
 251 
 252         return;
 253 
 254 err:
 255         ath10k_usb_cleanup_recv_urb(urb_context);
 256 }
 257 
 258 static void ath10k_usb_flush_all(struct ath10k *ar)
 259 {
 260         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 261         int i;
 262 
 263         for (i = 0; i < ATH10K_USB_PIPE_MAX; i++) {
 264                 if (ar_usb->pipes[i].ar_usb) {
 265                         usb_kill_anchored_urbs(&ar_usb->pipes[i].urb_submitted);
 266                         cancel_work_sync(&ar_usb->pipes[i].io_complete_work);
 267                 }
 268         }
 269 }
 270 
 271 static void ath10k_usb_start_recv_pipes(struct ath10k *ar)
 272 {
 273         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 274 
 275         ar_usb->pipes[ATH10K_USB_PIPE_RX_DATA].urb_cnt_thresh = 1;
 276 
 277         ath10k_usb_post_recv_transfers(ar,
 278                                        &ar_usb->pipes[ATH10K_USB_PIPE_RX_DATA]);
 279 }
 280 
 281 static void ath10k_usb_tx_complete(struct ath10k *ar, struct sk_buff *skb)
 282 {
 283         struct ath10k_htc_hdr *htc_hdr;
 284         struct ath10k_htc_ep *ep;
 285 
 286         htc_hdr = (struct ath10k_htc_hdr *)skb->data;
 287         ep = &ar->htc.endpoint[htc_hdr->eid];
 288         ath10k_htc_notify_tx_completion(ep, skb);
 289         /* The TX complete handler now owns the skb... */
 290 }
 291 
 292 static void ath10k_usb_rx_complete(struct ath10k *ar, struct sk_buff *skb)
 293 {
 294         struct ath10k_htc *htc = &ar->htc;
 295         struct ath10k_htc_hdr *htc_hdr;
 296         enum ath10k_htc_ep_id eid;
 297         struct ath10k_htc_ep *ep;
 298         u16 payload_len;
 299         u8 *trailer;
 300         int ret;
 301 
 302         htc_hdr = (struct ath10k_htc_hdr *)skb->data;
 303         eid = eid_from_htc_hdr(htc_hdr);
 304         ep = &ar->htc.endpoint[eid];
 305 
 306         if (ep->service_id == 0) {
 307                 ath10k_warn(ar, "ep %d is not connected\n", eid);
 308                 goto out_free_skb;
 309         }
 310 
 311         payload_len = le16_to_cpu(htc_hdr->len);
 312         if (!payload_len) {
 313                 ath10k_warn(ar, "zero length frame received, firmware crashed?\n");
 314                 goto out_free_skb;
 315         }
 316 
 317         if (payload_len < htc_hdr->trailer_len) {
 318                 ath10k_warn(ar, "malformed frame received, firmware crashed?\n");
 319                 goto out_free_skb;
 320         }
 321 
 322         if (htc_hdr->flags & ATH10K_HTC_FLAG_TRAILER_PRESENT) {
 323                 trailer = skb->data + sizeof(*htc_hdr) + payload_len -
 324                           htc_hdr->trailer_len;
 325 
 326                 ret = ath10k_htc_process_trailer(htc,
 327                                                  trailer,
 328                                                  htc_hdr->trailer_len,
 329                                                  eid,
 330                                                  NULL,
 331                                                  NULL);
 332                 if (ret)
 333                         goto out_free_skb;
 334 
 335                 if (is_trailer_only_msg(htc_hdr))
 336                         goto out_free_skb;
 337 
 338                 /* strip off the trailer from the skb since it should not
 339                  * be passed on to upper layers
 340                  */
 341                 skb_trim(skb, skb->len - htc_hdr->trailer_len);
 342         }
 343 
 344         skb_pull(skb, sizeof(*htc_hdr));
 345         ep->ep_ops.ep_rx_complete(ar, skb);
 346         /* The RX complete handler now owns the skb... */
 347 
 348         return;
 349 
 350 out_free_skb:
 351         dev_kfree_skb(skb);
 352 }
 353 
 354 static void ath10k_usb_io_comp_work(struct work_struct *work)
 355 {
 356         struct ath10k_usb_pipe *pipe = container_of(work,
 357                                                     struct ath10k_usb_pipe,
 358                                                     io_complete_work);
 359         struct ath10k *ar = pipe->ar_usb->ar;
 360         struct sk_buff *skb;
 361 
 362         while ((skb = skb_dequeue(&pipe->io_comp_queue))) {
 363                 if (pipe->flags & ATH10K_USB_PIPE_FLAG_TX)
 364                         ath10k_usb_tx_complete(ar, skb);
 365                 else
 366                         ath10k_usb_rx_complete(ar, skb);
 367         }
 368 }
 369 
 370 #define ATH10K_USB_MAX_DIAG_CMD (sizeof(struct ath10k_usb_ctrl_diag_cmd_write))
 371 #define ATH10K_USB_MAX_DIAG_RESP (sizeof(struct ath10k_usb_ctrl_diag_resp_read))
 372 
 373 static void ath10k_usb_destroy(struct ath10k *ar)
 374 {
 375         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 376 
 377         ath10k_usb_flush_all(ar);
 378         ath10k_usb_cleanup_pipe_resources(ar);
 379         usb_set_intfdata(ar_usb->interface, NULL);
 380 
 381         kfree(ar_usb->diag_cmd_buffer);
 382         kfree(ar_usb->diag_resp_buffer);
 383 }
 384 
 385 static int ath10k_usb_hif_start(struct ath10k *ar)
 386 {
 387         int i;
 388         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 389 
 390         ath10k_usb_start_recv_pipes(ar);
 391 
 392         /* set the TX resource avail threshold for each TX pipe */
 393         for (i = ATH10K_USB_PIPE_TX_CTRL;
 394              i <= ATH10K_USB_PIPE_TX_DATA_HP; i++) {
 395                 ar_usb->pipes[i].urb_cnt_thresh =
 396                     ar_usb->pipes[i].urb_alloc / 2;
 397         }
 398 
 399         return 0;
 400 }
 401 
 402 static int ath10k_usb_hif_tx_sg(struct ath10k *ar, u8 pipe_id,
 403                                 struct ath10k_hif_sg_item *items, int n_items)
 404 {
 405         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 406         struct ath10k_usb_pipe *pipe = &ar_usb->pipes[pipe_id];
 407         struct ath10k_urb_context *urb_context;
 408         struct sk_buff *skb;
 409         struct urb *urb;
 410         int ret, i;
 411 
 412         for (i = 0; i < n_items; i++) {
 413                 urb_context = ath10k_usb_alloc_urb_from_pipe(pipe);
 414                 if (!urb_context) {
 415                         ret = -ENOMEM;
 416                         goto err;
 417                 }
 418 
 419                 skb = items[i].transfer_context;
 420                 urb_context->skb = skb;
 421 
 422                 urb = usb_alloc_urb(0, GFP_ATOMIC);
 423                 if (!urb) {
 424                         ret = -ENOMEM;
 425                         goto err_free_urb_to_pipe;
 426                 }
 427 
 428                 usb_fill_bulk_urb(urb,
 429                                   ar_usb->udev,
 430                                   pipe->usb_pipe_handle,
 431                                   skb->data,
 432                                   skb->len,
 433                                   ath10k_usb_transmit_complete, urb_context);
 434 
 435                 if (!(skb->len % pipe->max_packet_size)) {
 436                         /* hit a max packet boundary on this pipe */
 437                         urb->transfer_flags |= URB_ZERO_PACKET;
 438                 }
 439 
 440                 usb_anchor_urb(urb, &pipe->urb_submitted);
 441                 ret = usb_submit_urb(urb, GFP_ATOMIC);
 442                 if (ret) {
 443                         ath10k_dbg(ar, ATH10K_DBG_USB_BULK,
 444                                    "usb bulk transmit failed: %d\n", ret);
 445                         usb_unanchor_urb(urb);
 446                         usb_free_urb(urb);
 447                         ret = -EINVAL;
 448                         goto err_free_urb_to_pipe;
 449                 }
 450 
 451                 usb_free_urb(urb);
 452         }
 453 
 454         return 0;
 455 
 456 err_free_urb_to_pipe:
 457         ath10k_usb_free_urb_to_pipe(urb_context->pipe, urb_context);
 458 err:
 459         return ret;
 460 }
 461 
 462 static void ath10k_usb_hif_stop(struct ath10k *ar)
 463 {
 464         ath10k_usb_flush_all(ar);
 465 }
 466 
 467 static u16 ath10k_usb_hif_get_free_queue_number(struct ath10k *ar, u8 pipe_id)
 468 {
 469         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 470 
 471         return ar_usb->pipes[pipe_id].urb_cnt;
 472 }
 473 
 474 static int ath10k_usb_submit_ctrl_out(struct ath10k *ar,
 475                                       u8 req, u16 value, u16 index, void *data,
 476                                       u32 size)
 477 {
 478         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 479         u8 *buf = NULL;
 480         int ret;
 481 
 482         if (size > 0) {
 483                 buf = kmemdup(data, size, GFP_KERNEL);
 484                 if (!buf)
 485                         return -ENOMEM;
 486         }
 487 
 488         /* note: if successful returns number of bytes transferred */
 489         ret = usb_control_msg(ar_usb->udev,
 490                               usb_sndctrlpipe(ar_usb->udev, 0),
 491                               req,
 492                               USB_DIR_OUT | USB_TYPE_VENDOR |
 493                               USB_RECIP_DEVICE, value, index, buf,
 494                               size, 1000);
 495 
 496         if (ret < 0) {
 497                 ath10k_warn(ar, "Failed to submit usb control message: %d\n",
 498                             ret);
 499                 kfree(buf);
 500                 return ret;
 501         }
 502 
 503         kfree(buf);
 504 
 505         return 0;
 506 }
 507 
 508 static int ath10k_usb_submit_ctrl_in(struct ath10k *ar,
 509                                      u8 req, u16 value, u16 index, void *data,
 510                                      u32 size)
 511 {
 512         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 513         u8 *buf = NULL;
 514         int ret;
 515 
 516         if (size > 0) {
 517                 buf = kmalloc(size, GFP_KERNEL);
 518                 if (!buf)
 519                         return -ENOMEM;
 520         }
 521 
 522         /* note: if successful returns number of bytes transferred */
 523         ret = usb_control_msg(ar_usb->udev,
 524                               usb_rcvctrlpipe(ar_usb->udev, 0),
 525                               req,
 526                               USB_DIR_IN | USB_TYPE_VENDOR |
 527                               USB_RECIP_DEVICE, value, index, buf,
 528                               size, 2 * HZ);
 529 
 530         if (ret < 0) {
 531                 ath10k_warn(ar, "Failed to read usb control message: %d\n",
 532                             ret);
 533                 kfree(buf);
 534                 return ret;
 535         }
 536 
 537         memcpy((u8 *)data, buf, size);
 538 
 539         kfree(buf);
 540 
 541         return 0;
 542 }
 543 
 544 static int ath10k_usb_ctrl_msg_exchange(struct ath10k *ar,
 545                                         u8 req_val, u8 *req_buf, u32 req_len,
 546                                         u8 resp_val, u8 *resp_buf,
 547                                         u32 *resp_len)
 548 {
 549         int ret;
 550 
 551         /* send command */
 552         ret = ath10k_usb_submit_ctrl_out(ar, req_val, 0, 0,
 553                                          req_buf, req_len);
 554         if (ret)
 555                 goto err;
 556 
 557         /* get response */
 558         if (resp_buf) {
 559                 ret = ath10k_usb_submit_ctrl_in(ar, resp_val, 0, 0,
 560                                                 resp_buf, *resp_len);
 561                 if (ret)
 562                         goto err;
 563         }
 564 
 565         return 0;
 566 err:
 567         return ret;
 568 }
 569 
 570 static int ath10k_usb_hif_diag_read(struct ath10k *ar, u32 address, void *buf,
 571                                     size_t buf_len)
 572 {
 573         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 574         struct ath10k_usb_ctrl_diag_cmd_read *cmd;
 575         u32 resp_len;
 576         int ret;
 577 
 578         if (buf_len < sizeof(struct ath10k_usb_ctrl_diag_resp_read))
 579                 return -EINVAL;
 580 
 581         cmd = (struct ath10k_usb_ctrl_diag_cmd_read *)ar_usb->diag_cmd_buffer;
 582         memset(cmd, 0, sizeof(*cmd));
 583         cmd->cmd = ATH10K_USB_CTRL_DIAG_CC_READ;
 584         cmd->address = cpu_to_le32(address);
 585         resp_len = sizeof(struct ath10k_usb_ctrl_diag_resp_read);
 586 
 587         ret = ath10k_usb_ctrl_msg_exchange(ar,
 588                                            ATH10K_USB_CONTROL_REQ_DIAG_CMD,
 589                                            (u8 *)cmd,
 590                                            sizeof(*cmd),
 591                                            ATH10K_USB_CONTROL_REQ_DIAG_RESP,
 592                                            ar_usb->diag_resp_buffer, &resp_len);
 593         if (ret)
 594                 return ret;
 595 
 596         if (resp_len != sizeof(struct ath10k_usb_ctrl_diag_resp_read))
 597                 return -EMSGSIZE;
 598 
 599         memcpy(buf, ar_usb->diag_resp_buffer,
 600                sizeof(struct ath10k_usb_ctrl_diag_resp_read));
 601 
 602         return 0;
 603 }
 604 
 605 static int ath10k_usb_hif_diag_write(struct ath10k *ar, u32 address,
 606                                      const void *data, int nbytes)
 607 {
 608         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 609         struct ath10k_usb_ctrl_diag_cmd_write *cmd;
 610         int ret;
 611 
 612         if (nbytes != sizeof(cmd->value))
 613                 return -EINVAL;
 614 
 615         cmd = (struct ath10k_usb_ctrl_diag_cmd_write *)ar_usb->diag_cmd_buffer;
 616         memset(cmd, 0, sizeof(*cmd));
 617         cmd->cmd = cpu_to_le32(ATH10K_USB_CTRL_DIAG_CC_WRITE);
 618         cmd->address = cpu_to_le32(address);
 619         memcpy(&cmd->value, data, nbytes);
 620 
 621         ret = ath10k_usb_ctrl_msg_exchange(ar,
 622                                            ATH10K_USB_CONTROL_REQ_DIAG_CMD,
 623                                            (u8 *)cmd,
 624                                            sizeof(*cmd),
 625                                            0, NULL, NULL);
 626         if (ret)
 627                 return ret;
 628 
 629         return 0;
 630 }
 631 
 632 static int ath10k_usb_bmi_exchange_msg(struct ath10k *ar,
 633                                        void *req, u32 req_len,
 634                                        void *resp, u32 *resp_len)
 635 {
 636         int ret;
 637 
 638         if (req) {
 639                 ret = ath10k_usb_submit_ctrl_out(ar,
 640                                                  ATH10K_USB_CONTROL_REQ_SEND_BMI_CMD,
 641                                                  0, 0, req, req_len);
 642                 if (ret) {
 643                         ath10k_warn(ar,
 644                                     "unable to send the bmi data to the device: %d\n",
 645                                     ret);
 646                         return ret;
 647                 }
 648         }
 649 
 650         if (resp) {
 651                 ret = ath10k_usb_submit_ctrl_in(ar,
 652                                                 ATH10K_USB_CONTROL_REQ_RECV_BMI_RESP,
 653                                                 0, 0, resp, *resp_len);
 654                 if (ret) {
 655                         ath10k_warn(ar,
 656                                     "Unable to read the bmi data from the device: %d\n",
 657                                     ret);
 658                         return ret;
 659                 }
 660         }
 661 
 662         return 0;
 663 }
 664 
 665 static void ath10k_usb_hif_get_default_pipe(struct ath10k *ar,
 666                                             u8 *ul_pipe, u8 *dl_pipe)
 667 {
 668         *ul_pipe = ATH10K_USB_PIPE_TX_CTRL;
 669         *dl_pipe = ATH10K_USB_PIPE_RX_CTRL;
 670 }
 671 
 672 static int ath10k_usb_hif_map_service_to_pipe(struct ath10k *ar, u16 svc_id,
 673                                               u8 *ul_pipe, u8 *dl_pipe)
 674 {
 675         switch (svc_id) {
 676         case ATH10K_HTC_SVC_ID_RSVD_CTRL:
 677         case ATH10K_HTC_SVC_ID_WMI_CONTROL:
 678                 *ul_pipe = ATH10K_USB_PIPE_TX_CTRL;
 679                 /* due to large control packets, shift to data pipe */
 680                 *dl_pipe = ATH10K_USB_PIPE_RX_DATA;
 681                 break;
 682         case ATH10K_HTC_SVC_ID_HTT_DATA_MSG:
 683                 *ul_pipe = ATH10K_USB_PIPE_TX_DATA_LP;
 684                 /* Disable rxdata2 directly, it will be enabled
 685                  * if FW enable rxdata2
 686                  */
 687                 *dl_pipe = ATH10K_USB_PIPE_RX_DATA;
 688                 break;
 689         default:
 690                 return -EPERM;
 691         }
 692 
 693         return 0;
 694 }
 695 
 696 /* This op is currently only used by htc_wait_target if the HTC ready
 697  * message times out. It is not applicable for USB since there is nothing
 698  * we can do if the HTC ready message does not arrive in time.
 699  * TODO: Make this op non mandatory by introducing a NULL check in the
 700  * hif op wrapper.
 701  */
 702 static void ath10k_usb_hif_send_complete_check(struct ath10k *ar,
 703                                                u8 pipe, int force)
 704 {
 705 }
 706 
 707 static int ath10k_usb_hif_power_up(struct ath10k *ar,
 708                                    enum ath10k_firmware_mode fw_mode)
 709 {
 710         return 0;
 711 }
 712 
 713 static void ath10k_usb_hif_power_down(struct ath10k *ar)
 714 {
 715         ath10k_usb_flush_all(ar);
 716 }
 717 
 718 #ifdef CONFIG_PM
 719 
 720 static int ath10k_usb_hif_suspend(struct ath10k *ar)
 721 {
 722         return -EOPNOTSUPP;
 723 }
 724 
 725 static int ath10k_usb_hif_resume(struct ath10k *ar)
 726 {
 727         return -EOPNOTSUPP;
 728 }
 729 #endif
 730 
 731 static const struct ath10k_hif_ops ath10k_usb_hif_ops = {
 732         .tx_sg                  = ath10k_usb_hif_tx_sg,
 733         .diag_read              = ath10k_usb_hif_diag_read,
 734         .diag_write             = ath10k_usb_hif_diag_write,
 735         .exchange_bmi_msg       = ath10k_usb_bmi_exchange_msg,
 736         .start                  = ath10k_usb_hif_start,
 737         .stop                   = ath10k_usb_hif_stop,
 738         .map_service_to_pipe    = ath10k_usb_hif_map_service_to_pipe,
 739         .get_default_pipe       = ath10k_usb_hif_get_default_pipe,
 740         .send_complete_check    = ath10k_usb_hif_send_complete_check,
 741         .get_free_queue_number  = ath10k_usb_hif_get_free_queue_number,
 742         .power_up               = ath10k_usb_hif_power_up,
 743         .power_down             = ath10k_usb_hif_power_down,
 744 #ifdef CONFIG_PM
 745         .suspend                = ath10k_usb_hif_suspend,
 746         .resume                 = ath10k_usb_hif_resume,
 747 #endif
 748 };
 749 
 750 static u8 ath10k_usb_get_logical_pipe_num(u8 ep_address, int *urb_count)
 751 {
 752         u8 pipe_num = ATH10K_USB_PIPE_INVALID;
 753 
 754         switch (ep_address) {
 755         case ATH10K_USB_EP_ADDR_APP_CTRL_IN:
 756                 pipe_num = ATH10K_USB_PIPE_RX_CTRL;
 757                 *urb_count = RX_URB_COUNT;
 758                 break;
 759         case ATH10K_USB_EP_ADDR_APP_DATA_IN:
 760                 pipe_num = ATH10K_USB_PIPE_RX_DATA;
 761                 *urb_count = RX_URB_COUNT;
 762                 break;
 763         case ATH10K_USB_EP_ADDR_APP_INT_IN:
 764                 pipe_num = ATH10K_USB_PIPE_RX_INT;
 765                 *urb_count = RX_URB_COUNT;
 766                 break;
 767         case ATH10K_USB_EP_ADDR_APP_DATA2_IN:
 768                 pipe_num = ATH10K_USB_PIPE_RX_DATA2;
 769                 *urb_count = RX_URB_COUNT;
 770                 break;
 771         case ATH10K_USB_EP_ADDR_APP_CTRL_OUT:
 772                 pipe_num = ATH10K_USB_PIPE_TX_CTRL;
 773                 *urb_count = TX_URB_COUNT;
 774                 break;
 775         case ATH10K_USB_EP_ADDR_APP_DATA_LP_OUT:
 776                 pipe_num = ATH10K_USB_PIPE_TX_DATA_LP;
 777                 *urb_count = TX_URB_COUNT;
 778                 break;
 779         case ATH10K_USB_EP_ADDR_APP_DATA_MP_OUT:
 780                 pipe_num = ATH10K_USB_PIPE_TX_DATA_MP;
 781                 *urb_count = TX_URB_COUNT;
 782                 break;
 783         case ATH10K_USB_EP_ADDR_APP_DATA_HP_OUT:
 784                 pipe_num = ATH10K_USB_PIPE_TX_DATA_HP;
 785                 *urb_count = TX_URB_COUNT;
 786                 break;
 787         default:
 788                 /* note: there may be endpoints not currently used */
 789                 break;
 790         }
 791 
 792         return pipe_num;
 793 }
 794 
 795 static int ath10k_usb_alloc_pipe_resources(struct ath10k *ar,
 796                                            struct ath10k_usb_pipe *pipe,
 797                                            int urb_cnt)
 798 {
 799         struct ath10k_urb_context *urb_context;
 800         int i;
 801 
 802         INIT_LIST_HEAD(&pipe->urb_list_head);
 803         init_usb_anchor(&pipe->urb_submitted);
 804 
 805         for (i = 0; i < urb_cnt; i++) {
 806                 urb_context = kzalloc(sizeof(*urb_context), GFP_KERNEL);
 807                 if (!urb_context)
 808                         return -ENOMEM;
 809 
 810                 urb_context->pipe = pipe;
 811 
 812                 /* we are only allocate the urb contexts here, the actual URB
 813                  * is allocated from the kernel as needed to do a transaction
 814                  */
 815                 pipe->urb_alloc++;
 816                 ath10k_usb_free_urb_to_pipe(pipe, urb_context);
 817         }
 818 
 819         ath10k_dbg(ar, ATH10K_DBG_USB,
 820                    "usb alloc resources lpipe %d hpipe 0x%x urbs %d\n",
 821                    pipe->logical_pipe_num, pipe->usb_pipe_handle,
 822                    pipe->urb_alloc);
 823 
 824         return 0;
 825 }
 826 
 827 static int ath10k_usb_setup_pipe_resources(struct ath10k *ar,
 828                                            struct usb_interface *interface)
 829 {
 830         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 831         struct usb_host_interface *iface_desc = interface->cur_altsetting;
 832         struct usb_endpoint_descriptor *endpoint;
 833         struct ath10k_usb_pipe *pipe;
 834         int ret, i, urbcount;
 835         u8 pipe_num;
 836 
 837         ath10k_dbg(ar, ATH10K_DBG_USB, "usb setting up pipes using interface\n");
 838 
 839         /* walk decriptors and setup pipes */
 840         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
 841                 endpoint = &iface_desc->endpoint[i].desc;
 842 
 843                 if (ATH10K_USB_IS_BULK_EP(endpoint->bmAttributes)) {
 844                         ath10k_dbg(ar, ATH10K_DBG_USB,
 845                                    "usb %s bulk ep 0x%2.2x maxpktsz %d\n",
 846                                    ATH10K_USB_IS_DIR_IN
 847                                    (endpoint->bEndpointAddress) ?
 848                                    "rx" : "tx", endpoint->bEndpointAddress,
 849                                    le16_to_cpu(endpoint->wMaxPacketSize));
 850                 } else if (ATH10K_USB_IS_INT_EP(endpoint->bmAttributes)) {
 851                         ath10k_dbg(ar, ATH10K_DBG_USB,
 852                                    "usb %s int ep 0x%2.2x maxpktsz %d interval %d\n",
 853                                    ATH10K_USB_IS_DIR_IN
 854                                    (endpoint->bEndpointAddress) ?
 855                                    "rx" : "tx", endpoint->bEndpointAddress,
 856                                    le16_to_cpu(endpoint->wMaxPacketSize),
 857                                    endpoint->bInterval);
 858                 } else if (ATH10K_USB_IS_ISOC_EP(endpoint->bmAttributes)) {
 859                         /* TODO for ISO */
 860                         ath10k_dbg(ar, ATH10K_DBG_USB,
 861                                    "usb %s isoc ep 0x%2.2x maxpktsz %d interval %d\n",
 862                                    ATH10K_USB_IS_DIR_IN
 863                                    (endpoint->bEndpointAddress) ?
 864                                    "rx" : "tx", endpoint->bEndpointAddress,
 865                                    le16_to_cpu(endpoint->wMaxPacketSize),
 866                                    endpoint->bInterval);
 867                 }
 868                 urbcount = 0;
 869 
 870                 pipe_num =
 871                     ath10k_usb_get_logical_pipe_num(endpoint->bEndpointAddress,
 872                                                     &urbcount);
 873                 if (pipe_num == ATH10K_USB_PIPE_INVALID)
 874                         continue;
 875 
 876                 pipe = &ar_usb->pipes[pipe_num];
 877                 if (pipe->ar_usb)
 878                         /* hmmm..pipe was already setup */
 879                         continue;
 880 
 881                 pipe->ar_usb = ar_usb;
 882                 pipe->logical_pipe_num = pipe_num;
 883                 pipe->ep_address = endpoint->bEndpointAddress;
 884                 pipe->max_packet_size = le16_to_cpu(endpoint->wMaxPacketSize);
 885 
 886                 if (ATH10K_USB_IS_BULK_EP(endpoint->bmAttributes)) {
 887                         if (ATH10K_USB_IS_DIR_IN(pipe->ep_address)) {
 888                                 pipe->usb_pipe_handle =
 889                                     usb_rcvbulkpipe(ar_usb->udev,
 890                                                     pipe->ep_address);
 891                         } else {
 892                                 pipe->usb_pipe_handle =
 893                                     usb_sndbulkpipe(ar_usb->udev,
 894                                                     pipe->ep_address);
 895                         }
 896                 } else if (ATH10K_USB_IS_INT_EP(endpoint->bmAttributes)) {
 897                         if (ATH10K_USB_IS_DIR_IN(pipe->ep_address)) {
 898                                 pipe->usb_pipe_handle =
 899                                     usb_rcvintpipe(ar_usb->udev,
 900                                                    pipe->ep_address);
 901                         } else {
 902                                 pipe->usb_pipe_handle =
 903                                     usb_sndintpipe(ar_usb->udev,
 904                                                    pipe->ep_address);
 905                         }
 906                 } else if (ATH10K_USB_IS_ISOC_EP(endpoint->bmAttributes)) {
 907                         /* TODO for ISO */
 908                         if (ATH10K_USB_IS_DIR_IN(pipe->ep_address)) {
 909                                 pipe->usb_pipe_handle =
 910                                     usb_rcvisocpipe(ar_usb->udev,
 911                                                     pipe->ep_address);
 912                         } else {
 913                                 pipe->usb_pipe_handle =
 914                                     usb_sndisocpipe(ar_usb->udev,
 915                                                     pipe->ep_address);
 916                         }
 917                 }
 918 
 919                 pipe->ep_desc = endpoint;
 920 
 921                 if (!ATH10K_USB_IS_DIR_IN(pipe->ep_address))
 922                         pipe->flags |= ATH10K_USB_PIPE_FLAG_TX;
 923 
 924                 ret = ath10k_usb_alloc_pipe_resources(ar, pipe, urbcount);
 925                 if (ret)
 926                         return ret;
 927         }
 928 
 929         return 0;
 930 }
 931 
 932 static int ath10k_usb_create(struct ath10k *ar,
 933                              struct usb_interface *interface)
 934 {
 935         struct ath10k_usb *ar_usb = ath10k_usb_priv(ar);
 936         struct usb_device *dev = interface_to_usbdev(interface);
 937         struct ath10k_usb_pipe *pipe;
 938         int ret, i;
 939 
 940         usb_set_intfdata(interface, ar_usb);
 941         spin_lock_init(&ar_usb->cs_lock);
 942         ar_usb->udev = dev;
 943         ar_usb->interface = interface;
 944 
 945         for (i = 0; i < ATH10K_USB_PIPE_MAX; i++) {
 946                 pipe = &ar_usb->pipes[i];
 947                 INIT_WORK(&pipe->io_complete_work,
 948                           ath10k_usb_io_comp_work);
 949                 skb_queue_head_init(&pipe->io_comp_queue);
 950         }
 951 
 952         ar_usb->diag_cmd_buffer = kzalloc(ATH10K_USB_MAX_DIAG_CMD, GFP_KERNEL);
 953         if (!ar_usb->diag_cmd_buffer) {
 954                 ret = -ENOMEM;
 955                 goto err;
 956         }
 957 
 958         ar_usb->diag_resp_buffer = kzalloc(ATH10K_USB_MAX_DIAG_RESP,
 959                                            GFP_KERNEL);
 960         if (!ar_usb->diag_resp_buffer) {
 961                 ret = -ENOMEM;
 962                 goto err;
 963         }
 964 
 965         ret = ath10k_usb_setup_pipe_resources(ar, interface);
 966         if (ret)
 967                 goto err;
 968 
 969         return 0;
 970 
 971 err:
 972         ath10k_usb_destroy(ar);
 973         return ret;
 974 }
 975 
 976 /* ath10k usb driver registered functions */
 977 static int ath10k_usb_probe(struct usb_interface *interface,
 978                             const struct usb_device_id *id)
 979 {
 980         struct ath10k *ar;
 981         struct ath10k_usb *ar_usb;
 982         struct usb_device *dev = interface_to_usbdev(interface);
 983         int ret, vendor_id, product_id;
 984         enum ath10k_hw_rev hw_rev;
 985         struct ath10k_bus_params bus_params = {};
 986 
 987         /* Assumption: All USB based chipsets (so far) are QCA9377 based.
 988          * If there will be newer chipsets that does not use the hw reg
 989          * setup as defined in qca6174_regs and qca6174_values, this
 990          * assumption is no longer valid and hw_rev must be setup differently
 991          * depending on chipset.
 992          */
 993         hw_rev = ATH10K_HW_QCA9377;
 994 
 995         ar = ath10k_core_create(sizeof(*ar_usb), &dev->dev, ATH10K_BUS_USB,
 996                                 hw_rev, &ath10k_usb_hif_ops);
 997         if (!ar) {
 998                 dev_err(&dev->dev, "failed to allocate core\n");
 999                 return -ENOMEM;
1000         }
1001 
1002         usb_get_dev(dev);
1003         vendor_id = le16_to_cpu(dev->descriptor.idVendor);
1004         product_id = le16_to_cpu(dev->descriptor.idProduct);
1005 
1006         ath10k_dbg(ar, ATH10K_DBG_BOOT,
1007                    "usb new func vendor 0x%04x product 0x%04x\n",
1008                    vendor_id, product_id);
1009 
1010         ar_usb = ath10k_usb_priv(ar);
1011         ret = ath10k_usb_create(ar, interface);
1012         ar_usb->ar = ar;
1013 
1014         ar->dev_id = product_id;
1015         ar->id.vendor = vendor_id;
1016         ar->id.device = product_id;
1017 
1018         bus_params.dev_type = ATH10K_DEV_TYPE_HL;
1019         /* TODO: don't know yet how to get chip_id with USB */
1020         bus_params.chip_id = 0;
1021         ret = ath10k_core_register(ar, &bus_params);
1022         if (ret) {
1023                 ath10k_warn(ar, "failed to register driver core: %d\n", ret);
1024                 goto err;
1025         }
1026 
1027         /* TODO: remove this once USB support is fully implemented */
1028         ath10k_warn(ar, "Warning: ath10k USB support is incomplete, don't expect anything to work!\n");
1029 
1030         return 0;
1031 
1032 err:
1033         ath10k_core_destroy(ar);
1034 
1035         usb_put_dev(dev);
1036 
1037         return ret;
1038 }
1039 
1040 static void ath10k_usb_remove(struct usb_interface *interface)
1041 {
1042         struct ath10k_usb *ar_usb;
1043 
1044         ar_usb = usb_get_intfdata(interface);
1045         if (!ar_usb)
1046                 return;
1047 
1048         ath10k_core_unregister(ar_usb->ar);
1049         ath10k_usb_destroy(ar_usb->ar);
1050         usb_put_dev(interface_to_usbdev(interface));
1051         ath10k_core_destroy(ar_usb->ar);
1052 }
1053 
1054 #ifdef CONFIG_PM
1055 
1056 static int ath10k_usb_pm_suspend(struct usb_interface *interface,
1057                                  pm_message_t message)
1058 {
1059         struct ath10k_usb *ar_usb = usb_get_intfdata(interface);
1060 
1061         ath10k_usb_flush_all(ar_usb->ar);
1062         return 0;
1063 }
1064 
1065 static int ath10k_usb_pm_resume(struct usb_interface *interface)
1066 {
1067         struct ath10k_usb *ar_usb = usb_get_intfdata(interface);
1068         struct ath10k *ar = ar_usb->ar;
1069 
1070         ath10k_usb_post_recv_transfers(ar,
1071                                        &ar_usb->pipes[ATH10K_USB_PIPE_RX_DATA]);
1072 
1073         return 0;
1074 }
1075 
1076 #else
1077 
1078 #define ath10k_usb_pm_suspend NULL
1079 #define ath10k_usb_pm_resume NULL
1080 
1081 #endif
1082 
1083 /* table of devices that work with this driver */
1084 static struct usb_device_id ath10k_usb_ids[] = {
1085         {USB_DEVICE(0x13b1, 0x0042)}, /* Linksys WUSB6100M */
1086         { /* Terminating entry */ },
1087 };
1088 
1089 MODULE_DEVICE_TABLE(usb, ath10k_usb_ids);
1090 
1091 static struct usb_driver ath10k_usb_driver = {
1092         .name = "ath10k_usb",
1093         .probe = ath10k_usb_probe,
1094         .suspend = ath10k_usb_pm_suspend,
1095         .resume = ath10k_usb_pm_resume,
1096         .disconnect = ath10k_usb_remove,
1097         .id_table = ath10k_usb_ids,
1098         .supports_autosuspend = true,
1099         .disable_hub_initiated_lpm = 1,
1100 };
1101 
1102 module_usb_driver(ath10k_usb_driver);
1103 
1104 MODULE_AUTHOR("Atheros Communications, Inc.");
1105 MODULE_DESCRIPTION("Driver support for Qualcomm Atheros 802.11ac WLAN USB devices");
1106 MODULE_LICENSE("Dual BSD/GPL");

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