--- zzzz-none-000/linux-3.10.107/drivers/usb/core/hcd.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/drivers/usb/core/hcd.c 2021-11-10 11:53:55.000000000 +0000 @@ -22,6 +22,12 @@ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/** + * Some part of this file is modified by Ikanos Communications. + * + * Copyright (C) 2013-2014 Ikanos Communications. + */ + #include #include #include @@ -46,6 +52,12 @@ #include "usb.h" +#if defined(CONFIG_FUSIV_VX185) || defined(CONFIG_FUSIV_VX585) +#include +#endif +#if defined(CONFIG_FUSIV_VX585) +#include +#endif /*-------------------------------------------------------------------------*/ @@ -351,6 +363,11 @@ "old behaviour"); /*-------------------------------------------------------------------------*/ +#if (defined(CONFIG_FUSIV_VX185) && defined(CONFIG_CPU_MIPSR2_IRQ_VI)) +fusiv_irq_params_t usb_fusiv_irq[2]; +#endif + + /** * ascii2desc() - Helper routine for producing UTF-16LE string descriptors * @s: Null-terminated ASCII (actually ISO-8859-1) string @@ -1528,7 +1545,10 @@ atomic_inc(&urb->use_count); atomic_inc(&urb->dev->urbnum); usbmon_urb_submit(&hcd->self, urb); - +#ifdef AVM_USB_TRACE + avm_usb_trace_submit(hcd, urb); +#endif + /* NOTE requirements on root-hub callers (usbfs and the hub * driver, for now): URBs' urb->transfer_buffer must be * valid and usb_buffer_{sync,unmap}() not be needed, since @@ -1550,6 +1570,10 @@ if (unlikely(status)) { usbmon_urb_submit_error(&hcd->self, urb, status); +#ifdef AVM_USB_TRACE + avm_usb_trace_error(hcd, urb, status); +#endif + urb->hcpriv = NULL; INIT_LIST_HEAD(&urb->urb_list); atomic_dec(&urb->use_count); @@ -1652,6 +1676,10 @@ unmap_urb_for_dma(hcd, urb); usbmon_urb_complete(&hcd->self, urb, status); +#ifdef AVM_USB_TRACE + avm_usb_trace_complete(hcd, urb, status); +#endif + usb_unanchor_urb(urb); /* pass ownership to the completion handler */ @@ -2215,7 +2243,11 @@ */ irqreturn_t usb_hcd_irq (int irq, void *__hcd) { +#if (defined(CONFIG_FUSIV_VX185)) + struct usb_hcd *hcd = (struct usb_hcd *)((fusiv_irq_params_t*)__hcd)->priv; +#else struct usb_hcd *hcd = __hcd; +#endif unsigned long flags; irqreturn_t rc; @@ -2438,8 +2470,39 @@ snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", hcd->driver->description, hcd->self.busnum); - retval = request_irq(irqnum, &usb_hcd_irq, irqflags, + +#if defined(CONFIG_FUSIV_VX185) + if(strcmp(hcd->driver->description,"ohci_hcd") == 0) + { + usb_fusiv_irq[0].ipc_src = USBO_INT; + usb_fusiv_irq[0].priv = hcd; + retval = request_irq(irqnum, &usb_hcd_irq, irqflags, + hcd->irq_descr, &usb_fusiv_irq[0]); + } + else if(strcmp(hcd->driver->description, "ehci_hcd") == 0) + { + usb_fusiv_irq[1].ipc_src = USBE_INT; + usb_fusiv_irq[1].priv = hcd; + retval = request_irq(irqnum, &usb_hcd_irq, irqflags, + hcd->irq_descr, &usb_fusiv_irq[1]); + } + else + printk("%s:ERROR unhandled interrupt request for IPC sourcfes",__FUNCTION__); + +#else +#if defined(CONFIG_FUSIV_VX585) + irqnum = FUSIV_USB_INT; + retval = request_irq(irqnum, &usb_hcd_irq, 0, + hcd->irq_descr, hcd); + if(!retval) { + irq_set_affinity(irqnum,cpumask_of(USB_CPU_NUM)); + } +#else + retval = request_irq(irqnum, &usb_hcd_irq, irqflags, hcd->irq_descr, hcd); +#endif +#endif + if (retval != 0) { dev_err(hcd->self.controller, "request interrupt %d failed\n", @@ -2576,6 +2639,10 @@ if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) usb_hcd_poll_rh_status(hcd); +#ifdef AVM_USB_TRACE + avm_usb_register_trace_device (hcd); +#endif + /* * Host controllers don't generate their own wakeup requests; * they only forward requests from the root hub. Therefore @@ -2676,6 +2743,10 @@ free_irq(hcd->irq, hcd); } +#ifdef AVM_USB_TRACE + avm_usb_deregister_trace_device (hcd); +#endif + usb_put_dev(hcd->self.root_hub); usb_deregister_bus(&hcd->self); hcd_buffer_destroy(hcd);