USB driver fixes for 5.15-rc3
Here are some USB driver fixes and new device ids for 5.15-rc3. They include: - usb-storage quirk additions - usb-serial new device ids - usb-serial driver fixes - USB roothub registration bugfix to resolve a long-reported issue - usb gadget driver fixes for a large number of small things - dwc2 driver fixes All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYU8uKQ8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynjlgCeIE84XRGpjE/jCK/63Sjve9zyJjoAn2ZUFwLN lcLJxlHV3XHK8coC5/YZ =hNgV -----END PGP SIGNATURE----- Merge tag 'usb-5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB driver fixes from Greg KH: "Here are some USB driver fixes and new device ids for 5.15-rc3. They include: - usb-storage quirk additions - usb-serial new device ids - usb-serial driver fixes - USB roothub registration bugfix to resolve a long-reported issue - usb gadget driver fixes for a large number of small things - dwc2 driver fixes All of these have been in linux-next for a while with no reported issues" * tag 'usb-5.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (28 commits) USB: serial: option: add device id for Foxconn T99W265 USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter USB: serial: cp210x: add part-number debug printk USB: serial: cp210x: fix dropped characters with CP2102 MAINTAINERS: usb, update Peter Korsgaard's entries usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned() usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c Re-enable UAS for LaCie Rugged USB3-FW with fk quirk USB: serial: option: remove duplicate USB device ID USB: serial: mos7840: remove duplicated 0xac24 device ID arm64: dts: qcom: ipq8074: remove USB tx-fifo-resize property usb: gadget: f_uac2: Populate SS descriptors' wBytesPerInterval usb: gadget: f_uac2: Add missing companion descriptor for feedback EP usb: dwc2: gadget: Fix ISOC transfer complete handling for DDMA usb: core: hcd: Modularize HCD stop configuration in usb_stop_hcd() xhci: Set HCD flag to defer primary roothub registration usb: core: hcd: Add support for deferring roothub registration usb: dwc2: gadget: Fix ISOC flow for BDMA and Slave usb: dwc3: core: balance phy init and exit Revert "USB: bcma: Add a check for devm_gpiod_get" ...
This commit is contained in:
commit
2c4e969c38
|
@ -19288,13 +19288,12 @@ S: Maintained
|
|||
F: drivers/usb/misc/chaoskey.c
|
||||
|
||||
USB CYPRESS C67X00 DRIVER
|
||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: drivers/usb/c67x00/
|
||||
|
||||
USB DAVICOM DM9601 DRIVER
|
||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
||||
M: Peter Korsgaard <peter@korsgaard.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
|
|
|
@ -487,7 +487,6 @@
|
|||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&qusb_phy_0>, <&usb0_ssphy>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
tx-fifo-resize;
|
||||
snps,is-utmi-l1-suspend;
|
||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
|
@ -528,7 +527,6 @@
|
|||
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&qusb_phy_1>, <&usb1_ssphy>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
tx-fifo-resize;
|
||||
snps,is-utmi-l1-suspend;
|
||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
|
|
|
@ -1100,6 +1100,19 @@ static int cdns3_ep_run_stream_transfer(struct cdns3_endpoint *priv_ep,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void cdns3_rearm_drdy_if_needed(struct cdns3_endpoint *priv_ep)
|
||||
{
|
||||
struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
|
||||
|
||||
if (priv_dev->dev_ver < DEV_VER_V3)
|
||||
return;
|
||||
|
||||
if (readl(&priv_dev->regs->ep_sts) & EP_STS_TRBERR) {
|
||||
writel(EP_STS_TRBERR, &priv_dev->regs->ep_sts);
|
||||
writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* cdns3_ep_run_transfer - start transfer on no-default endpoint hardware
|
||||
* @priv_ep: endpoint object
|
||||
|
@ -1351,6 +1364,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
|
|||
/*clearing TRBERR and EP_STS_DESCMIS before seting DRDY*/
|
||||
writel(EP_STS_TRBERR | EP_STS_DESCMIS, &priv_dev->regs->ep_sts);
|
||||
writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
|
||||
cdns3_rearm_drdy_if_needed(priv_ep);
|
||||
trace_cdns3_doorbell_epx(priv_ep->name,
|
||||
readl(&priv_dev->regs->ep_traddr));
|
||||
}
|
||||
|
|
|
@ -726,7 +726,8 @@ static void acm_port_destruct(struct tty_port *port)
|
|||
{
|
||||
struct acm *acm = container_of(port, struct acm, port);
|
||||
|
||||
acm_release_minor(acm);
|
||||
if (acm->minor != ACM_MINOR_INVALID)
|
||||
acm_release_minor(acm);
|
||||
usb_put_intf(acm->control);
|
||||
kfree(acm->country_codes);
|
||||
kfree(acm);
|
||||
|
@ -1323,8 +1324,10 @@ made_compressed_probe:
|
|||
usb_get_intf(acm->control); /* undone in destruct() */
|
||||
|
||||
minor = acm_alloc_minor(acm);
|
||||
if (minor < 0)
|
||||
if (minor < 0) {
|
||||
acm->minor = ACM_MINOR_INVALID;
|
||||
goto err_put_port;
|
||||
}
|
||||
|
||||
acm->minor = minor;
|
||||
acm->dev = usb_dev;
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
#define ACM_TTY_MAJOR 166
|
||||
#define ACM_TTY_MINORS 256
|
||||
|
||||
#define ACM_MINOR_INVALID ACM_TTY_MINORS
|
||||
|
||||
/*
|
||||
* Requests.
|
||||
*/
|
||||
|
|
|
@ -2760,6 +2760,26 @@ static void usb_put_invalidate_rhdev(struct usb_hcd *hcd)
|
|||
usb_put_dev(rhdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_stop_hcd - Halt the HCD
|
||||
* @hcd: the usb_hcd that has to be halted
|
||||
*
|
||||
* Stop the root-hub polling timer and invoke the HCD's ->stop callback.
|
||||
*/
|
||||
static void usb_stop_hcd(struct usb_hcd *hcd)
|
||||
{
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
|
||||
/* In case the HCD restarted the timer, stop it again. */
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_add_hcd - finish generic HCD structure initialization and register
|
||||
* @hcd: the usb_hcd structure to initialize
|
||||
|
@ -2775,6 +2795,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
|||
{
|
||||
int retval;
|
||||
struct usb_device *rhdev;
|
||||
struct usb_hcd *shared_hcd;
|
||||
|
||||
if (!hcd->skip_phy_initialization && usb_hcd_is_primary_hcd(hcd)) {
|
||||
hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev);
|
||||
|
@ -2935,24 +2956,31 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
|||
goto err_hcd_driver_start;
|
||||
}
|
||||
|
||||
/* starting here, usbcore will pay attention to this root hub */
|
||||
retval = register_root_hub(hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
/* starting here, usbcore will pay attention to the shared HCD roothub */
|
||||
shared_hcd = hcd->shared_hcd;
|
||||
if (!usb_hcd_is_primary_hcd(hcd) && shared_hcd && HCD_DEFER_RH_REGISTER(shared_hcd)) {
|
||||
retval = register_root_hub(shared_hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
|
||||
if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
|
||||
usb_hcd_poll_rh_status(hcd);
|
||||
if (shared_hcd->uses_new_polling && HCD_POLL_RH(shared_hcd))
|
||||
usb_hcd_poll_rh_status(shared_hcd);
|
||||
}
|
||||
|
||||
/* starting here, usbcore will pay attention to this root hub */
|
||||
if (!HCD_DEFER_RH_REGISTER(hcd)) {
|
||||
retval = register_root_hub(hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
|
||||
if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
|
||||
usb_hcd_poll_rh_status(hcd);
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
||||
err_register_root_hub:
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
usb_stop_hcd(hcd);
|
||||
err_hcd_driver_start:
|
||||
if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)
|
||||
free_irq(irqnum, hcd);
|
||||
|
@ -2985,6 +3013,7 @@ EXPORT_SYMBOL_GPL(usb_add_hcd);
|
|||
void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
{
|
||||
struct usb_device *rhdev = hcd->self.root_hub;
|
||||
bool rh_registered;
|
||||
|
||||
dev_info(hcd->self.controller, "remove, state %x\n", hcd->state);
|
||||
|
||||
|
@ -2995,6 +3024,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
|||
|
||||
dev_dbg(hcd->self.controller, "roothub graceful disconnect\n");
|
||||
spin_lock_irq (&hcd_root_hub_lock);
|
||||
rh_registered = hcd->rh_registered;
|
||||
hcd->rh_registered = 0;
|
||||
spin_unlock_irq (&hcd_root_hub_lock);
|
||||
|
||||
|
@ -3004,7 +3034,8 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
|||
cancel_work_sync(&hcd->died_work);
|
||||
|
||||
mutex_lock(&usb_bus_idr_lock);
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
if (rh_registered)
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
mutex_unlock(&usb_bus_idr_lock);
|
||||
|
||||
/*
|
||||
|
@ -3022,16 +3053,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
|||
* interrupt occurs), but usb_hcd_poll_rh_status() won't invoke
|
||||
* the hub_status_data() callback.
|
||||
*/
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
|
||||
/* In case the HCD restarted the timer, stop it again. */
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
usb_stop_hcd(hcd);
|
||||
|
||||
if (usb_hcd_is_primary_hcd(hcd)) {
|
||||
if (hcd->irq > 0)
|
||||
|
|
|
@ -115,10 +115,16 @@ static inline bool using_desc_dma(struct dwc2_hsotg *hsotg)
|
|||
*/
|
||||
static inline void dwc2_gadget_incr_frame_num(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
hs_ep->target_frame += hs_ep->interval;
|
||||
if (hs_ep->target_frame > DSTS_SOFFN_LIMIT) {
|
||||
if (hs_ep->target_frame > limit) {
|
||||
hs_ep->frame_overrun = true;
|
||||
hs_ep->target_frame &= DSTS_SOFFN_LIMIT;
|
||||
hs_ep->target_frame &= limit;
|
||||
} else {
|
||||
hs_ep->frame_overrun = false;
|
||||
}
|
||||
|
@ -136,10 +142,16 @@ static inline void dwc2_gadget_incr_frame_num(struct dwc2_hsotg_ep *hs_ep)
|
|||
*/
|
||||
static inline void dwc2_gadget_dec_frame_num_by_one(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
if (hs_ep->target_frame)
|
||||
hs_ep->target_frame -= 1;
|
||||
else
|
||||
hs_ep->target_frame = DSTS_SOFFN_LIMIT;
|
||||
hs_ep->target_frame = limit;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1018,6 +1030,12 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep)
|
|||
dwc2_writel(hsotg, ctrl, depctl);
|
||||
}
|
||||
|
||||
static bool dwc2_gadget_target_frame_elapsed(struct dwc2_hsotg_ep *hs_ep);
|
||||
static void dwc2_hsotg_complete_request(struct dwc2_hsotg *hsotg,
|
||||
struct dwc2_hsotg_ep *hs_ep,
|
||||
struct dwc2_hsotg_req *hs_req,
|
||||
int result);
|
||||
|
||||
/**
|
||||
* dwc2_hsotg_start_req - start a USB request from an endpoint's queue
|
||||
* @hsotg: The controller state.
|
||||
|
@ -1170,14 +1188,19 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg,
|
|||
}
|
||||
}
|
||||
|
||||
if (hs_ep->isochronous && hs_ep->interval == 1) {
|
||||
hs_ep->target_frame = dwc2_hsotg_read_frameno(hsotg);
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
if (hs_ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
if (hs_ep->isochronous) {
|
||||
if (!dwc2_gadget_target_frame_elapsed(hs_ep)) {
|
||||
if (hs_ep->interval == 1) {
|
||||
if (hs_ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
}
|
||||
ctrl |= DXEPCTL_CNAK;
|
||||
} else {
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, -ENODATA);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ctrl |= DXEPCTL_EPENA; /* ensure ep enabled */
|
||||
|
@ -1325,12 +1348,16 @@ static bool dwc2_gadget_target_frame_elapsed(struct dwc2_hsotg_ep *hs_ep)
|
|||
u32 target_frame = hs_ep->target_frame;
|
||||
u32 current_frame = hsotg->frame_number;
|
||||
bool frame_overrun = hs_ep->frame_overrun;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
if (!frame_overrun && current_frame >= target_frame)
|
||||
return true;
|
||||
|
||||
if (frame_overrun && current_frame >= target_frame &&
|
||||
((current_frame - target_frame) < DSTS_SOFFN_LIMIT / 2))
|
||||
((current_frame - target_frame) < limit / 2))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -1713,11 +1740,9 @@ static struct dwc2_hsotg_req *get_ep_head(struct dwc2_hsotg_ep *hs_ep)
|
|||
*/
|
||||
static void dwc2_gadget_start_next_request(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
u32 mask;
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
int dir_in = hs_ep->dir_in;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
u32 epmsk_reg = dir_in ? DIEPMSK : DOEPMSK;
|
||||
|
||||
if (!list_empty(&hs_ep->queue)) {
|
||||
hs_req = get_ep_head(hs_ep);
|
||||
|
@ -1733,9 +1758,6 @@ static void dwc2_gadget_start_next_request(struct dwc2_hsotg_ep *hs_ep)
|
|||
} else {
|
||||
dev_dbg(hsotg->dev, "%s: No more ISOC-OUT requests\n",
|
||||
__func__);
|
||||
mask = dwc2_readl(hsotg, epmsk_reg);
|
||||
mask |= DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, mask, epmsk_reg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2306,19 +2328,6 @@ static void dwc2_hsotg_ep0_zlp(struct dwc2_hsotg *hsotg, bool dir_in)
|
|||
dwc2_hsotg_program_zlp(hsotg, hsotg->eps_out[0]);
|
||||
}
|
||||
|
||||
static void dwc2_hsotg_change_ep_iso_parity(struct dwc2_hsotg *hsotg,
|
||||
u32 epctl_reg)
|
||||
{
|
||||
u32 ctrl;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, epctl_reg);
|
||||
if (ctrl & DXEPCTL_EOFRNUM)
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
dwc2_writel(hsotg, ctrl, epctl_reg);
|
||||
}
|
||||
|
||||
/*
|
||||
* dwc2_gadget_get_xfersize_ddma - get transferred bytes amount from desc
|
||||
* @hs_ep - The endpoint on which transfer went
|
||||
|
@ -2439,20 +2448,11 @@ static void dwc2_hsotg_handle_outdone(struct dwc2_hsotg *hsotg, int epnum)
|
|||
dwc2_hsotg_ep0_zlp(hsotg, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Slave mode OUT transfers do not go through XferComplete so
|
||||
* adjust the ISOC parity here.
|
||||
*/
|
||||
if (!using_dma(hsotg)) {
|
||||
if (hs_ep->isochronous && hs_ep->interval == 1)
|
||||
dwc2_hsotg_change_ep_iso_parity(hsotg, DOEPCTL(epnum));
|
||||
else if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
/* Set actual frame number for completed transfers */
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous)
|
||||
req->frame_number = hsotg->frame_number;
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
req->frame_number = hs_ep->target_frame;
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, result);
|
||||
}
|
||||
|
@ -2766,6 +2766,12 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg *hsotg,
|
|||
return;
|
||||
}
|
||||
|
||||
/* Set actual frame number for completed transfers */
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
hs_req->req.frame_number = hs_ep->target_frame;
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
|
||||
}
|
||||
|
||||
|
@ -2826,23 +2832,18 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
|||
|
||||
dwc2_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
|
||||
|
||||
if (hs_ep->isochronous) {
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((epctl & DXEPCTL_STALL) && (epctl & DXEPCTL_EPTYPE_BULK)) {
|
||||
int dctl = dwc2_readl(hsotg, DCTL);
|
||||
|
||||
dctl |= DCTL_CGNPINNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (dctl & DCTL_GOUTNAKSTS) {
|
||||
dctl |= DCTL_CGOUTNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
if (dctl & DCTL_GOUTNAKSTS) {
|
||||
dctl |= DCTL_CGOUTNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hs_ep->isochronous)
|
||||
|
@ -2863,8 +2864,6 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
|||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
} while (dwc2_gadget_target_frame_elapsed(hs_ep));
|
||||
|
||||
dwc2_gadget_start_next_request(hs_ep);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2881,8 +2880,8 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
|||
static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = ep->parent;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
int dir_in = ep->dir_in;
|
||||
u32 doepmsk;
|
||||
|
||||
if (dir_in || !ep->isochronous)
|
||||
return;
|
||||
|
@ -2896,28 +2895,39 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
|||
return;
|
||||
}
|
||||
|
||||
if (ep->interval > 1 &&
|
||||
ep->target_frame == TARGET_FRAME_INITIAL) {
|
||||
if (ep->target_frame == TARGET_FRAME_INITIAL) {
|
||||
u32 ctrl;
|
||||
|
||||
ep->target_frame = hsotg->frame_number;
|
||||
dwc2_gadget_incr_frame_num(ep);
|
||||
if (ep->interval > 1) {
|
||||
ctrl = dwc2_readl(hsotg, DOEPCTL(ep->index));
|
||||
if (ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, DOEPCTL(ep->index));
|
||||
if (ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
|
||||
dwc2_writel(hsotg, ctrl, DOEPCTL(ep->index));
|
||||
dwc2_writel(hsotg, ctrl, DOEPCTL(ep->index));
|
||||
}
|
||||
}
|
||||
|
||||
dwc2_gadget_start_next_request(ep);
|
||||
doepmsk = dwc2_readl(hsotg, DOEPMSK);
|
||||
doepmsk &= ~DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, doepmsk, DOEPMSK);
|
||||
while (dwc2_gadget_target_frame_elapsed(ep)) {
|
||||
hs_req = get_ep_head(ep);
|
||||
if (hs_req)
|
||||
dwc2_hsotg_complete_request(hsotg, ep, hs_req, -ENODATA);
|
||||
|
||||
dwc2_gadget_incr_frame_num(ep);
|
||||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
}
|
||||
|
||||
if (!ep->req)
|
||||
dwc2_gadget_start_next_request(ep);
|
||||
|
||||
}
|
||||
|
||||
static void dwc2_hsotg_ep_stop_xfr(struct dwc2_hsotg *hsotg,
|
||||
struct dwc2_hsotg_ep *hs_ep);
|
||||
|
||||
/**
|
||||
* dwc2_gadget_handle_nak - handle NAK interrupt
|
||||
* @hs_ep: The endpoint on which interrupt is asserted.
|
||||
|
@ -2935,7 +2945,9 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
|||
static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
int dir_in = hs_ep->dir_in;
|
||||
u32 ctrl;
|
||||
|
||||
if (!dir_in || !hs_ep->isochronous)
|
||||
return;
|
||||
|
@ -2977,13 +2989,29 @@ static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep)
|
|||
|
||||
dwc2_writel(hsotg, ctrl, DIEPCTL(hs_ep->index));
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep,
|
||||
get_ep_head(hs_ep), 0);
|
||||
}
|
||||
|
||||
if (!using_desc_dma(hsotg))
|
||||
if (using_desc_dma(hsotg))
|
||||
return;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, DIEPCTL(hs_ep->index));
|
||||
if (ctrl & DXEPCTL_EPENA)
|
||||
dwc2_hsotg_ep_stop_xfr(hsotg, hs_ep);
|
||||
else
|
||||
dwc2_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
|
||||
|
||||
while (dwc2_gadget_target_frame_elapsed(hs_ep)) {
|
||||
hs_req = get_ep_head(hs_ep);
|
||||
if (hs_req)
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, -ENODATA);
|
||||
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
}
|
||||
|
||||
if (!hs_ep->req)
|
||||
dwc2_gadget_start_next_request(hs_ep);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -3039,21 +3067,15 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
|
|||
|
||||
/* In DDMA handle isochronous requests separately */
|
||||
if (using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
/* XferCompl set along with BNA */
|
||||
if (!(ints & DXEPINT_BNAINTR))
|
||||
dwc2_gadget_complete_isoc_request_ddma(hs_ep);
|
||||
dwc2_gadget_complete_isoc_request_ddma(hs_ep);
|
||||
} else if (dir_in) {
|
||||
/*
|
||||
* We get OutDone from the FIFO, so we only
|
||||
* need to look at completing IN requests here
|
||||
* if operating slave mode
|
||||
*/
|
||||
if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
if (ints & DXEPINT_NAKINTRPT)
|
||||
ints &= ~DXEPINT_NAKINTRPT;
|
||||
if (!hs_ep->isochronous || !(ints & DXEPINT_NAKINTRPT))
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
|
||||
if (idx == 0 && !hs_ep->req)
|
||||
dwc2_hsotg_enqueue_setup(hsotg);
|
||||
|
@ -3062,10 +3084,8 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
|
|||
* We're using DMA, we need to fire an OutDone here
|
||||
* as we ignore the RXFIFO.
|
||||
*/
|
||||
if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
dwc2_hsotg_handle_outdone(hsotg, idx);
|
||||
if (!hs_ep->isochronous || !(ints & DXEPINT_OUTTKNEPDIS))
|
||||
dwc2_hsotg_handle_outdone(hsotg, idx);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4085,6 +4105,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
|
|||
mask |= DIEPMSK_NAKMSK;
|
||||
dwc2_writel(hsotg, mask, DIEPMSK);
|
||||
} else {
|
||||
epctrl |= DXEPCTL_SNAK;
|
||||
mask = dwc2_readl(hsotg, DOEPMSK);
|
||||
mask |= DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, mask, DOEPMSK);
|
||||
|
|
|
@ -5191,6 +5191,10 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg)
|
|||
hcd->has_tt = 1;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
retval = -EINVAL;
|
||||
goto error1;
|
||||
}
|
||||
hcd->rsrc_start = res->start;
|
||||
hcd->rsrc_len = resource_size(res);
|
||||
|
||||
|
|
|
@ -264,19 +264,6 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
|||
{
|
||||
u32 reg;
|
||||
int retries = 1000;
|
||||
int ret;
|
||||
|
||||
usb_phy_init(dwc->usb2_phy);
|
||||
usb_phy_init(dwc->usb3_phy);
|
||||
ret = phy_init(dwc->usb2_generic_phy);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = phy_init(dwc->usb3_generic_phy);
|
||||
if (ret < 0) {
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're resetting only the device side because, if we're in host mode,
|
||||
|
@ -310,9 +297,6 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
|||
udelay(1);
|
||||
} while (--retries);
|
||||
|
||||
phy_exit(dwc->usb3_generic_phy);
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
||||
done:
|
||||
|
@ -982,9 +966,21 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
|||
dwc->phys_ready = true;
|
||||
}
|
||||
|
||||
usb_phy_init(dwc->usb2_phy);
|
||||
usb_phy_init(dwc->usb3_phy);
|
||||
ret = phy_init(dwc->usb2_generic_phy);
|
||||
if (ret < 0)
|
||||
goto err0a;
|
||||
|
||||
ret = phy_init(dwc->usb3_generic_phy);
|
||||
if (ret < 0) {
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
goto err0a;
|
||||
}
|
||||
|
||||
ret = dwc3_core_soft_reset(dwc);
|
||||
if (ret)
|
||||
goto err0a;
|
||||
goto err1;
|
||||
|
||||
if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD &&
|
||||
!DWC3_VER_IS_WITHIN(DWC3, ANY, 194A)) {
|
||||
|
|
|
@ -406,6 +406,14 @@ static struct usb_endpoint_descriptor ss_epin_fback_desc = {
|
|||
.bInterval = 4,
|
||||
};
|
||||
|
||||
static struct usb_ss_ep_comp_descriptor ss_epin_fback_desc_comp = {
|
||||
.bLength = sizeof(ss_epin_fback_desc_comp),
|
||||
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
||||
.bMaxBurst = 0,
|
||||
.bmAttributes = 0,
|
||||
.wBytesPerInterval = cpu_to_le16(4),
|
||||
};
|
||||
|
||||
|
||||
/* Audio Streaming IN Interface - Alt0 */
|
||||
static struct usb_interface_descriptor std_as_in_if0_desc = {
|
||||
|
@ -597,6 +605,7 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
|
|||
(struct usb_descriptor_header *)&ss_epout_desc_comp,
|
||||
(struct usb_descriptor_header *)&as_iso_out_desc,
|
||||
(struct usb_descriptor_header *)&ss_epin_fback_desc,
|
||||
(struct usb_descriptor_header *)&ss_epin_fback_desc_comp,
|
||||
|
||||
(struct usb_descriptor_header *)&std_as_in_if0_desc,
|
||||
(struct usb_descriptor_header *)&std_as_in_if1_desc,
|
||||
|
@ -705,6 +714,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||
{
|
||||
struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
|
||||
struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
|
||||
struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL;
|
||||
struct usb_endpoint_descriptor *epout_desc;
|
||||
struct usb_endpoint_descriptor *epin_desc;
|
||||
struct usb_endpoint_descriptor *epin_fback_desc;
|
||||
|
@ -730,6 +740,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||
epout_desc_comp = &ss_epout_desc_comp;
|
||||
epin_desc_comp = &ss_epin_desc_comp;
|
||||
epin_fback_desc = &ss_epin_fback_desc;
|
||||
epin_fback_desc_comp = &ss_epin_fback_desc_comp;
|
||||
ep_int_desc = &ss_ep_int_desc;
|
||||
}
|
||||
|
||||
|
@ -773,8 +784,11 @@ static void setup_headers(struct f_uac2_opts *opts,
|
|||
|
||||
headers[i++] = USBDHDR(&as_iso_out_desc);
|
||||
|
||||
if (EPOUT_FBACK_IN_EN(opts))
|
||||
if (EPOUT_FBACK_IN_EN(opts)) {
|
||||
headers[i++] = USBDHDR(epin_fback_desc);
|
||||
if (epin_fback_desc_comp)
|
||||
headers[i++] = USBDHDR(epin_fback_desc_comp);
|
||||
}
|
||||
}
|
||||
|
||||
if (EPIN_EN(opts)) {
|
||||
|
@ -1164,6 +1178,9 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
|
|||
agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
|
||||
le16_to_cpu(ss_epout_desc.wMaxPacketSize));
|
||||
|
||||
ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
|
||||
ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
|
||||
|
||||
// HS and SS endpoint addresses are copied from autoconfigured FS descriptors
|
||||
hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
|
||||
hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
|
||||
|
|
|
@ -96,11 +96,13 @@ static const struct snd_pcm_hardware uac_pcm_hardware = {
|
|||
};
|
||||
|
||||
static void u_audio_set_fback_frequency(enum usb_device_speed speed,
|
||||
struct usb_ep *out_ep,
|
||||
unsigned long long freq,
|
||||
unsigned int pitch,
|
||||
void *buf)
|
||||
{
|
||||
u32 ff = 0;
|
||||
const struct usb_endpoint_descriptor *ep_desc;
|
||||
|
||||
/*
|
||||
* Because the pitch base is 1000000, the final divider here
|
||||
|
@ -128,8 +130,13 @@ static void u_audio_set_fback_frequency(enum usb_device_speed speed,
|
|||
* byte fromat (that is Q16.16)
|
||||
*
|
||||
* ff = (freq << 16) / 8000
|
||||
*
|
||||
* Win10 and OSX UAC2 drivers require number of samples per packet
|
||||
* in order to honor the feedback value.
|
||||
* Linux snd-usb-audio detects the applied bit-shift automatically.
|
||||
*/
|
||||
freq <<= 4;
|
||||
ep_desc = out_ep->desc;
|
||||
freq <<= 4 + (ep_desc->bInterval - 1);
|
||||
}
|
||||
|
||||
ff = DIV_ROUND_CLOSEST_ULL((freq * pitch), 1953125);
|
||||
|
@ -267,7 +274,7 @@ static void u_audio_iso_fback_complete(struct usb_ep *ep,
|
|||
pr_debug("%s: iso_complete status(%d) %d/%d\n",
|
||||
__func__, status, req->actual, req->length);
|
||||
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed,
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed, audio_dev->out_ep,
|
||||
params->c_srate, prm->pitch,
|
||||
req->buf);
|
||||
|
||||
|
@ -526,7 +533,7 @@ int u_audio_start_capture(struct g_audio *audio_dev)
|
|||
* be meauserd at start of playback
|
||||
*/
|
||||
prm->pitch = 1000000;
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed,
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed, ep,
|
||||
params->c_srate, prm->pitch,
|
||||
req_fback->buf);
|
||||
|
||||
|
|
|
@ -1250,7 +1250,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)
|
|||
do {
|
||||
tmp = r8a66597_read(r8a66597, INTSTS0) & CTSQ;
|
||||
udelay(1);
|
||||
} while (tmp != CS_IDST || timeout-- > 0);
|
||||
} while (tmp != CS_IDST && timeout-- > 0);
|
||||
|
||||
if (tmp == CS_IDST)
|
||||
r8a66597_bset(r8a66597,
|
||||
|
|
|
@ -406,12 +406,9 @@ static int bcma_hcd_probe(struct bcma_device *core)
|
|||
return -ENOMEM;
|
||||
usb_dev->core = core;
|
||||
|
||||
if (core->dev.of_node) {
|
||||
if (core->dev.of_node)
|
||||
usb_dev->gpio_desc = devm_gpiod_get(&core->dev, "vcc",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(usb_dev->gpio_desc))
|
||||
return PTR_ERR(usb_dev->gpio_desc);
|
||||
}
|
||||
|
||||
switch (core->id.id) {
|
||||
case BCMA_CORE_USB20_HOST:
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/moduleparam.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
|
@ -1278,29 +1279,39 @@ MODULE_LICENSE ("GPL");
|
|||
|
||||
#ifdef CONFIG_USB_EHCI_SH
|
||||
#include "ehci-sh.c"
|
||||
#define PLATFORM_DRIVER ehci_hcd_sh_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
#include "ehci-ps3.c"
|
||||
#define PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
|
||||
#include "ehci-ppc-of.c"
|
||||
#define OF_PLATFORM_DRIVER ehci_hcd_ppc_of_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XPS_USB_HCD_XILINX
|
||||
#include "ehci-xilinx-of.c"
|
||||
#define XILINX_OF_PLATFORM_DRIVER ehci_hcd_xilinx_of_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPARC_LEON
|
||||
#include "ehci-grlib.c"
|
||||
#define PLATFORM_DRIVER ehci_grlib_driver
|
||||
#endif
|
||||
|
||||
static struct platform_driver * const platform_drivers[] = {
|
||||
#ifdef CONFIG_USB_EHCI_SH
|
||||
&ehci_hcd_sh_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
|
||||
&ehci_hcd_ppc_of_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_XPS_USB_HCD_XILINX
|
||||
&ehci_hcd_xilinx_of_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_SPARC_LEON
|
||||
&ehci_grlib_driver,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init ehci_hcd_init(void)
|
||||
{
|
||||
int retval = 0;
|
||||
|
@ -1324,47 +1335,23 @@ static int __init ehci_hcd_init(void)
|
|||
ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root);
|
||||
#endif
|
||||
|
||||
#ifdef PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&PLATFORM_DRIVER);
|
||||
retval = platform_register_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
if (retval < 0)
|
||||
goto clean0;
|
||||
#endif
|
||||
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
retval = ps3_ehci_driver_register(&ps3_ehci_driver);
|
||||
if (retval < 0)
|
||||
goto clean2;
|
||||
goto clean1;
|
||||
#endif
|
||||
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&OF_PLATFORM_DRIVER);
|
||||
if (retval < 0)
|
||||
goto clean3;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&XILINX_OF_PLATFORM_DRIVER);
|
||||
if (retval < 0)
|
||||
goto clean4;
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
clean1:
|
||||
#endif
|
||||
return retval;
|
||||
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
/* platform_driver_unregister(&XILINX_OF_PLATFORM_DRIVER); */
|
||||
clean4:
|
||||
#endif
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&OF_PLATFORM_DRIVER);
|
||||
clean3:
|
||||
#endif
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
|
||||
clean2:
|
||||
#endif
|
||||
#ifdef PLATFORM_DRIVER
|
||||
platform_driver_unregister(&PLATFORM_DRIVER);
|
||||
platform_unregister_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
clean0:
|
||||
#endif
|
||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||
debugfs_remove(ehci_debug_root);
|
||||
ehci_debug_root = NULL;
|
||||
|
@ -1376,18 +1363,10 @@ module_init(ehci_hcd_init);
|
|||
|
||||
static void __exit ehci_hcd_cleanup(void)
|
||||
{
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&XILINX_OF_PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&OF_PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef PLATFORM_DRIVER
|
||||
platform_driver_unregister(&PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
ps3_ehci_driver_unregister(&ps3_ehci_driver);
|
||||
#endif
|
||||
platform_unregister_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||
debugfs_remove(ehci_debug_root);
|
||||
#endif
|
||||
|
|
|
@ -692,6 +692,7 @@ int xhci_run(struct usb_hcd *hcd)
|
|||
if (ret)
|
||||
xhci_free_command(xhci, command);
|
||||
}
|
||||
set_bit(HCD_FLAG_DEFER_RH_REGISTER, &hcd->flags);
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Finished xhci_run for USB2 roothub");
|
||||
|
||||
|
|
|
@ -190,6 +190,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len)
|
|||
}
|
||||
if (len > 0) {
|
||||
/* Write the rest 1 - 3 bytes to FIFO */
|
||||
val = 0;
|
||||
memcpy(&val, buf, len);
|
||||
musb_writel(fifo, 0, val);
|
||||
}
|
||||
|
|
|
@ -233,6 +233,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */
|
||||
{ USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */
|
||||
{ USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */
|
||||
{ USB_DEVICE(0x2184, 0x0030) }, /* GW Instek GDM-834x Digital Multimeter */
|
||||
{ USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */
|
||||
{ USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */
|
||||
{ USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
|
||||
|
@ -258,6 +259,7 @@ struct cp210x_serial_private {
|
|||
speed_t max_speed;
|
||||
bool use_actual_rate;
|
||||
bool no_flow_control;
|
||||
bool no_event_mode;
|
||||
};
|
||||
|
||||
enum cp210x_event_state {
|
||||
|
@ -1113,12 +1115,16 @@ static void cp210x_change_speed(struct tty_struct *tty,
|
|||
|
||||
static void cp210x_enable_event_mode(struct usb_serial_port *port)
|
||||
{
|
||||
struct cp210x_serial_private *priv = usb_get_serial_data(port->serial);
|
||||
struct cp210x_port_private *port_priv = usb_get_serial_port_data(port);
|
||||
int ret;
|
||||
|
||||
if (port_priv->event_mode)
|
||||
return;
|
||||
|
||||
if (priv->no_event_mode)
|
||||
return;
|
||||
|
||||
port_priv->event_state = ES_DATA;
|
||||
port_priv->event_mode = true;
|
||||
|
||||
|
@ -2074,6 +2080,33 @@ static void cp210x_init_max_speed(struct usb_serial *serial)
|
|||
priv->use_actual_rate = use_actual_rate;
|
||||
}
|
||||
|
||||
static void cp2102_determine_quirks(struct usb_serial *serial)
|
||||
{
|
||||
struct cp210x_serial_private *priv = usb_get_serial_data(serial);
|
||||
u8 *buf;
|
||||
int ret;
|
||||
|
||||
buf = kmalloc(2, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return;
|
||||
/*
|
||||
* Some (possibly counterfeit) CP2102 do not support event-insertion
|
||||
* mode and respond differently to malformed vendor requests.
|
||||
* Specifically, they return one instead of two bytes when sent a
|
||||
* two-byte part-number request.
|
||||
*/
|
||||
ret = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
|
||||
CP210X_VENDOR_SPECIFIC, REQTYPE_DEVICE_TO_HOST,
|
||||
CP210X_GET_PARTNUM, 0, buf, 2, USB_CTRL_GET_TIMEOUT);
|
||||
if (ret == 1) {
|
||||
dev_dbg(&serial->interface->dev,
|
||||
"device does not support event-insertion mode\n");
|
||||
priv->no_event_mode = true;
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
static int cp210x_get_fw_version(struct usb_serial *serial, u16 value)
|
||||
{
|
||||
struct cp210x_serial_private *priv = usb_get_serial_data(serial);
|
||||
|
@ -2108,7 +2141,12 @@ static void cp210x_determine_type(struct usb_serial *serial)
|
|||
return;
|
||||
}
|
||||
|
||||
dev_dbg(&serial->interface->dev, "partnum = 0x%02x\n", priv->partnum);
|
||||
|
||||
switch (priv->partnum) {
|
||||
case CP210X_PARTNUM_CP2102:
|
||||
cp2102_determine_quirks(serial);
|
||||
break;
|
||||
case CP210X_PARTNUM_CP2105:
|
||||
case CP210X_PARTNUM_CP2108:
|
||||
cp210x_get_fw_version(serial, CP210X_GET_FW_VER);
|
||||
|
|
|
@ -107,7 +107,6 @@
|
|||
#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02
|
||||
#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44
|
||||
#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03
|
||||
#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24
|
||||
|
||||
/* Interrupt Routine Defines */
|
||||
|
||||
|
@ -186,7 +185,6 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P) },
|
||||
{ USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4) },
|
||||
{} /* terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
|
|
@ -1205,6 +1205,14 @@ static const struct usb_device_id option_ids[] = {
|
|||
.driver_info = NCTRL(0) | RSVD(1) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */
|
||||
.driver_info = NCTRL(2) | RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */
|
||||
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */
|
||||
.driver_info = NCTRL(0) | RSVD(1) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff), /* Telit LN920 (RNDIS) */
|
||||
.driver_info = NCTRL(2) | RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */
|
||||
.driver_info = NCTRL(0) | RSVD(1) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
||||
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
||||
|
@ -1650,7 +1658,6 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff),
|
||||
.driver_info = RSVD(1) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff),
|
||||
|
@ -2068,6 +2075,8 @@ static const struct usb_device_id option_ids[] = {
|
|||
.driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
|
||||
{ USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */
|
||||
.driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */
|
||||
.driver_info = RSVD(3) },
|
||||
{ USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */
|
||||
.driver_info = RSVD(4) | RSVD(5) | RSVD(6) },
|
||||
{ USB_DEVICE(0x2cb7, 0x0104), /* Fibocom NL678 series */
|
||||
|
|
|
@ -416,9 +416,16 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210,
|
|||
USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN),
|
||||
|
||||
/*
|
||||
* Reported by Ondrej Zary <linux@rainbow-software.org>
|
||||
* Reported by Ondrej Zary <linux@zary.sk>
|
||||
* The device reports one sector more and breaks when that sector is accessed
|
||||
* Firmwares older than 2.6c (the latest one and the only that claims Linux
|
||||
* support) have also broken tag handling
|
||||
*/
|
||||
UNUSUAL_DEV( 0x04ce, 0x0002, 0x0000, 0x026b,
|
||||
"ScanLogic",
|
||||
"SL11R-IDE",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_FIX_CAPACITY | US_FL_BULK_IGNORE_TAG),
|
||||
UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c,
|
||||
"ScanLogic",
|
||||
"SL11R-IDE",
|
||||
|
|
|
@ -50,7 +50,7 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,
|
|||
"LaCie",
|
||||
"Rugged USB3-FW",
|
||||
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
||||
US_FL_IGNORE_UAS),
|
||||
US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),
|
||||
|
||||
/*
|
||||
* Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
|
||||
|
|
|
@ -124,6 +124,7 @@ struct usb_hcd {
|
|||
#define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */
|
||||
#define HCD_FLAG_DEAD 6 /* controller has died? */
|
||||
#define HCD_FLAG_INTF_AUTHORIZED 7 /* authorize interfaces? */
|
||||
#define HCD_FLAG_DEFER_RH_REGISTER 8 /* Defer roothub registration */
|
||||
|
||||
/* The flags can be tested using these macros; they are likely to
|
||||
* be slightly faster than test_bit().
|
||||
|
@ -134,6 +135,7 @@ struct usb_hcd {
|
|||
#define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))
|
||||
#define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
|
||||
#define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD))
|
||||
#define HCD_DEFER_RH_REGISTER(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEFER_RH_REGISTER))
|
||||
|
||||
/*
|
||||
* Specifies if interfaces are authorized by default
|
||||
|
|
|
@ -265,12 +265,6 @@ nomem:
|
|||
}
|
||||
|
||||
entry->ifnum = ifnum;
|
||||
|
||||
/* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */
|
||||
|
||||
fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
speed(entry->speed), entry->name, entry->ifnum);
|
||||
|
||||
entry->next = testdevs;
|
||||
testdevs = entry;
|
||||
return 0;
|
||||
|
@ -299,6 +293,14 @@ static void *handle_testdev (void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
status = ioctl(fd, USBDEVFS_GET_SPEED, NULL);
|
||||
if (status < 0)
|
||||
fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status);
|
||||
else
|
||||
dev->speed = status;
|
||||
fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
speed(dev->speed), dev->name, dev->ifnum);
|
||||
|
||||
restart:
|
||||
for (i = 0; i < TEST_CASES; i++) {
|
||||
if (dev->test != -1 && dev->test != i)
|
||||
|
|
Loading…
Reference in New Issue