USB fixes for 4.5-rc6
Here are a few USB fixes for 4.5-rc6 They fix a reported bug for some USB 3 devices by reverting the recent patch, a MAINTAINERS change for some drivers, some new device ids, and of course, the usual bunch of USB gadget driver fixes. All have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEABECAAYFAlbSgVoACgkQMUfUDdst+ymghQCgiVUpZOu/hYeC/8CDdTZPLlpQ oR4AoLftFf9OAKRgBCbiPOY99lG9f33y =qZKR -----END PGP SIGNATURE----- Merge tag 'usb-4.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg KH: "Here are a few USB fixes for 4.5-rc6 They fix a reported bug for some USB 3 devices by reverting the recent patch, a MAINTAINERS change for some drivers, some new device ids, and of course, the usual bunch of USB gadget driver fixes. All have been in linux-next for a while with no reported issues" * tag 'usb-4.5-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: MAINTAINERS: drop OMAP USB and MUSB maintainership usb: musb: fix DMA for host mode usb: phy: msm: Trigger USB state detection work in DRD mode usb: gadget: net2280: fix endpoint max packet for super speed connections usb: gadget: gadgetfs: unregister gadget only if it got successfully registered usb: gadget: remove driver from pending list on probe error Revert "usb: hub: do not clear BOS field during reset device" usb: chipidea: fix return value check in ci_hdrc_pci_probe() usb: chipidea: error on overflow for port_test_write USB: option: add "4G LTE usb-modem U901" USB: cp210x: add IDs for GE B650V3 and B850V3 boards USB: option: add support for SIM7100E usb: musb: Fix DMA desired mode for Mentor DMA engine usb: gadget: fsl_qe_udc: fix IS_ERR_VALUE usage usb: dwc2: USB_DWC2 should depend on HAS_DMA usb: dwc2: host: fix the data toggle error in full speed descriptor dma usb: dwc2: host: fix logical omissions in dwc2_process_non_isoc_desc usb: dwc3: Fix assignment of EP transfer resources usb: dwc2: Add extra delay when forcing dr_mode
This commit is contained in:
commit
62718e304a
|
@ -3451,7 +3451,6 @@ F: drivers/usb/dwc2/
|
||||||
DESIGNWARE USB3 DRD IP DRIVER
|
DESIGNWARE USB3 DRD IP DRIVER
|
||||||
M: Felipe Balbi <balbi@kernel.org>
|
M: Felipe Balbi <balbi@kernel.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
L: linux-omap@vger.kernel.org
|
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/usb/dwc3/
|
F: drivers/usb/dwc3/
|
||||||
|
@ -7361,7 +7360,7 @@ F: drivers/tty/isicom.c
|
||||||
F: include/linux/isicom.h
|
F: include/linux/isicom.h
|
||||||
|
|
||||||
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER
|
||||||
M: Felipe Balbi <balbi@kernel.org>
|
M: Bin Liu <b-liu@ti.com>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7930,11 +7929,9 @@ F: drivers/media/platform/omap3isp/
|
||||||
F: drivers/staging/media/omap4iss/
|
F: drivers/staging/media/omap4iss/
|
||||||
|
|
||||||
OMAP USB SUPPORT
|
OMAP USB SUPPORT
|
||||||
M: Felipe Balbi <balbi@kernel.org>
|
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
S: Orphan
|
||||||
S: Maintained
|
|
||||||
F: drivers/usb/*/*omap*
|
F: drivers/usb/*/*omap*
|
||||||
F: arch/arm/*omap*/usb*
|
F: arch/arm/*omap*/usb*
|
||||||
|
|
||||||
|
|
|
@ -85,8 +85,8 @@ static int ci_hdrc_pci_probe(struct pci_dev *pdev,
|
||||||
|
|
||||||
/* register a nop PHY */
|
/* register a nop PHY */
|
||||||
ci->phy = usb_phy_generic_register();
|
ci->phy = usb_phy_generic_register();
|
||||||
if (!ci->phy)
|
if (IS_ERR(ci->phy))
|
||||||
return -ENOMEM;
|
return PTR_ERR(ci->phy);
|
||||||
|
|
||||||
memset(res, 0, sizeof(res));
|
memset(res, 0, sizeof(res));
|
||||||
res[0].start = pci_resource_start(pdev, 0);
|
res[0].start = pci_resource_start(pdev, 0);
|
||||||
|
|
|
@ -100,6 +100,9 @@ static ssize_t ci_port_test_write(struct file *file, const char __user *ubuf,
|
||||||
if (sscanf(buf, "%u", &mode) != 1)
|
if (sscanf(buf, "%u", &mode) != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (mode > 255)
|
||||||
|
return -EBADRQC;
|
||||||
|
|
||||||
pm_runtime_get_sync(ci->dev);
|
pm_runtime_get_sync(ci->dev);
|
||||||
spin_lock_irqsave(&ci->lock, flags);
|
spin_lock_irqsave(&ci->lock, flags);
|
||||||
ret = hw_port_test_set(ci, mode);
|
ret = hw_port_test_set(ci, mode);
|
||||||
|
|
|
@ -5401,6 +5401,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev)
|
||||||
}
|
}
|
||||||
|
|
||||||
bos = udev->bos;
|
bos = udev->bos;
|
||||||
|
udev->bos = NULL;
|
||||||
|
|
||||||
for (i = 0; i < SET_CONFIG_TRIES; ++i) {
|
for (i = 0; i < SET_CONFIG_TRIES; ++i) {
|
||||||
|
|
||||||
|
@ -5493,11 +5494,8 @@ done:
|
||||||
usb_set_usb2_hardware_lpm(udev, 1);
|
usb_set_usb2_hardware_lpm(udev, 1);
|
||||||
usb_unlocked_enable_lpm(udev);
|
usb_unlocked_enable_lpm(udev);
|
||||||
usb_enable_ltm(udev);
|
usb_enable_ltm(udev);
|
||||||
/* release the new BOS descriptor allocated by hub_port_init() */
|
usb_release_bos_descriptor(udev);
|
||||||
if (udev->bos != bos) {
|
udev->bos = bos;
|
||||||
usb_release_bos_descriptor(udev);
|
|
||||||
udev->bos = bos;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
re_enumerate:
|
re_enumerate:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
config USB_DWC2
|
config USB_DWC2
|
||||||
tristate "DesignWare USB2 DRD Core Support"
|
tristate "DesignWare USB2 DRD Core Support"
|
||||||
|
depends on HAS_DMA
|
||||||
depends on USB || USB_GADGET
|
depends on USB || USB_GADGET
|
||||||
help
|
help
|
||||||
Say Y here if your system has a Dual Role Hi-Speed USB
|
Say Y here if your system has a Dual Role Hi-Speed USB
|
||||||
|
|
|
@ -619,6 +619,12 @@ void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg)
|
||||||
__func__, hsotg->dr_mode);
|
__func__, hsotg->dr_mode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NOTE: This is required for some rockchip soc based
|
||||||
|
* platforms.
|
||||||
|
*/
|
||||||
|
msleep(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1174,14 +1174,11 @@ static int dwc2_process_non_isoc_desc(struct dwc2_hsotg *hsotg,
|
||||||
failed = dwc2_update_non_isoc_urb_state_ddma(hsotg, chan, qtd, dma_desc,
|
failed = dwc2_update_non_isoc_urb_state_ddma(hsotg, chan, qtd, dma_desc,
|
||||||
halt_status, n_bytes,
|
halt_status, n_bytes,
|
||||||
xfer_done);
|
xfer_done);
|
||||||
if (*xfer_done && urb->status != -EINPROGRESS)
|
if (failed || (*xfer_done && urb->status != -EINPROGRESS)) {
|
||||||
failed = 1;
|
|
||||||
|
|
||||||
if (failed) {
|
|
||||||
dwc2_host_complete(hsotg, qtd, urb->status);
|
dwc2_host_complete(hsotg, qtd, urb->status);
|
||||||
dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh);
|
dwc2_hcd_qtd_unlink_and_free(hsotg, qtd, qh);
|
||||||
dev_vdbg(hsotg->dev, "failed=%1x xfer_done=%1x status=%08x\n",
|
dev_vdbg(hsotg->dev, "failed=%1x xfer_done=%1x\n",
|
||||||
failed, *xfer_done, urb->status);
|
failed, *xfer_done);
|
||||||
return failed;
|
return failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1236,21 +1233,23 @@ static void dwc2_complete_non_isoc_xfer_ddma(struct dwc2_hsotg *hsotg,
|
||||||
|
|
||||||
list_for_each_safe(qtd_item, qtd_tmp, &qh->qtd_list) {
|
list_for_each_safe(qtd_item, qtd_tmp, &qh->qtd_list) {
|
||||||
int i;
|
int i;
|
||||||
|
int qtd_desc_count;
|
||||||
|
|
||||||
qtd = list_entry(qtd_item, struct dwc2_qtd, qtd_list_entry);
|
qtd = list_entry(qtd_item, struct dwc2_qtd, qtd_list_entry);
|
||||||
xfer_done = 0;
|
xfer_done = 0;
|
||||||
|
qtd_desc_count = qtd->n_desc;
|
||||||
|
|
||||||
for (i = 0; i < qtd->n_desc; i++) {
|
for (i = 0; i < qtd_desc_count; i++) {
|
||||||
if (dwc2_process_non_isoc_desc(hsotg, chan, chnum, qtd,
|
if (dwc2_process_non_isoc_desc(hsotg, chan, chnum, qtd,
|
||||||
desc_num, halt_status,
|
desc_num, halt_status,
|
||||||
&xfer_done)) {
|
&xfer_done))
|
||||||
qtd = NULL;
|
goto stop_scan;
|
||||||
break;
|
|
||||||
}
|
|
||||||
desc_num++;
|
desc_num++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop_scan:
|
||||||
if (qh->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
if (qh->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
||||||
/*
|
/*
|
||||||
* Resetting the data toggle for bulk and interrupt endpoints
|
* Resetting the data toggle for bulk and interrupt endpoints
|
||||||
|
@ -1258,7 +1257,7 @@ static void dwc2_complete_non_isoc_xfer_ddma(struct dwc2_hsotg *hsotg,
|
||||||
*/
|
*/
|
||||||
if (halt_status == DWC2_HC_XFER_STALL)
|
if (halt_status == DWC2_HC_XFER_STALL)
|
||||||
qh->data_toggle = DWC2_HC_PID_DATA0;
|
qh->data_toggle = DWC2_HC_PID_DATA0;
|
||||||
else if (qtd)
|
else
|
||||||
dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd);
|
dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -525,11 +525,19 @@ void dwc2_hcd_save_data_toggle(struct dwc2_hsotg *hsotg,
|
||||||
u32 pid = (hctsiz & TSIZ_SC_MC_PID_MASK) >> TSIZ_SC_MC_PID_SHIFT;
|
u32 pid = (hctsiz & TSIZ_SC_MC_PID_MASK) >> TSIZ_SC_MC_PID_SHIFT;
|
||||||
|
|
||||||
if (chan->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
if (chan->ep_type != USB_ENDPOINT_XFER_CONTROL) {
|
||||||
|
if (WARN(!chan || !chan->qh,
|
||||||
|
"chan->qh must be specified for non-control eps\n"))
|
||||||
|
return;
|
||||||
|
|
||||||
if (pid == TSIZ_SC_MC_PID_DATA0)
|
if (pid == TSIZ_SC_MC_PID_DATA0)
|
||||||
chan->qh->data_toggle = DWC2_HC_PID_DATA0;
|
chan->qh->data_toggle = DWC2_HC_PID_DATA0;
|
||||||
else
|
else
|
||||||
chan->qh->data_toggle = DWC2_HC_PID_DATA1;
|
chan->qh->data_toggle = DWC2_HC_PID_DATA1;
|
||||||
} else {
|
} else {
|
||||||
|
if (WARN(!qtd,
|
||||||
|
"qtd must be specified for control eps\n"))
|
||||||
|
return;
|
||||||
|
|
||||||
if (pid == TSIZ_SC_MC_PID_DATA0)
|
if (pid == TSIZ_SC_MC_PID_DATA0)
|
||||||
qtd->data_toggle = DWC2_HC_PID_DATA0;
|
qtd->data_toggle = DWC2_HC_PID_DATA0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -856,7 +856,6 @@ struct dwc3 {
|
||||||
unsigned pullups_connected:1;
|
unsigned pullups_connected:1;
|
||||||
unsigned resize_fifos:1;
|
unsigned resize_fifos:1;
|
||||||
unsigned setup_packet_pending:1;
|
unsigned setup_packet_pending:1;
|
||||||
unsigned start_config_issued:1;
|
|
||||||
unsigned three_stage_setup:1;
|
unsigned three_stage_setup:1;
|
||||||
unsigned usb3_lpm_capable:1;
|
unsigned usb3_lpm_capable:1;
|
||||||
|
|
||||||
|
|
|
@ -555,7 +555,6 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
|
||||||
int ret;
|
int ret;
|
||||||
u32 reg;
|
u32 reg;
|
||||||
|
|
||||||
dwc->start_config_issued = false;
|
|
||||||
cfg = le16_to_cpu(ctrl->wValue);
|
cfg = le16_to_cpu(ctrl->wValue);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
@ -737,10 +736,6 @@ static int dwc3_ep0_std_request(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
|
||||||
dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY");
|
dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_ISOCH_DELAY");
|
||||||
ret = dwc3_ep0_set_isoch_delay(dwc, ctrl);
|
ret = dwc3_ep0_set_isoch_delay(dwc, ctrl);
|
||||||
break;
|
break;
|
||||||
case USB_REQ_SET_INTERFACE:
|
|
||||||
dwc3_trace(trace_dwc3_ep0, "USB_REQ_SET_INTERFACE");
|
|
||||||
dwc->start_config_issued = false;
|
|
||||||
/* Fall through */
|
|
||||||
default:
|
default:
|
||||||
dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver");
|
dwc3_trace(trace_dwc3_ep0, "Forwarding to gadget driver");
|
||||||
ret = dwc3_ep0_delegate_req(dwc, ctrl);
|
ret = dwc3_ep0_delegate_req(dwc, ctrl);
|
||||||
|
|
|
@ -385,24 +385,66 @@ static void dwc3_free_trb_pool(struct dwc3_ep *dep)
|
||||||
dep->trb_pool_dma = 0;
|
dep->trb_pool_dma = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dwc3_gadget_start_config - Configure EP resources
|
||||||
|
* @dwc: pointer to our controller context structure
|
||||||
|
* @dep: endpoint that is being enabled
|
||||||
|
*
|
||||||
|
* The assignment of transfer resources cannot perfectly follow the
|
||||||
|
* data book due to the fact that the controller driver does not have
|
||||||
|
* all knowledge of the configuration in advance. It is given this
|
||||||
|
* information piecemeal by the composite gadget framework after every
|
||||||
|
* SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
|
||||||
|
* programming model in this scenario can cause errors. For two
|
||||||
|
* reasons:
|
||||||
|
*
|
||||||
|
* 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION
|
||||||
|
* and SET_INTERFACE (8.1.5). This is incorrect in the scenario of
|
||||||
|
* multiple interfaces.
|
||||||
|
*
|
||||||
|
* 2) The databook does not mention doing more DEPXFERCFG for new
|
||||||
|
* endpoint on alt setting (8.1.6).
|
||||||
|
*
|
||||||
|
* The following simplified method is used instead:
|
||||||
|
*
|
||||||
|
* All hardware endpoints can be assigned a transfer resource and this
|
||||||
|
* setting will stay persistent until either a core reset or
|
||||||
|
* hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and
|
||||||
|
* do DEPXFERCFG for every hardware endpoint as well. We are
|
||||||
|
* guaranteed that there are as many transfer resources as endpoints.
|
||||||
|
*
|
||||||
|
* This function is called for each endpoint when it is being enabled
|
||||||
|
* but is triggered only when called for EP0-out, which always happens
|
||||||
|
* first, and which should only happen in one of the above conditions.
|
||||||
|
*/
|
||||||
static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
|
static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep)
|
||||||
{
|
{
|
||||||
struct dwc3_gadget_ep_cmd_params params;
|
struct dwc3_gadget_ep_cmd_params params;
|
||||||
u32 cmd;
|
u32 cmd;
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (dep->number)
|
||||||
|
return 0;
|
||||||
|
|
||||||
memset(¶ms, 0x00, sizeof(params));
|
memset(¶ms, 0x00, sizeof(params));
|
||||||
|
cmd = DWC3_DEPCMD_DEPSTARTCFG;
|
||||||
|
|
||||||
if (dep->number != 1) {
|
ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms);
|
||||||
cmd = DWC3_DEPCMD_DEPSTARTCFG;
|
if (ret)
|
||||||
/* XferRscIdx == 0 for ep0 and 2 for the remaining */
|
return ret;
|
||||||
if (dep->number > 1) {
|
|
||||||
if (dwc->start_config_issued)
|
|
||||||
return 0;
|
|
||||||
dwc->start_config_issued = true;
|
|
||||||
cmd |= DWC3_DEPCMD_PARAM(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms);
|
for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) {
|
||||||
|
struct dwc3_ep *dep = dwc->eps[i];
|
||||||
|
|
||||||
|
if (!dep)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = dwc3_gadget_set_xfer_resource(dwc, dep);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -516,10 +558,6 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
|
||||||
struct dwc3_trb *trb_st_hw;
|
struct dwc3_trb *trb_st_hw;
|
||||||
struct dwc3_trb *trb_link;
|
struct dwc3_trb *trb_link;
|
||||||
|
|
||||||
ret = dwc3_gadget_set_xfer_resource(dwc, dep);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
dep->endpoint.desc = desc;
|
dep->endpoint.desc = desc;
|
||||||
dep->comp_desc = comp_desc;
|
dep->comp_desc = comp_desc;
|
||||||
dep->type = usb_endpoint_type(desc);
|
dep->type = usb_endpoint_type(desc);
|
||||||
|
@ -1636,8 +1674,6 @@ static int dwc3_gadget_start(struct usb_gadget *g,
|
||||||
}
|
}
|
||||||
dwc3_writel(dwc->regs, DWC3_DCFG, reg);
|
dwc3_writel(dwc->regs, DWC3_DCFG, reg);
|
||||||
|
|
||||||
dwc->start_config_issued = false;
|
|
||||||
|
|
||||||
/* Start with SuperSpeed Default */
|
/* Start with SuperSpeed Default */
|
||||||
dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
|
dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512);
|
||||||
|
|
||||||
|
@ -2237,7 +2273,6 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
|
||||||
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
|
dwc3_writel(dwc->regs, DWC3_DCTL, reg);
|
||||||
|
|
||||||
dwc3_disconnect_gadget(dwc);
|
dwc3_disconnect_gadget(dwc);
|
||||||
dwc->start_config_issued = false;
|
|
||||||
|
|
||||||
dwc->gadget.speed = USB_SPEED_UNKNOWN;
|
dwc->gadget.speed = USB_SPEED_UNKNOWN;
|
||||||
dwc->setup_packet_pending = false;
|
dwc->setup_packet_pending = false;
|
||||||
|
@ -2288,7 +2323,6 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
|
||||||
|
|
||||||
dwc3_stop_active_transfers(dwc);
|
dwc3_stop_active_transfers(dwc);
|
||||||
dwc3_clear_stall_all_ep(dwc);
|
dwc3_clear_stall_all_ep(dwc);
|
||||||
dwc->start_config_issued = false;
|
|
||||||
|
|
||||||
/* Reset device address to zero */
|
/* Reset device address to zero */
|
||||||
reg = dwc3_readl(dwc->regs, DWC3_DCFG);
|
reg = dwc3_readl(dwc->regs, DWC3_DCFG);
|
||||||
|
|
|
@ -130,7 +130,8 @@ struct dev_data {
|
||||||
setup_can_stall : 1,
|
setup_can_stall : 1,
|
||||||
setup_out_ready : 1,
|
setup_out_ready : 1,
|
||||||
setup_out_error : 1,
|
setup_out_error : 1,
|
||||||
setup_abort : 1;
|
setup_abort : 1,
|
||||||
|
gadget_registered : 1;
|
||||||
unsigned setup_wLength;
|
unsigned setup_wLength;
|
||||||
|
|
||||||
/* the rest is basically write-once */
|
/* the rest is basically write-once */
|
||||||
|
@ -1179,7 +1180,8 @@ dev_release (struct inode *inode, struct file *fd)
|
||||||
|
|
||||||
/* closing ep0 === shutdown all */
|
/* closing ep0 === shutdown all */
|
||||||
|
|
||||||
usb_gadget_unregister_driver (&gadgetfs_driver);
|
if (dev->gadget_registered)
|
||||||
|
usb_gadget_unregister_driver (&gadgetfs_driver);
|
||||||
|
|
||||||
/* at this point "good" hardware has disconnected the
|
/* at this point "good" hardware has disconnected the
|
||||||
* device from USB; the host won't see it any more.
|
* device from USB; the host won't see it any more.
|
||||||
|
@ -1847,6 +1849,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||||
* kick in after the ep0 descriptor is closed.
|
* kick in after the ep0 descriptor is closed.
|
||||||
*/
|
*/
|
||||||
value = len;
|
value = len;
|
||||||
|
dev->gadget_registered = true;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
|
||||||
|
|
|
@ -2340,7 +2340,7 @@ static struct qe_udc *qe_udc_config(struct platform_device *ofdev)
|
||||||
{
|
{
|
||||||
struct qe_udc *udc;
|
struct qe_udc *udc;
|
||||||
struct device_node *np = ofdev->dev.of_node;
|
struct device_node *np = ofdev->dev.of_node;
|
||||||
unsigned int tmp_addr = 0;
|
unsigned long tmp_addr = 0;
|
||||||
struct usb_device_para __iomem *usbpram;
|
struct usb_device_para __iomem *usbpram;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
u64 size;
|
u64 size;
|
||||||
|
|
|
@ -369,9 +369,20 @@ static inline void set_max_speed(struct net2280_ep *ep, u32 max)
|
||||||
static const u32 ep_enhanced[9] = { 0x10, 0x60, 0x30, 0x80,
|
static const u32 ep_enhanced[9] = { 0x10, 0x60, 0x30, 0x80,
|
||||||
0x50, 0x20, 0x70, 0x40, 0x90 };
|
0x50, 0x20, 0x70, 0x40, 0x90 };
|
||||||
|
|
||||||
if (ep->dev->enhanced_mode)
|
if (ep->dev->enhanced_mode) {
|
||||||
reg = ep_enhanced[ep->num];
|
reg = ep_enhanced[ep->num];
|
||||||
else{
|
switch (ep->dev->gadget.speed) {
|
||||||
|
case USB_SPEED_SUPER:
|
||||||
|
reg += 2;
|
||||||
|
break;
|
||||||
|
case USB_SPEED_FULL:
|
||||||
|
reg += 1;
|
||||||
|
break;
|
||||||
|
case USB_SPEED_HIGH:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
reg = (ep->num + 1) * 0x10;
|
reg = (ep->num + 1) * 0x10;
|
||||||
if (ep->dev->gadget.speed != USB_SPEED_HIGH)
|
if (ep->dev->gadget.speed != USB_SPEED_HIGH)
|
||||||
reg += 1;
|
reg += 1;
|
||||||
|
|
|
@ -413,9 +413,10 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
|
||||||
if (!driver->udc_name || strcmp(driver->udc_name,
|
if (!driver->udc_name || strcmp(driver->udc_name,
|
||||||
dev_name(&udc->dev)) == 0) {
|
dev_name(&udc->dev)) == 0) {
|
||||||
ret = udc_bind_to_driver(udc, driver);
|
ret = udc_bind_to_driver(udc, driver);
|
||||||
|
if (ret != -EPROBE_DEFER)
|
||||||
|
list_del(&driver->pending);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err4;
|
goto err4;
|
||||||
list_del(&driver->pending);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -662,7 +662,7 @@ static int musb_tx_dma_set_mode_mentor(struct dma_controller *dma,
|
||||||
csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE);
|
csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE);
|
||||||
csr |= MUSB_TXCSR_DMAENAB; /* against programmer's guide */
|
csr |= MUSB_TXCSR_DMAENAB; /* against programmer's guide */
|
||||||
}
|
}
|
||||||
channel->desired_mode = mode;
|
channel->desired_mode = *mode;
|
||||||
musb_writew(epio, MUSB_TXCSR, csr);
|
musb_writew(epio, MUSB_TXCSR, csr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2003,10 +2003,8 @@ void musb_host_rx(struct musb *musb, u8 epnum)
|
||||||
qh->offset,
|
qh->offset,
|
||||||
urb->transfer_buffer_length);
|
urb->transfer_buffer_length);
|
||||||
|
|
||||||
done = musb_rx_dma_in_inventra_cppi41(c, hw_ep, qh,
|
if (musb_rx_dma_in_inventra_cppi41(c, hw_ep, qh, urb,
|
||||||
urb, xfer_len,
|
xfer_len, iso_err))
|
||||||
iso_err);
|
|
||||||
if (done)
|
|
||||||
goto finish;
|
goto finish;
|
||||||
else
|
else
|
||||||
dev_err(musb->controller, "error: rx_dma failed\n");
|
dev_err(musb->controller, "error: rx_dma failed\n");
|
||||||
|
|
|
@ -757,14 +757,8 @@ static int msm_otg_set_host(struct usb_otg *otg, struct usb_bus *host)
|
||||||
otg->host = host;
|
otg->host = host;
|
||||||
dev_dbg(otg->usb_phy->dev, "host driver registered w/ tranceiver\n");
|
dev_dbg(otg->usb_phy->dev, "host driver registered w/ tranceiver\n");
|
||||||
|
|
||||||
/*
|
pm_runtime_get_sync(otg->usb_phy->dev);
|
||||||
* Kick the state machine work, if peripheral is not supported
|
schedule_work(&motg->sm_work);
|
||||||
* or peripheral is already registered with us.
|
|
||||||
*/
|
|
||||||
if (motg->pdata->mode == USB_DR_MODE_HOST || otg->gadget) {
|
|
||||||
pm_runtime_get_sync(otg->usb_phy->dev);
|
|
||||||
schedule_work(&motg->sm_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -827,14 +821,8 @@ static int msm_otg_set_peripheral(struct usb_otg *otg,
|
||||||
dev_dbg(otg->usb_phy->dev,
|
dev_dbg(otg->usb_phy->dev,
|
||||||
"peripheral driver registered w/ tranceiver\n");
|
"peripheral driver registered w/ tranceiver\n");
|
||||||
|
|
||||||
/*
|
pm_runtime_get_sync(otg->usb_phy->dev);
|
||||||
* Kick the state machine work, if host is not supported
|
schedule_work(&motg->sm_work);
|
||||||
* or host is already registered with us.
|
|
||||||
*/
|
|
||||||
if (motg->pdata->mode == USB_DR_MODE_PERIPHERAL || otg->host) {
|
|
||||||
pm_runtime_get_sync(otg->usb_phy->dev);
|
|
||||||
schedule_work(&motg->sm_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,6 +163,8 @@ static const struct usb_device_id id_table[] = {
|
||||||
{ USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
|
{ USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
|
||||||
{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
|
{ USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
|
||||||
{ USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
|
{ USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
|
||||||
|
{ USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */
|
||||||
|
{ USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */
|
||||||
{ USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
|
{ USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
|
||||||
{ USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
|
{ USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
|
||||||
{ USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
|
{ USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
|
||||||
|
|
|
@ -315,6 +315,7 @@ static void option_instat_callback(struct urb *urb);
|
||||||
#define TOSHIBA_PRODUCT_G450 0x0d45
|
#define TOSHIBA_PRODUCT_G450 0x0d45
|
||||||
|
|
||||||
#define ALINK_VENDOR_ID 0x1e0e
|
#define ALINK_VENDOR_ID 0x1e0e
|
||||||
|
#define SIMCOM_PRODUCT_SIM7100E 0x9001 /* Yes, ALINK_VENDOR_ID */
|
||||||
#define ALINK_PRODUCT_PH300 0x9100
|
#define ALINK_PRODUCT_PH300 0x9100
|
||||||
#define ALINK_PRODUCT_3GU 0x9200
|
#define ALINK_PRODUCT_3GU 0x9200
|
||||||
|
|
||||||
|
@ -607,6 +608,10 @@ static const struct option_blacklist_info zte_1255_blacklist = {
|
||||||
.reserved = BIT(3) | BIT(4),
|
.reserved = BIT(3) | BIT(4),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct option_blacklist_info simcom_sim7100e_blacklist = {
|
||||||
|
.reserved = BIT(5) | BIT(6),
|
||||||
|
};
|
||||||
|
|
||||||
static const struct option_blacklist_info telit_le910_blacklist = {
|
static const struct option_blacklist_info telit_le910_blacklist = {
|
||||||
.sendsetup = BIT(0),
|
.sendsetup = BIT(0),
|
||||||
.reserved = BIT(1) | BIT(2),
|
.reserved = BIT(1) | BIT(2),
|
||||||
|
@ -1122,6 +1127,8 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
|
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
|
||||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
||||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, 0x6001, 0xff, 0xff, 0xff), /* 4G LTE usb-modem U901 */
|
||||||
|
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
|
||||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
||||||
|
@ -1645,6 +1652,8 @@ static const struct usb_device_id option_ids[] = {
|
||||||
{ USB_DEVICE(ALINK_VENDOR_ID, 0x9000) },
|
{ USB_DEVICE(ALINK_VENDOR_ID, 0x9000) },
|
||||||
{ USB_DEVICE(ALINK_VENDOR_ID, ALINK_PRODUCT_PH300) },
|
{ USB_DEVICE(ALINK_VENDOR_ID, ALINK_PRODUCT_PH300) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) },
|
||||||
|
{ USB_DEVICE(ALINK_VENDOR_ID, SIMCOM_PRODUCT_SIM7100E),
|
||||||
|
.driver_info = (kernel_ulong_t)&simcom_sim7100e_blacklist },
|
||||||
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
{ USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
|
||||||
.driver_info = (kernel_ulong_t)&alcatel_x200_blacklist
|
.driver_info = (kernel_ulong_t)&alcatel_x200_blacklist
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue