From: kernel test robot <lkp@intel.com>
To: "Bjørn Mork" <bjorn@mork.no>, "Mathias Nyman" <mathias.nyman@intel.com>
Cc: kbuild-all@lists.01.org, linux-usb@vger.kernel.org,
"Jonathan Bell" <jonathan@raspberrypi.org>,
stable@vger.kernel.org, "Bjørn Mork" <bjorn@mork.no>
Subject: Re: [PATCH] xhci: add quirk for host controllers that don't update endpoint DCS
Date: Fri, 2 Jul 2021 16:57:33 +0800 [thread overview]
Message-ID: <202107021602.N49dsX2f-lkp@intel.com> (raw)
In-Reply-To: <20210702071338.42777-1-bjorn@mork.no>
[-- Attachment #1: Type: text/plain, Size: 8537 bytes --]
Hi "Bjørn,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on usb/usb-testing]
[also build test ERROR on v5.13 next-20210701]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Bj-rn-Mork/xhci-add-quirk-for-host-controllers-that-don-t-update-endpoint-DCS/20210702-151445
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: riscv-randconfig-r012-20210702 (attached as .config)
compiler: riscv32-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/61088f366a5c42caf8ce20c87355b61efc1b175d
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Bj-rn-Mork/xhci-add-quirk-for-host-controllers-that-don-t-update-endpoint-DCS/20210702-151445
git checkout 61088f366a5c42caf8ce20c87355b61efc1b175d
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross O=build_dir ARCH=riscv SHELL=/bin/bash drivers/usb/host/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
drivers/usb/host/xhci-ring.c: In function 'xhci_move_dequeue_past_td':
>> drivers/usb/host/xhci-ring.c:613:32: error: 'cur_td' undeclared (first use in this function)
613 | halted_seg = trb_in_td(xhci, cur_td->start_seg,
| ^~~~~~
drivers/usb/host/xhci-ring.c:613:32: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/usb/host/xhci-ring.c:620:3: error: 'state' undeclared (first use in this function); did you mean 'statx'?
620 | state->new_cycle_state = halted_trb->generic.field[3] & 0x1;
| ^~~~~
| statx
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for LOCKDEP
Depends on DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT && (FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86)
Selected by
- DEBUG_LOCK_ALLOC && DEBUG_KERNEL && LOCK_DEBUGGING_SUPPORT
vim +/cur_td +613 drivers/usb/host/xhci-ring.c
552
553 static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
554 unsigned int slot_id, unsigned int ep_index,
555 unsigned int stream_id, struct xhci_td *td)
556 {
557 struct xhci_virt_device *dev = xhci->devs[slot_id];
558 struct xhci_virt_ep *ep = &dev->eps[ep_index];
559 struct xhci_ring *ep_ring;
560 struct xhci_command *cmd;
561 struct xhci_segment *new_seg;
562 struct xhci_segment *halted_seg = NULL;
563 union xhci_trb *new_deq;
564 int new_cycle;
565 union xhci_trb *halted_trb;
566 int index = 0;
567 dma_addr_t addr;
568 u64 hw_dequeue;
569 bool cycle_found = false;
570 bool td_last_trb_found = false;
571 u32 trb_sct = 0;
572 int ret;
573
574 ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id,
575 ep_index, stream_id);
576 if (!ep_ring) {
577 xhci_warn(xhci, "WARN can't find new dequeue, invalid stream ID %u\n",
578 stream_id);
579 return -ENODEV;
580 }
581 /*
582 * A cancelled TD can complete with a stall if HW cached the trb.
583 * In this case driver can't find td, but if the ring is empty we
584 * can move the dequeue pointer to the current enqueue position.
585 * We shouldn't hit this anymore as cached cancelled TRBs are given back
586 * after clearing the cache, but be on the safe side and keep it anyway
587 */
588 if (!td) {
589 if (list_empty(&ep_ring->td_list)) {
590 new_seg = ep_ring->enq_seg;
591 new_deq = ep_ring->enqueue;
592 new_cycle = ep_ring->cycle_state;
593 xhci_dbg(xhci, "ep ring empty, Set new dequeue = enqueue");
594 goto deq_found;
595 } else {
596 xhci_warn(xhci, "Can't find new dequeue state, missing td\n");
597 return -EINVAL;
598 }
599 }
600
601 hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id);
602 new_seg = ep_ring->deq_seg;
603 new_deq = ep_ring->dequeue;
604 new_cycle = hw_dequeue & 0x1;
605
606 /*
607 * Quirk: xHC write-back of the DCS field in the hardware dequeue
608 * pointer is wrong - use the cycle state of the TRB pointed to by
609 * the dequeue pointer.
610 */
611 if (xhci->quirks & XHCI_EP_CTX_BROKEN_DCS &&
612 !(ep->ep_state & EP_HAS_STREAMS))
> 613 halted_seg = trb_in_td(xhci, cur_td->start_seg,
614 cur_td->first_trb, cur_td->last_trb,
615 hw_dequeue & ~0xf, false);
616 if (halted_seg) {
617 index = ((dma_addr_t)(hw_dequeue & ~0xf) - halted_seg->dma) /
618 sizeof(*halted_trb);
619 halted_trb = &halted_seg->trbs[index];
> 620 state->new_cycle_state = halted_trb->generic.field[3] & 0x1;
621 xhci_dbg(xhci, "Endpoint DCS = %d TRB index = %d cycle = %d\n",
622 (u8)(hw_dequeue & 0x1), index,
623 state->new_cycle_state);
624 } else {
625 state->new_cycle_state = hw_dequeue & 0x1;
626 }
627 state->stream_id = stream_id;
628
629 /*
630 * We want to find the pointer, segment and cycle state of the new trb
631 * (the one after current TD's last_trb). We know the cycle state at
632 * hw_dequeue, so walk the ring until both hw_dequeue and last_trb are
633 * found.
634 */
635 do {
636 if (!cycle_found && xhci_trb_virt_to_dma(new_seg, new_deq)
637 == (dma_addr_t)(hw_dequeue & ~0xf)) {
638 cycle_found = true;
639 if (td_last_trb_found)
640 break;
641 }
642 if (new_deq == td->last_trb)
643 td_last_trb_found = true;
644
645 if (cycle_found && trb_is_link(new_deq) &&
646 link_trb_toggles_cycle(new_deq))
647 new_cycle ^= 0x1;
648
649 next_trb(xhci, ep_ring, &new_seg, &new_deq);
650
651 /* Search wrapped around, bail out */
652 if (new_deq == ep->ring->dequeue) {
653 xhci_err(xhci, "Error: Failed finding new dequeue state\n");
654 return -EINVAL;
655 }
656
657 } while (!cycle_found || !td_last_trb_found);
658
659 deq_found:
660
661 /* Don't update the ring cycle state for the producer (us). */
662 addr = xhci_trb_virt_to_dma(new_seg, new_deq);
663 if (addr == 0) {
664 xhci_warn(xhci, "Can't find dma of new dequeue ptr\n");
665 xhci_warn(xhci, "deq seg = %p, deq ptr = %p\n", new_seg, new_deq);
666 return -EINVAL;
667 }
668
669 if ((ep->ep_state & SET_DEQ_PENDING)) {
670 xhci_warn(xhci, "Set TR Deq already pending, don't submit for 0x%pad\n",
671 &addr);
672 return -EBUSY;
673 }
674
675 /* This function gets called from contexts where it cannot sleep */
676 cmd = xhci_alloc_command(xhci, false, GFP_ATOMIC);
677 if (!cmd) {
678 xhci_warn(xhci, "Can't alloc Set TR Deq cmd 0x%pad\n", &addr);
679 return -ENOMEM;
680 }
681
682 if (stream_id)
683 trb_sct = SCT_FOR_TRB(SCT_PRI_TR);
684 ret = queue_command(xhci, cmd,
685 lower_32_bits(addr) | trb_sct | new_cycle,
686 upper_32_bits(addr),
687 STREAM_ID_FOR_TRB(stream_id), SLOT_ID_FOR_TRB(slot_id) |
688 EP_ID_FOR_TRB(ep_index) | TRB_TYPE(TRB_SET_DEQ), false);
689 if (ret < 0) {
690 xhci_free_command(xhci, cmd);
691 return ret;
692 }
693 ep->queued_deq_seg = new_seg;
694 ep->queued_deq_ptr = new_deq;
695
696 xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb,
697 "Set TR Deq ptr 0x%llx, cycle %u\n", addr, new_cycle);
698
699 /* Stop the TD queueing code from ringing the doorbell until
700 * this command completes. The HC won't set the dequeue pointer
701 * if the ring is running, and ringing the doorbell starts the
702 * ring running.
703 */
704 ep->ep_state |= SET_DEQ_PENDING;
705 xhci_ring_cmd_db(xhci);
706 return 0;
707 }
708
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35791 bytes --]
next prev parent reply other threads:[~2021-07-02 8:58 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-02 7:13 [PATCH] xhci: add quirk for host controllers that don't update endpoint DCS Bjørn Mork
2021-07-02 8:57 ` kernel test robot [this message]
2021-07-02 9:10 ` Bjørn Mork
2021-07-20 15:09 ` [PATCH v2] " Bjørn Mork
2021-07-20 16:43 ` Rik van Riel
2021-09-01 15:30 ` [PATCH v2 RESEND] " Bjørn Mork
2021-09-27 18:30 ` Bjørn Mork
2021-09-29 14:24 ` Mathias Nyman
2021-07-02 12:21 ` [PATCH] " kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202107021602.N49dsX2f-lkp@intel.com \
--to=lkp@intel.com \
--cc=bjorn@mork.no \
--cc=jonathan@raspberrypi.org \
--cc=kbuild-all@lists.01.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).