Message ID | 20230718112600.3969141-1-xu.yang_2@nxp.com |
---|---|
State | New |
Headers | show |
Series | [1/2] usb: host: ehci-sched: add itd/sitd_unlink_urb() functions | expand |
Hi Xu, kernel test robot noticed the following build warnings: [auto build test WARNING on usb/usb-testing] [also build test WARNING on usb/usb-next usb/usb-linus char-misc/char-misc-testing char-misc/char-misc-next char-misc/char-misc-linus westeri-thunderbolt/next linus/master v6.5-rc2 next-20230721] [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#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Xu-Yang/usb-ehci-unlink-itd-sitds-from-hardware-list-if-the-controller-has-stopped-periodic-schedule/20230718-192747 base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing patch link: https://lore.kernel.org/r/20230718112600.3969141-1-xu.yang_2%40nxp.com patch subject: [PATCH 1/2] usb: host: ehci-sched: add itd/sitd_unlink_urb() functions config: microblaze-randconfig-r072-20230723 (https://download.01.org/0day-ci/archive/20230724/202307240103.vWzkF4eB-lkp@intel.com/config) compiler: microblaze-linux-gcc (GCC) 12.3.0 reproduce: (https://download.01.org/0day-ci/archive/20230724/202307240103.vWzkF4eB-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202307240103.vWzkF4eB-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) drivers/usb/host/ehci-hcd.c: note: in included file: drivers/usb/host/ehci-q.c:1390:27: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __hc32 [usertype] old_current @@ got int @@ drivers/usb/host/ehci-q.c:1390:27: sparse: expected restricted __hc32 [usertype] old_current drivers/usb/host/ehci-q.c:1390:27: sparse: got int drivers/usb/host/ehci-hcd.c: note: in included file: drivers/usb/host/ehci-mem.c:187:24: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __hc32 [usertype] *periodic @@ got restricted __le32 [usertype] * @@ drivers/usb/host/ehci-mem.c:187:24: sparse: expected restricted __hc32 [usertype] *periodic drivers/usb/host/ehci-mem.c:187:24: sparse: got restricted __le32 [usertype] * drivers/usb/host/ehci-hcd.c:568:27: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __hc32 [usertype] old_current @@ got int @@ drivers/usb/host/ehci-hcd.c:568:27: sparse: expected restricted __hc32 [usertype] old_current drivers/usb/host/ehci-hcd.c:568:27: sparse: got int drivers/usb/host/ehci-hcd.c: note: in included file: >> drivers/usb/host/ehci-sched.c:1829:17: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected restricted __hc32 [usertype] tag @@ got int @@ drivers/usb/host/ehci-sched.c:1829:17: sparse: expected restricted __hc32 [usertype] tag drivers/usb/host/ehci-sched.c:1829:17: sparse: got int >> drivers/usb/host/ehci-sched.c:1829:17: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected restricted __hc32 [usertype] tag @@ got int @@ drivers/usb/host/ehci-sched.c:1829:17: sparse: expected restricted __hc32 [usertype] tag drivers/usb/host/ehci-sched.c:1829:17: sparse: got int vim +1829 drivers/usb/host/ehci-sched.c 1807 1808 /* unlink itd/sitd from the periodic list */ 1809 static inline void 1810 unlink(struct ehci_hcd *ehci, unsigned frame, void *ptr) 1811 { 1812 union ehci_shadow *prev = &ehci->pshadow[frame]; 1813 __hc32 *hw_p = &ehci->periodic[frame]; 1814 union ehci_shadow here = *prev; 1815 1816 while (here.ptr && here.ptr != ptr) { 1817 prev = periodic_next_shadow(ehci, prev, 1818 Q_NEXT_TYPE(ehci, *hw_p)); 1819 hw_p = shadow_next_periodic(ehci, &here, 1820 Q_NEXT_TYPE(ehci, *hw_p)); 1821 here = *prev; 1822 } 1823 1824 *prev = *periodic_next_shadow(ehci, &here, 1825 Q_NEXT_TYPE(ehci, *hw_p)); 1826 1827 if (!ehci->use_dummy_qh || 1828 *shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p) > 1829 != EHCI_LIST_END(ehci))) 1830 *hw_p = *shadow_next_periodic(ehci, &here, 1831 Q_NEXT_TYPE(ehci, *hw_p)); 1832 else 1833 *hw_p = cpu_to_hc32(ehci, ehci->dummy->qh_dma); 1834 } 1835
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index bd542b6fc46b..b95a8bc4d3ba 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -1805,6 +1805,67 @@ static void itd_link_urb( enable_periodic(ehci); } +/* unlink itd/sitd from the periodic list */ +static inline void +unlink(struct ehci_hcd *ehci, unsigned frame, void *ptr) +{ + union ehci_shadow *prev = &ehci->pshadow[frame]; + __hc32 *hw_p = &ehci->periodic[frame]; + union ehci_shadow here = *prev; + + while (here.ptr && here.ptr != ptr) { + prev = periodic_next_shadow(ehci, prev, + Q_NEXT_TYPE(ehci, *hw_p)); + hw_p = shadow_next_periodic(ehci, &here, + Q_NEXT_TYPE(ehci, *hw_p)); + here = *prev; + } + + *prev = *periodic_next_shadow(ehci, &here, + Q_NEXT_TYPE(ehci, *hw_p)); + + if (!ehci->use_dummy_qh || + *shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p) + != EHCI_LIST_END(ehci))) + *hw_p = *shadow_next_periodic(ehci, &here, + Q_NEXT_TYPE(ehci, *hw_p)); + else + *hw_p = cpu_to_hc32(ehci, ehci->dummy->qh_dma); +} + +static void itd_unlink_urb( + struct ehci_hcd *ehci, + struct urb *urb +) +{ + struct ehci_itd *itd, *n; + struct ehci_iso_stream *stream = urb->hcpriv; + + if (unlikely(list_empty(&stream->td_list))) + return; + + list_for_each_entry_safe(itd, n, &stream->td_list, itd_list) { + if (itd->urb != urb) + continue; + unlink(ehci, itd->frame, itd); + itd->urb = NULL; + list_move_tail(&itd->itd_list, &stream->free_list); + } + + ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; + if (unlikely(list_empty(&stream->td_list))) + ehci_to_hcd(ehci)->self.bandwidth_allocated -= stream->bandwidth; + + ehci_urb_done(ehci, urb, -ENOENT); + + --ehci->isoc_count; + disable_periodic(ehci); + + list_splice_tail_init(&stream->free_list, + &ehci->cached_itd_list); + start_free_itds(ehci); +} + #define ISO_ERRS (EHCI_ISOC_BUF_ERR | EHCI_ISOC_BABBLE | EHCI_ISOC_XACTERR) /* Process and recycle a completed ITD. Return true iff its urb completed, @@ -2196,6 +2257,39 @@ static void sitd_link_urb( enable_periodic(ehci); } +static void sitd_unlink_urb( + struct ehci_hcd *ehci, + struct urb *urb +) +{ + struct ehci_sitd *sitd, *n; + struct ehci_iso_stream *stream = urb->hcpriv; + + if (unlikely(list_empty(&stream->td_list))) + return; + + list_for_each_entry_safe(sitd, n, &stream->td_list, sitd_list) { + if (sitd->urb != urb) + continue; + unlink(ehci, sitd->frame, sitd); + sitd->urb = NULL; + list_move_tail(&sitd->sitd_list, &stream->free_list); + } + + ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; + if (unlikely(list_empty(&stream->td_list))) + ehci_to_hcd(ehci)->self.bandwidth_allocated -= stream->bandwidth; + + ehci_urb_done(ehci, urb, -ENOENT); + + --ehci->isoc_count; + disable_periodic(ehci); + + list_splice_tail_init(&stream->free_list, + &ehci->cached_sitd_list); + start_free_itds(ehci); +} + /*-------------------------------------------------------------------------*/ #define SITD_ERRS (SITD_STS_ERR | SITD_STS_DBE | SITD_STS_BABBLE \
This will add itd/sitd_unlink_urb() functions in case of the driver needs to unlink these urbs manually. Signed-off-by: Xu Yang <xu.yang_2@nxp.com> --- drivers/usb/host/ehci-sched.c | 94 +++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+)