root/drivers/usb/host/xhci-dbgcap.c

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

DEFINITIONS

This source file includes following definitions.
  1. dbc_dma_alloc_coherent
  2. dbc_dma_free_coherent
  3. xhci_dbc_populate_strings
  4. xhci_dbc_init_contexts
  5. xhci_dbc_giveback
  6. xhci_dbc_flush_single_request
  7. xhci_dbc_flush_endpoint_requests
  8. xhci_dbc_flush_requests
  9. dbc_alloc_request
  10. dbc_free_request
  11. xhci_dbc_queue_trb
  12. xhci_dbc_queue_bulk_tx
  13. dbc_ep_do_queue
  14. dbc_ep_queue
  15. xhci_dbc_do_eps_init
  16. xhci_dbc_eps_init
  17. xhci_dbc_eps_exit
  18. xhci_dbc_mem_init
  19. xhci_dbc_mem_cleanup
  20. xhci_do_dbc_start
  21. xhci_do_dbc_stop
  22. xhci_dbc_start
  23. xhci_dbc_stop
  24. dbc_handle_port_status
  25. dbc_handle_xfer_event
  26. xhci_dbc_do_handle_events
  27. xhci_dbc_handle_events
  28. xhci_do_dbc_exit
  29. xhci_do_dbc_init
  30. dbc_show
  31. dbc_store
  32. xhci_dbc_init
  33. xhci_dbc_exit
  34. xhci_dbc_suspend
  35. xhci_dbc_resume

   1 // SPDX-License-Identifier: GPL-2.0
   2 /**
   3  * xhci-dbgcap.c - xHCI debug capability support
   4  *
   5  * Copyright (C) 2017 Intel Corporation
   6  *
   7  * Author: Lu Baolu <baolu.lu@linux.intel.com>
   8  */
   9 #include <linux/dma-mapping.h>
  10 #include <linux/slab.h>
  11 #include <linux/nls.h>
  12 
  13 #include "xhci.h"
  14 #include "xhci-trace.h"
  15 #include "xhci-dbgcap.h"
  16 
  17 static inline void *
  18 dbc_dma_alloc_coherent(struct xhci_hcd *xhci, size_t size,
  19                        dma_addr_t *dma_handle, gfp_t flags)
  20 {
  21         void            *vaddr;
  22 
  23         vaddr = dma_alloc_coherent(xhci_to_hcd(xhci)->self.sysdev,
  24                                    size, dma_handle, flags);
  25         return vaddr;
  26 }
  27 
  28 static inline void
  29 dbc_dma_free_coherent(struct xhci_hcd *xhci, size_t size,
  30                       void *cpu_addr, dma_addr_t dma_handle)
  31 {
  32         if (cpu_addr)
  33                 dma_free_coherent(xhci_to_hcd(xhci)->self.sysdev,
  34                                   size, cpu_addr, dma_handle);
  35 }
  36 
  37 static u32 xhci_dbc_populate_strings(struct dbc_str_descs *strings)
  38 {
  39         struct usb_string_descriptor    *s_desc;
  40         u32                             string_length;
  41 
  42         /* Serial string: */
  43         s_desc = (struct usb_string_descriptor *)strings->serial;
  44         utf8s_to_utf16s(DBC_STRING_SERIAL, strlen(DBC_STRING_SERIAL),
  45                         UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
  46                         DBC_MAX_STRING_LENGTH);
  47 
  48         s_desc->bLength         = (strlen(DBC_STRING_SERIAL) + 1) * 2;
  49         s_desc->bDescriptorType = USB_DT_STRING;
  50         string_length           = s_desc->bLength;
  51         string_length           <<= 8;
  52 
  53         /* Product string: */
  54         s_desc = (struct usb_string_descriptor *)strings->product;
  55         utf8s_to_utf16s(DBC_STRING_PRODUCT, strlen(DBC_STRING_PRODUCT),
  56                         UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
  57                         DBC_MAX_STRING_LENGTH);
  58 
  59         s_desc->bLength         = (strlen(DBC_STRING_PRODUCT) + 1) * 2;
  60         s_desc->bDescriptorType = USB_DT_STRING;
  61         string_length           += s_desc->bLength;
  62         string_length           <<= 8;
  63 
  64         /* Manufacture string: */
  65         s_desc = (struct usb_string_descriptor *)strings->manufacturer;
  66         utf8s_to_utf16s(DBC_STRING_MANUFACTURER,
  67                         strlen(DBC_STRING_MANUFACTURER),
  68                         UTF16_LITTLE_ENDIAN, (wchar_t *)s_desc->wData,
  69                         DBC_MAX_STRING_LENGTH);
  70 
  71         s_desc->bLength         = (strlen(DBC_STRING_MANUFACTURER) + 1) * 2;
  72         s_desc->bDescriptorType = USB_DT_STRING;
  73         string_length           += s_desc->bLength;
  74         string_length           <<= 8;
  75 
  76         /* String0: */
  77         strings->string0[0]     = 4;
  78         strings->string0[1]     = USB_DT_STRING;
  79         strings->string0[2]     = 0x09;
  80         strings->string0[3]     = 0x04;
  81         string_length           += 4;
  82 
  83         return string_length;
  84 }
  85 
  86 static void xhci_dbc_init_contexts(struct xhci_hcd *xhci, u32 string_length)
  87 {
  88         struct xhci_dbc         *dbc;
  89         struct dbc_info_context *info;
  90         struct xhci_ep_ctx      *ep_ctx;
  91         u32                     dev_info;
  92         dma_addr_t              deq, dma;
  93         unsigned int            max_burst;
  94 
  95         dbc = xhci->dbc;
  96         if (!dbc)
  97                 return;
  98 
  99         /* Populate info Context: */
 100         info                    = (struct dbc_info_context *)dbc->ctx->bytes;
 101         dma                     = dbc->string_dma;
 102         info->string0           = cpu_to_le64(dma);
 103         info->manufacturer      = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH);
 104         info->product           = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH * 2);
 105         info->serial            = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH * 3);
 106         info->length            = cpu_to_le32(string_length);
 107 
 108         /* Populate bulk out endpoint context: */
 109         ep_ctx                  = dbc_bulkout_ctx(dbc);
 110         max_burst               = DBC_CTRL_MAXBURST(readl(&dbc->regs->control));
 111         deq                     = dbc_bulkout_enq(dbc);
 112         ep_ctx->ep_info         = 0;
 113         ep_ctx->ep_info2        = dbc_epctx_info2(BULK_OUT_EP, 1024, max_burst);
 114         ep_ctx->deq             = cpu_to_le64(deq | dbc->ring_out->cycle_state);
 115 
 116         /* Populate bulk in endpoint context: */
 117         ep_ctx                  = dbc_bulkin_ctx(dbc);
 118         deq                     = dbc_bulkin_enq(dbc);
 119         ep_ctx->ep_info         = 0;
 120         ep_ctx->ep_info2        = dbc_epctx_info2(BULK_IN_EP, 1024, max_burst);
 121         ep_ctx->deq             = cpu_to_le64(deq | dbc->ring_in->cycle_state);
 122 
 123         /* Set DbC context and info registers: */
 124         xhci_write_64(xhci, dbc->ctx->dma, &dbc->regs->dccp);
 125 
 126         dev_info = cpu_to_le32((DBC_VENDOR_ID << 16) | DBC_PROTOCOL);
 127         writel(dev_info, &dbc->regs->devinfo1);
 128 
 129         dev_info = cpu_to_le32((DBC_DEVICE_REV << 16) | DBC_PRODUCT_ID);
 130         writel(dev_info, &dbc->regs->devinfo2);
 131 }
 132 
 133 static void xhci_dbc_giveback(struct dbc_request *req, int status)
 134         __releases(&dbc->lock)
 135         __acquires(&dbc->lock)
 136 {
 137         struct dbc_ep           *dep = req->dep;
 138         struct xhci_dbc         *dbc = dep->dbc;
 139         struct xhci_hcd         *xhci = dbc->xhci;
 140         struct device           *dev = xhci_to_hcd(dbc->xhci)->self.sysdev;
 141 
 142         list_del_init(&req->list_pending);
 143         req->trb_dma = 0;
 144         req->trb = NULL;
 145 
 146         if (req->status == -EINPROGRESS)
 147                 req->status = status;
 148 
 149         trace_xhci_dbc_giveback_request(req);
 150 
 151         dma_unmap_single(dev,
 152                          req->dma,
 153                          req->length,
 154                          dbc_ep_dma_direction(dep));
 155 
 156         /* Give back the transfer request: */
 157         spin_unlock(&dbc->lock);
 158         req->complete(xhci, req);
 159         spin_lock(&dbc->lock);
 160 }
 161 
 162 static void xhci_dbc_flush_single_request(struct dbc_request *req)
 163 {
 164         union xhci_trb  *trb = req->trb;
 165 
 166         trb->generic.field[0]   = 0;
 167         trb->generic.field[1]   = 0;
 168         trb->generic.field[2]   = 0;
 169         trb->generic.field[3]   &= cpu_to_le32(TRB_CYCLE);
 170         trb->generic.field[3]   |= cpu_to_le32(TRB_TYPE(TRB_TR_NOOP));
 171 
 172         xhci_dbc_giveback(req, -ESHUTDOWN);
 173 }
 174 
 175 static void xhci_dbc_flush_endpoint_requests(struct dbc_ep *dep)
 176 {
 177         struct dbc_request      *req, *tmp;
 178 
 179         list_for_each_entry_safe(req, tmp, &dep->list_pending, list_pending)
 180                 xhci_dbc_flush_single_request(req);
 181 }
 182 
 183 static void xhci_dbc_flush_requests(struct xhci_dbc *dbc)
 184 {
 185         xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_OUT]);
 186         xhci_dbc_flush_endpoint_requests(&dbc->eps[BULK_IN]);
 187 }
 188 
 189 struct dbc_request *
 190 dbc_alloc_request(struct dbc_ep *dep, gfp_t gfp_flags)
 191 {
 192         struct dbc_request      *req;
 193 
 194         req = kzalloc(sizeof(*req), gfp_flags);
 195         if (!req)
 196                 return NULL;
 197 
 198         req->dep = dep;
 199         INIT_LIST_HEAD(&req->list_pending);
 200         INIT_LIST_HEAD(&req->list_pool);
 201         req->direction = dep->direction;
 202 
 203         trace_xhci_dbc_alloc_request(req);
 204 
 205         return req;
 206 }
 207 
 208 void
 209 dbc_free_request(struct dbc_ep *dep, struct dbc_request *req)
 210 {
 211         trace_xhci_dbc_free_request(req);
 212 
 213         kfree(req);
 214 }
 215 
 216 static void
 217 xhci_dbc_queue_trb(struct xhci_ring *ring, u32 field1,
 218                    u32 field2, u32 field3, u32 field4)
 219 {
 220         union xhci_trb          *trb, *next;
 221 
 222         trb = ring->enqueue;
 223         trb->generic.field[0]   = cpu_to_le32(field1);
 224         trb->generic.field[1]   = cpu_to_le32(field2);
 225         trb->generic.field[2]   = cpu_to_le32(field3);
 226         trb->generic.field[3]   = cpu_to_le32(field4);
 227 
 228         trace_xhci_dbc_gadget_ep_queue(ring, &trb->generic);
 229 
 230         ring->num_trbs_free--;
 231         next = ++(ring->enqueue);
 232         if (TRB_TYPE_LINK_LE32(next->link.control)) {
 233                 next->link.control ^= cpu_to_le32(TRB_CYCLE);
 234                 ring->enqueue = ring->enq_seg->trbs;
 235                 ring->cycle_state ^= 1;
 236         }
 237 }
 238 
 239 static int xhci_dbc_queue_bulk_tx(struct dbc_ep *dep,
 240                                   struct dbc_request *req)
 241 {
 242         u64                     addr;
 243         union xhci_trb          *trb;
 244         unsigned int            num_trbs;
 245         struct xhci_dbc         *dbc = dep->dbc;
 246         struct xhci_ring        *ring = dep->ring;
 247         u32                     length, control, cycle;
 248 
 249         num_trbs = count_trbs(req->dma, req->length);
 250         WARN_ON(num_trbs != 1);
 251         if (ring->num_trbs_free < num_trbs)
 252                 return -EBUSY;
 253 
 254         addr    = req->dma;
 255         trb     = ring->enqueue;
 256         cycle   = ring->cycle_state;
 257         length  = TRB_LEN(req->length);
 258         control = TRB_TYPE(TRB_NORMAL) | TRB_IOC;
 259 
 260         if (cycle)
 261                 control &= cpu_to_le32(~TRB_CYCLE);
 262         else
 263                 control |= cpu_to_le32(TRB_CYCLE);
 264 
 265         req->trb = ring->enqueue;
 266         req->trb_dma = xhci_trb_virt_to_dma(ring->enq_seg, ring->enqueue);
 267         xhci_dbc_queue_trb(ring,
 268                            lower_32_bits(addr),
 269                            upper_32_bits(addr),
 270                            length, control);
 271 
 272         /*
 273          * Add a barrier between writes of trb fields and flipping
 274          * the cycle bit:
 275          */
 276         wmb();
 277 
 278         if (cycle)
 279                 trb->generic.field[3] |= cpu_to_le32(TRB_CYCLE);
 280         else
 281                 trb->generic.field[3] &= cpu_to_le32(~TRB_CYCLE);
 282 
 283         writel(DBC_DOOR_BELL_TARGET(dep->direction), &dbc->regs->doorbell);
 284 
 285         return 0;
 286 }
 287 
 288 static int
 289 dbc_ep_do_queue(struct dbc_ep *dep, struct dbc_request *req)
 290 {
 291         int                     ret;
 292         struct device           *dev;
 293         struct xhci_dbc         *dbc = dep->dbc;
 294         struct xhci_hcd         *xhci = dbc->xhci;
 295 
 296         dev = xhci_to_hcd(xhci)->self.sysdev;
 297 
 298         if (!req->length || !req->buf)
 299                 return -EINVAL;
 300 
 301         req->actual             = 0;
 302         req->status             = -EINPROGRESS;
 303 
 304         req->dma = dma_map_single(dev,
 305                                   req->buf,
 306                                   req->length,
 307                                   dbc_ep_dma_direction(dep));
 308         if (dma_mapping_error(dev, req->dma)) {
 309                 xhci_err(xhci, "failed to map buffer\n");
 310                 return -EFAULT;
 311         }
 312 
 313         ret = xhci_dbc_queue_bulk_tx(dep, req);
 314         if (ret) {
 315                 xhci_err(xhci, "failed to queue trbs\n");
 316                 dma_unmap_single(dev,
 317                                  req->dma,
 318                                  req->length,
 319                                  dbc_ep_dma_direction(dep));
 320                 return -EFAULT;
 321         }
 322 
 323         list_add_tail(&req->list_pending, &dep->list_pending);
 324 
 325         return 0;
 326 }
 327 
 328 int dbc_ep_queue(struct dbc_ep *dep, struct dbc_request *req,
 329                  gfp_t gfp_flags)
 330 {
 331         unsigned long           flags;
 332         struct xhci_dbc         *dbc = dep->dbc;
 333         int                     ret = -ESHUTDOWN;
 334 
 335         spin_lock_irqsave(&dbc->lock, flags);
 336         if (dbc->state == DS_CONFIGURED)
 337                 ret = dbc_ep_do_queue(dep, req);
 338         spin_unlock_irqrestore(&dbc->lock, flags);
 339 
 340         mod_delayed_work(system_wq, &dbc->event_work, 0);
 341 
 342         trace_xhci_dbc_queue_request(req);
 343 
 344         return ret;
 345 }
 346 
 347 static inline void xhci_dbc_do_eps_init(struct xhci_hcd *xhci, bool direction)
 348 {
 349         struct dbc_ep           *dep;
 350         struct xhci_dbc         *dbc = xhci->dbc;
 351 
 352         dep                     = &dbc->eps[direction];
 353         dep->dbc                = dbc;
 354         dep->direction          = direction;
 355         dep->ring               = direction ? dbc->ring_in : dbc->ring_out;
 356 
 357         INIT_LIST_HEAD(&dep->list_pending);
 358 }
 359 
 360 static void xhci_dbc_eps_init(struct xhci_hcd *xhci)
 361 {
 362         xhci_dbc_do_eps_init(xhci, BULK_OUT);
 363         xhci_dbc_do_eps_init(xhci, BULK_IN);
 364 }
 365 
 366 static void xhci_dbc_eps_exit(struct xhci_hcd *xhci)
 367 {
 368         struct xhci_dbc         *dbc = xhci->dbc;
 369 
 370         memset(dbc->eps, 0, sizeof(struct dbc_ep) * ARRAY_SIZE(dbc->eps));
 371 }
 372 
 373 static int xhci_dbc_mem_init(struct xhci_hcd *xhci, gfp_t flags)
 374 {
 375         int                     ret;
 376         dma_addr_t              deq;
 377         u32                     string_length;
 378         struct xhci_dbc         *dbc = xhci->dbc;
 379 
 380         /* Allocate various rings for events and transfers: */
 381         dbc->ring_evt = xhci_ring_alloc(xhci, 1, 1, TYPE_EVENT, 0, flags);
 382         if (!dbc->ring_evt)
 383                 goto evt_fail;
 384 
 385         dbc->ring_in = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags);
 386         if (!dbc->ring_in)
 387                 goto in_fail;
 388 
 389         dbc->ring_out = xhci_ring_alloc(xhci, 1, 1, TYPE_BULK, 0, flags);
 390         if (!dbc->ring_out)
 391                 goto out_fail;
 392 
 393         /* Allocate and populate ERST: */
 394         ret = xhci_alloc_erst(xhci, dbc->ring_evt, &dbc->erst, flags);
 395         if (ret)
 396                 goto erst_fail;
 397 
 398         /* Allocate context data structure: */
 399         dbc->ctx = xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_DEVICE, flags);
 400         if (!dbc->ctx)
 401                 goto ctx_fail;
 402 
 403         /* Allocate the string table: */
 404         dbc->string_size = sizeof(struct dbc_str_descs);
 405         dbc->string = dbc_dma_alloc_coherent(xhci,
 406                                              dbc->string_size,
 407                                              &dbc->string_dma,
 408                                              flags);
 409         if (!dbc->string)
 410                 goto string_fail;
 411 
 412         /* Setup ERST register: */
 413         writel(dbc->erst.erst_size, &dbc->regs->ersts);
 414         xhci_write_64(xhci, dbc->erst.erst_dma_addr, &dbc->regs->erstba);
 415         deq = xhci_trb_virt_to_dma(dbc->ring_evt->deq_seg,
 416                                    dbc->ring_evt->dequeue);
 417         xhci_write_64(xhci, deq, &dbc->regs->erdp);
 418 
 419         /* Setup strings and contexts: */
 420         string_length = xhci_dbc_populate_strings(dbc->string);
 421         xhci_dbc_init_contexts(xhci, string_length);
 422 
 423         xhci_dbc_eps_init(xhci);
 424         dbc->state = DS_INITIALIZED;
 425 
 426         return 0;
 427 
 428 string_fail:
 429         xhci_free_container_ctx(xhci, dbc->ctx);
 430         dbc->ctx = NULL;
 431 ctx_fail:
 432         xhci_free_erst(xhci, &dbc->erst);
 433 erst_fail:
 434         xhci_ring_free(xhci, dbc->ring_out);
 435         dbc->ring_out = NULL;
 436 out_fail:
 437         xhci_ring_free(xhci, dbc->ring_in);
 438         dbc->ring_in = NULL;
 439 in_fail:
 440         xhci_ring_free(xhci, dbc->ring_evt);
 441         dbc->ring_evt = NULL;
 442 evt_fail:
 443         return -ENOMEM;
 444 }
 445 
 446 static void xhci_dbc_mem_cleanup(struct xhci_hcd *xhci)
 447 {
 448         struct xhci_dbc         *dbc = xhci->dbc;
 449 
 450         if (!dbc)
 451                 return;
 452 
 453         xhci_dbc_eps_exit(xhci);
 454 
 455         if (dbc->string) {
 456                 dbc_dma_free_coherent(xhci,
 457                                       dbc->string_size,
 458                                       dbc->string, dbc->string_dma);
 459                 dbc->string = NULL;
 460         }
 461 
 462         xhci_free_container_ctx(xhci, dbc->ctx);
 463         dbc->ctx = NULL;
 464 
 465         xhci_free_erst(xhci, &dbc->erst);
 466         xhci_ring_free(xhci, dbc->ring_out);
 467         xhci_ring_free(xhci, dbc->ring_in);
 468         xhci_ring_free(xhci, dbc->ring_evt);
 469         dbc->ring_in = NULL;
 470         dbc->ring_out = NULL;
 471         dbc->ring_evt = NULL;
 472 }
 473 
 474 static int xhci_do_dbc_start(struct xhci_hcd *xhci)
 475 {
 476         int                     ret;
 477         u32                     ctrl;
 478         struct xhci_dbc         *dbc = xhci->dbc;
 479 
 480         if (dbc->state != DS_DISABLED)
 481                 return -EINVAL;
 482 
 483         writel(0, &dbc->regs->control);
 484         ret = xhci_handshake(&dbc->regs->control,
 485                              DBC_CTRL_DBC_ENABLE,
 486                              0, 1000);
 487         if (ret)
 488                 return ret;
 489 
 490         ret = xhci_dbc_mem_init(xhci, GFP_ATOMIC);
 491         if (ret)
 492                 return ret;
 493 
 494         ctrl = readl(&dbc->regs->control);
 495         writel(ctrl | DBC_CTRL_DBC_ENABLE | DBC_CTRL_PORT_ENABLE,
 496                &dbc->regs->control);
 497         ret = xhci_handshake(&dbc->regs->control,
 498                              DBC_CTRL_DBC_ENABLE,
 499                              DBC_CTRL_DBC_ENABLE, 1000);
 500         if (ret)
 501                 return ret;
 502 
 503         dbc->state = DS_ENABLED;
 504 
 505         return 0;
 506 }
 507 
 508 static int xhci_do_dbc_stop(struct xhci_hcd *xhci)
 509 {
 510         struct xhci_dbc         *dbc = xhci->dbc;
 511 
 512         if (dbc->state == DS_DISABLED)
 513                 return -1;
 514 
 515         writel(0, &dbc->regs->control);
 516         dbc->state = DS_DISABLED;
 517 
 518         return 0;
 519 }
 520 
 521 static int xhci_dbc_start(struct xhci_hcd *xhci)
 522 {
 523         int                     ret;
 524         unsigned long           flags;
 525         struct xhci_dbc         *dbc = xhci->dbc;
 526 
 527         WARN_ON(!dbc);
 528 
 529         pm_runtime_get_sync(xhci_to_hcd(xhci)->self.controller);
 530 
 531         spin_lock_irqsave(&dbc->lock, flags);
 532         ret = xhci_do_dbc_start(xhci);
 533         spin_unlock_irqrestore(&dbc->lock, flags);
 534 
 535         if (ret) {
 536                 pm_runtime_put(xhci_to_hcd(xhci)->self.controller);
 537                 return ret;
 538         }
 539 
 540         return mod_delayed_work(system_wq, &dbc->event_work, 1);
 541 }
 542 
 543 static void xhci_dbc_stop(struct xhci_hcd *xhci)
 544 {
 545         int ret;
 546         unsigned long           flags;
 547         struct xhci_dbc         *dbc = xhci->dbc;
 548         struct dbc_port         *port = &dbc->port;
 549 
 550         WARN_ON(!dbc);
 551 
 552         cancel_delayed_work_sync(&dbc->event_work);
 553 
 554         if (port->registered)
 555                 xhci_dbc_tty_unregister_device(xhci);
 556 
 557         spin_lock_irqsave(&dbc->lock, flags);
 558         ret = xhci_do_dbc_stop(xhci);
 559         spin_unlock_irqrestore(&dbc->lock, flags);
 560 
 561         if (!ret) {
 562                 xhci_dbc_mem_cleanup(xhci);
 563                 pm_runtime_put_sync(xhci_to_hcd(xhci)->self.controller);
 564         }
 565 }
 566 
 567 static void
 568 dbc_handle_port_status(struct xhci_hcd *xhci, union xhci_trb *event)
 569 {
 570         u32                     portsc;
 571         struct xhci_dbc         *dbc = xhci->dbc;
 572 
 573         portsc = readl(&dbc->regs->portsc);
 574         if (portsc & DBC_PORTSC_CONN_CHANGE)
 575                 xhci_info(xhci, "DbC port connect change\n");
 576 
 577         if (portsc & DBC_PORTSC_RESET_CHANGE)
 578                 xhci_info(xhci, "DbC port reset change\n");
 579 
 580         if (portsc & DBC_PORTSC_LINK_CHANGE)
 581                 xhci_info(xhci, "DbC port link status change\n");
 582 
 583         if (portsc & DBC_PORTSC_CONFIG_CHANGE)
 584                 xhci_info(xhci, "DbC config error change\n");
 585 
 586         /* Port reset change bit will be cleared in other place: */
 587         writel(portsc & ~DBC_PORTSC_RESET_CHANGE, &dbc->regs->portsc);
 588 }
 589 
 590 static void dbc_handle_xfer_event(struct xhci_hcd *xhci, union xhci_trb *event)
 591 {
 592         struct dbc_ep           *dep;
 593         struct xhci_ring        *ring;
 594         int                     ep_id;
 595         int                     status;
 596         u32                     comp_code;
 597         size_t                  remain_length;
 598         struct dbc_request      *req = NULL, *r;
 599 
 600         comp_code       = GET_COMP_CODE(le32_to_cpu(event->generic.field[2]));
 601         remain_length   = EVENT_TRB_LEN(le32_to_cpu(event->generic.field[2]));
 602         ep_id           = TRB_TO_EP_ID(le32_to_cpu(event->generic.field[3]));
 603         dep             = (ep_id == EPID_OUT) ?
 604                                 get_out_ep(xhci) : get_in_ep(xhci);
 605         ring            = dep->ring;
 606 
 607         switch (comp_code) {
 608         case COMP_SUCCESS:
 609                 remain_length = 0;
 610         /* FALLTHROUGH */
 611         case COMP_SHORT_PACKET:
 612                 status = 0;
 613                 break;
 614         case COMP_TRB_ERROR:
 615         case COMP_BABBLE_DETECTED_ERROR:
 616         case COMP_USB_TRANSACTION_ERROR:
 617         case COMP_STALL_ERROR:
 618                 xhci_warn(xhci, "tx error %d detected\n", comp_code);
 619                 status = -comp_code;
 620                 break;
 621         default:
 622                 xhci_err(xhci, "unknown tx error %d\n", comp_code);
 623                 status = -comp_code;
 624                 break;
 625         }
 626 
 627         /* Match the pending request: */
 628         list_for_each_entry(r, &dep->list_pending, list_pending) {
 629                 if (r->trb_dma == event->trans_event.buffer) {
 630                         req = r;
 631                         break;
 632                 }
 633         }
 634 
 635         if (!req) {
 636                 xhci_warn(xhci, "no matched request\n");
 637                 return;
 638         }
 639 
 640         trace_xhci_dbc_handle_transfer(ring, &req->trb->generic);
 641 
 642         ring->num_trbs_free++;
 643         req->actual = req->length - remain_length;
 644         xhci_dbc_giveback(req, status);
 645 }
 646 
 647 static enum evtreturn xhci_dbc_do_handle_events(struct xhci_dbc *dbc)
 648 {
 649         dma_addr_t              deq;
 650         struct dbc_ep           *dep;
 651         union xhci_trb          *evt;
 652         u32                     ctrl, portsc;
 653         struct xhci_hcd         *xhci = dbc->xhci;
 654         bool                    update_erdp = false;
 655 
 656         /* DbC state machine: */
 657         switch (dbc->state) {
 658         case DS_DISABLED:
 659         case DS_INITIALIZED:
 660 
 661                 return EVT_ERR;
 662         case DS_ENABLED:
 663                 portsc = readl(&dbc->regs->portsc);
 664                 if (portsc & DBC_PORTSC_CONN_STATUS) {
 665                         dbc->state = DS_CONNECTED;
 666                         xhci_info(xhci, "DbC connected\n");
 667                 }
 668 
 669                 return EVT_DONE;
 670         case DS_CONNECTED:
 671                 ctrl = readl(&dbc->regs->control);
 672                 if (ctrl & DBC_CTRL_DBC_RUN) {
 673                         dbc->state = DS_CONFIGURED;
 674                         xhci_info(xhci, "DbC configured\n");
 675                         portsc = readl(&dbc->regs->portsc);
 676                         writel(portsc, &dbc->regs->portsc);
 677                         return EVT_GSER;
 678                 }
 679 
 680                 return EVT_DONE;
 681         case DS_CONFIGURED:
 682                 /* Handle cable unplug event: */
 683                 portsc = readl(&dbc->regs->portsc);
 684                 if (!(portsc & DBC_PORTSC_PORT_ENABLED) &&
 685                     !(portsc & DBC_PORTSC_CONN_STATUS)) {
 686                         xhci_info(xhci, "DbC cable unplugged\n");
 687                         dbc->state = DS_ENABLED;
 688                         xhci_dbc_flush_requests(dbc);
 689 
 690                         return EVT_DISC;
 691                 }
 692 
 693                 /* Handle debug port reset event: */
 694                 if (portsc & DBC_PORTSC_RESET_CHANGE) {
 695                         xhci_info(xhci, "DbC port reset\n");
 696                         writel(portsc, &dbc->regs->portsc);
 697                         dbc->state = DS_ENABLED;
 698                         xhci_dbc_flush_requests(dbc);
 699 
 700                         return EVT_DISC;
 701                 }
 702 
 703                 /* Handle endpoint stall event: */
 704                 ctrl = readl(&dbc->regs->control);
 705                 if ((ctrl & DBC_CTRL_HALT_IN_TR) ||
 706                     (ctrl & DBC_CTRL_HALT_OUT_TR)) {
 707                         xhci_info(xhci, "DbC Endpoint stall\n");
 708                         dbc->state = DS_STALLED;
 709 
 710                         if (ctrl & DBC_CTRL_HALT_IN_TR) {
 711                                 dep = get_in_ep(xhci);
 712                                 xhci_dbc_flush_endpoint_requests(dep);
 713                         }
 714 
 715                         if (ctrl & DBC_CTRL_HALT_OUT_TR) {
 716                                 dep = get_out_ep(xhci);
 717                                 xhci_dbc_flush_endpoint_requests(dep);
 718                         }
 719 
 720                         return EVT_DONE;
 721                 }
 722 
 723                 /* Clear DbC run change bit: */
 724                 if (ctrl & DBC_CTRL_DBC_RUN_CHANGE) {
 725                         writel(ctrl, &dbc->regs->control);
 726                         ctrl = readl(&dbc->regs->control);
 727                 }
 728 
 729                 break;
 730         case DS_STALLED:
 731                 ctrl = readl(&dbc->regs->control);
 732                 if (!(ctrl & DBC_CTRL_HALT_IN_TR) &&
 733                     !(ctrl & DBC_CTRL_HALT_OUT_TR) &&
 734                     (ctrl & DBC_CTRL_DBC_RUN)) {
 735                         dbc->state = DS_CONFIGURED;
 736                         break;
 737                 }
 738 
 739                 return EVT_DONE;
 740         default:
 741                 xhci_err(xhci, "Unknown DbC state %d\n", dbc->state);
 742                 break;
 743         }
 744 
 745         /* Handle the events in the event ring: */
 746         evt = dbc->ring_evt->dequeue;
 747         while ((le32_to_cpu(evt->event_cmd.flags) & TRB_CYCLE) ==
 748                         dbc->ring_evt->cycle_state) {
 749                 /*
 750                  * Add a barrier between reading the cycle flag and any
 751                  * reads of the event's flags/data below:
 752                  */
 753                 rmb();
 754 
 755                 trace_xhci_dbc_handle_event(dbc->ring_evt, &evt->generic);
 756 
 757                 switch (le32_to_cpu(evt->event_cmd.flags) & TRB_TYPE_BITMASK) {
 758                 case TRB_TYPE(TRB_PORT_STATUS):
 759                         dbc_handle_port_status(xhci, evt);
 760                         break;
 761                 case TRB_TYPE(TRB_TRANSFER):
 762                         dbc_handle_xfer_event(xhci, evt);
 763                         break;
 764                 default:
 765                         break;
 766                 }
 767 
 768                 inc_deq(xhci, dbc->ring_evt);
 769                 evt = dbc->ring_evt->dequeue;
 770                 update_erdp = true;
 771         }
 772 
 773         /* Update event ring dequeue pointer: */
 774         if (update_erdp) {
 775                 deq = xhci_trb_virt_to_dma(dbc->ring_evt->deq_seg,
 776                                            dbc->ring_evt->dequeue);
 777                 xhci_write_64(xhci, deq, &dbc->regs->erdp);
 778         }
 779 
 780         return EVT_DONE;
 781 }
 782 
 783 static void xhci_dbc_handle_events(struct work_struct *work)
 784 {
 785         int                     ret;
 786         enum evtreturn          evtr;
 787         struct xhci_dbc         *dbc;
 788         unsigned long           flags;
 789         struct xhci_hcd         *xhci;
 790 
 791         dbc = container_of(to_delayed_work(work), struct xhci_dbc, event_work);
 792         xhci = dbc->xhci;
 793 
 794         spin_lock_irqsave(&dbc->lock, flags);
 795         evtr = xhci_dbc_do_handle_events(dbc);
 796         spin_unlock_irqrestore(&dbc->lock, flags);
 797 
 798         switch (evtr) {
 799         case EVT_GSER:
 800                 ret = xhci_dbc_tty_register_device(xhci);
 801                 if (ret) {
 802                         xhci_err(xhci, "failed to alloc tty device\n");
 803                         break;
 804                 }
 805 
 806                 xhci_info(xhci, "DbC now attached to /dev/ttyDBC0\n");
 807                 break;
 808         case EVT_DISC:
 809                 xhci_dbc_tty_unregister_device(xhci);
 810                 break;
 811         case EVT_DONE:
 812                 break;
 813         default:
 814                 xhci_info(xhci, "stop handling dbc events\n");
 815                 return;
 816         }
 817 
 818         mod_delayed_work(system_wq, &dbc->event_work, 1);
 819 }
 820 
 821 static void xhci_do_dbc_exit(struct xhci_hcd *xhci)
 822 {
 823         unsigned long           flags;
 824 
 825         spin_lock_irqsave(&xhci->lock, flags);
 826         kfree(xhci->dbc);
 827         xhci->dbc = NULL;
 828         spin_unlock_irqrestore(&xhci->lock, flags);
 829 }
 830 
 831 static int xhci_do_dbc_init(struct xhci_hcd *xhci)
 832 {
 833         u32                     reg;
 834         struct xhci_dbc         *dbc;
 835         unsigned long           flags;
 836         void __iomem            *base;
 837         int                     dbc_cap_offs;
 838 
 839         base = &xhci->cap_regs->hc_capbase;
 840         dbc_cap_offs = xhci_find_next_ext_cap(base, 0, XHCI_EXT_CAPS_DEBUG);
 841         if (!dbc_cap_offs)
 842                 return -ENODEV;
 843 
 844         dbc = kzalloc(sizeof(*dbc), GFP_KERNEL);
 845         if (!dbc)
 846                 return -ENOMEM;
 847 
 848         dbc->regs = base + dbc_cap_offs;
 849 
 850         /* We will avoid using DbC in xhci driver if it's in use. */
 851         reg = readl(&dbc->regs->control);
 852         if (reg & DBC_CTRL_DBC_ENABLE) {
 853                 kfree(dbc);
 854                 return -EBUSY;
 855         }
 856 
 857         spin_lock_irqsave(&xhci->lock, flags);
 858         if (xhci->dbc) {
 859                 spin_unlock_irqrestore(&xhci->lock, flags);
 860                 kfree(dbc);
 861                 return -EBUSY;
 862         }
 863         xhci->dbc = dbc;
 864         spin_unlock_irqrestore(&xhci->lock, flags);
 865 
 866         dbc->xhci = xhci;
 867         INIT_DELAYED_WORK(&dbc->event_work, xhci_dbc_handle_events);
 868         spin_lock_init(&dbc->lock);
 869 
 870         return 0;
 871 }
 872 
 873 static ssize_t dbc_show(struct device *dev,
 874                         struct device_attribute *attr,
 875                         char *buf)
 876 {
 877         const char              *p;
 878         struct xhci_dbc         *dbc;
 879         struct xhci_hcd         *xhci;
 880 
 881         xhci = hcd_to_xhci(dev_get_drvdata(dev));
 882         dbc = xhci->dbc;
 883 
 884         switch (dbc->state) {
 885         case DS_DISABLED:
 886                 p = "disabled";
 887                 break;
 888         case DS_INITIALIZED:
 889                 p = "initialized";
 890                 break;
 891         case DS_ENABLED:
 892                 p = "enabled";
 893                 break;
 894         case DS_CONNECTED:
 895                 p = "connected";
 896                 break;
 897         case DS_CONFIGURED:
 898                 p = "configured";
 899                 break;
 900         case DS_STALLED:
 901                 p = "stalled";
 902                 break;
 903         default:
 904                 p = "unknown";
 905         }
 906 
 907         return sprintf(buf, "%s\n", p);
 908 }
 909 
 910 static ssize_t dbc_store(struct device *dev,
 911                          struct device_attribute *attr,
 912                          const char *buf, size_t count)
 913 {
 914         struct xhci_hcd         *xhci;
 915 
 916         xhci = hcd_to_xhci(dev_get_drvdata(dev));
 917 
 918         if (!strncmp(buf, "enable", 6))
 919                 xhci_dbc_start(xhci);
 920         else if (!strncmp(buf, "disable", 7))
 921                 xhci_dbc_stop(xhci);
 922         else
 923                 return -EINVAL;
 924 
 925         return count;
 926 }
 927 
 928 static DEVICE_ATTR_RW(dbc);
 929 
 930 int xhci_dbc_init(struct xhci_hcd *xhci)
 931 {
 932         int                     ret;
 933         struct device           *dev = xhci_to_hcd(xhci)->self.controller;
 934 
 935         ret = xhci_do_dbc_init(xhci);
 936         if (ret)
 937                 goto init_err3;
 938 
 939         ret = xhci_dbc_tty_register_driver(xhci);
 940         if (ret)
 941                 goto init_err2;
 942 
 943         ret = device_create_file(dev, &dev_attr_dbc);
 944         if (ret)
 945                 goto init_err1;
 946 
 947         return 0;
 948 
 949 init_err1:
 950         xhci_dbc_tty_unregister_driver();
 951 init_err2:
 952         xhci_do_dbc_exit(xhci);
 953 init_err3:
 954         return ret;
 955 }
 956 
 957 void xhci_dbc_exit(struct xhci_hcd *xhci)
 958 {
 959         struct device           *dev = xhci_to_hcd(xhci)->self.controller;
 960 
 961         if (!xhci->dbc)
 962                 return;
 963 
 964         device_remove_file(dev, &dev_attr_dbc);
 965         xhci_dbc_tty_unregister_driver();
 966         xhci_dbc_stop(xhci);
 967         xhci_do_dbc_exit(xhci);
 968 }
 969 
 970 #ifdef CONFIG_PM
 971 int xhci_dbc_suspend(struct xhci_hcd *xhci)
 972 {
 973         struct xhci_dbc         *dbc = xhci->dbc;
 974 
 975         if (!dbc)
 976                 return 0;
 977 
 978         if (dbc->state == DS_CONFIGURED)
 979                 dbc->resume_required = 1;
 980 
 981         xhci_dbc_stop(xhci);
 982 
 983         return 0;
 984 }
 985 
 986 int xhci_dbc_resume(struct xhci_hcd *xhci)
 987 {
 988         int                     ret = 0;
 989         struct xhci_dbc         *dbc = xhci->dbc;
 990 
 991         if (!dbc)
 992                 return 0;
 993 
 994         if (dbc->resume_required) {
 995                 dbc->resume_required = 0;
 996                 xhci_dbc_start(xhci);
 997         }
 998 
 999         return ret;
1000 }
1001 #endif /* CONFIG_PM */

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