usb: fixes for v4.6-rc3
We have two more fixes to f_midi. It should now behave much better. dwc3-keystone.c has gotten a fix which now allows it to work on keystone device when running in peripheral mode. A similar fix for DMA configuration was made for udc-core, too. We have a new PCI ID for Intel's Broxton platform. DWC3 can run on those platforms as well. And we also have some dwc2 got a fix for dr_mode usage, while renesas controller got 3 important fixes: a NULL pointer deref fix, IRQ <-> DMA race fix, and a fix to prevent a situation where we would queue a request to a disabled endpoint. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJXBjgnAAoJEIaOsuA1yqREXl0P/iP7ZyyVj5QEflgcOCWVN5lt JHB9Ek0Ykmt4l/fd+ixcYMOdEGeLWBZPBEy8Jz25ZYnYDGBy0BosbeN/Au4eQjr7 BrDh1AzIgCuqvP0XWzh+BZCUgFCf3ltPBat/sCXcc74hPCkWs0OcOfEEOOC9Kkjr qA4Nm/JKjmcQszchvmYkPIPn5V3hMyA33Wm4JBXDBHJerMIGBORBoqw2/+s29xRT cKlyFuX9Ce+4NqOAV0MAvXr1Jk0KyJhFOK/TdNfKAsg9QodUk/xwU23v1MGScgQc oeBUEAzpqnA/pebE8vm0jRrlxZ1HqBYo3C5qJAgMmBumFMw1YmtFwZiiEq2qE3me +W2hsI3rmIH5o/3fzQEOclV8HOFp3hUm4jZtSnD7CJcjP4eahGqQ8QzOLY2kq+NS ykmDIXqTqG7mKFquuuwBn0kj49AfGUTmB2dinHUcxEb2KKfyNO2fU8MH6GAU8dlm f8TCINbnXvUQkQMGBTGY+pY5GhtWb66CxCLzyGzt70bmLNtNFgzmkzrFl7xY9DSZ sWn8o2AvzlyoCbm8WIJQ0LwUonRK32qZZgBgubPwTD8IVgn4NEKqSObA8DUCagdO XrzUzYF4fnrTT+wGMA0ECFEZEuX4doG/6P9BgS+TQT2sPwOls8t733O5DgBTPP1f bXp5L1goyUA3wt3WJ4xt =QLLF -----END PGP SIGNATURE----- Merge tag 'fixes-for-v4.6-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus Felipe writes: usb: fixes for v4.6-rc3 We have two more fixes to f_midi. It should now behave much better. dwc3-keystone.c has gotten a fix which now allows it to work on keystone device when running in peripheral mode. A similar fix for DMA configuration was made for udc-core, too. We have a new PCI ID for Intel's Broxton platform. DWC3 can run on those platforms as well. And we also have some dwc2 got a fix for dr_mode usage, while renesas controller got 3 important fixes: a NULL pointer deref fix, IRQ <-> DMA race fix, and a fix to prevent a situation where we would queue a request to a disabled endpoint.
This commit is contained in:
Коммит
39ec5cbed0
|
@ -2254,6 +2254,7 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
|
|||
{
|
||||
u32 intmsk;
|
||||
u32 val;
|
||||
u32 usbcfg;
|
||||
|
||||
/* Kill any ep0 requests as controller will be reinitialized */
|
||||
kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET);
|
||||
|
@ -2267,10 +2268,16 @@ void dwc2_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
|
|||
* set configuration.
|
||||
*/
|
||||
|
||||
/* keep other bits untouched (so e.g. forced modes are not lost) */
|
||||
usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
|
||||
usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP |
|
||||
GUSBCFG_HNPCAP);
|
||||
|
||||
/* set the PLL on, remove the HNP/SRP and set the PHY */
|
||||
val = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5;
|
||||
dwc2_writel(hsotg->phyif | GUSBCFG_TOUTCAL(7) |
|
||||
(val << GUSBCFG_USBTRDTIM_SHIFT), hsotg->regs + GUSBCFG);
|
||||
usbcfg |= hsotg->phyif | GUSBCFG_TOUTCAL(7) |
|
||||
(val << GUSBCFG_USBTRDTIM_SHIFT);
|
||||
dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
|
||||
|
||||
dwc2_hsotg_init_fifo(hsotg);
|
||||
|
||||
|
@ -3031,6 +3038,7 @@ static struct usb_ep_ops dwc2_hsotg_ep_ops = {
|
|||
static void dwc2_hsotg_init(struct dwc2_hsotg *hsotg)
|
||||
{
|
||||
u32 trdtim;
|
||||
u32 usbcfg;
|
||||
/* unmask subset of endpoint interrupts */
|
||||
|
||||
dwc2_writel(DIEPMSK_TIMEOUTMSK | DIEPMSK_AHBERRMSK |
|
||||
|
@ -3054,11 +3062,16 @@ static void dwc2_hsotg_init(struct dwc2_hsotg *hsotg)
|
|||
|
||||
dwc2_hsotg_init_fifo(hsotg);
|
||||
|
||||
/* keep other bits untouched (so e.g. forced modes are not lost) */
|
||||
usbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
|
||||
usbcfg &= ~(GUSBCFG_TOUTCAL_MASK | GUSBCFG_PHYIF16 | GUSBCFG_SRPCAP |
|
||||
GUSBCFG_HNPCAP);
|
||||
|
||||
/* set the PLL on, remove the HNP/SRP and set the PHY */
|
||||
trdtim = (hsotg->phyif == GUSBCFG_PHYIF8) ? 9 : 5;
|
||||
dwc2_writel(hsotg->phyif | GUSBCFG_TOUTCAL(7) |
|
||||
(trdtim << GUSBCFG_USBTRDTIM_SHIFT),
|
||||
hsotg->regs + GUSBCFG);
|
||||
usbcfg |= hsotg->phyif | GUSBCFG_TOUTCAL(7) |
|
||||
(trdtim << GUSBCFG_USBTRDTIM_SHIFT);
|
||||
dwc2_writel(usbcfg, hsotg->regs + GUSBCFG);
|
||||
|
||||
if (using_dma(hsotg))
|
||||
__orr32(hsotg->regs + GAHBCFG, GAHBCFG_DMA_EN);
|
||||
|
|
|
@ -39,8 +39,6 @@
|
|||
#define USBSS_IRQ_COREIRQ_EN BIT(0)
|
||||
#define USBSS_IRQ_COREIRQ_CLR BIT(0)
|
||||
|
||||
static u64 kdwc3_dma_mask;
|
||||
|
||||
struct dwc3_keystone {
|
||||
struct device *dev;
|
||||
struct clk *clk;
|
||||
|
@ -108,9 +106,6 @@ static int kdwc3_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(kdwc->usbss))
|
||||
return PTR_ERR(kdwc->usbss);
|
||||
|
||||
kdwc3_dma_mask = dma_get_mask(dev);
|
||||
dev->dma_mask = &kdwc3_dma_mask;
|
||||
|
||||
kdwc->clk = devm_clk_get(kdwc->dev, "usb");
|
||||
|
||||
error = clk_prepare_enable(kdwc->clk);
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
|
||||
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
|
||||
#define PCI_DEVICE_ID_INTEL_BXT 0x0aaa
|
||||
#define PCI_DEVICE_ID_INTEL_BXT_M 0x1aaa
|
||||
#define PCI_DEVICE_ID_INTEL_APL 0x5aaa
|
||||
|
||||
static const struct acpi_gpio_params reset_gpios = { 0, 0, false };
|
||||
|
@ -213,6 +214,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTLP), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SPTH), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BXT), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BXT_M), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_APL), },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_NL_USB), },
|
||||
{ } /* Terminating Entry */
|
||||
|
|
|
@ -360,7 +360,9 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
|
|||
/* allocate a bunch of read buffers and queue them all at once. */
|
||||
for (i = 0; i < midi->qlen && err == 0; i++) {
|
||||
struct usb_request *req =
|
||||
midi_alloc_ep_req(midi->out_ep, midi->buflen);
|
||||
midi_alloc_ep_req(midi->out_ep,
|
||||
max_t(unsigned, midi->buflen,
|
||||
bulk_out_desc.wMaxPacketSize));
|
||||
if (req == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -609,8 +611,10 @@ static void f_midi_transmit(struct f_midi *midi)
|
|||
|
||||
do {
|
||||
ret = f_midi_do_transmit(midi, ep);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
spin_unlock_irqrestore(&midi->transmit_lock, flags);
|
||||
goto drop_out;
|
||||
}
|
||||
} while (ret);
|
||||
|
||||
spin_unlock_irqrestore(&midi->transmit_lock, flags);
|
||||
|
|
|
@ -371,12 +371,6 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
|
|||
INIT_WORK(&gadget->work, usb_gadget_state_work);
|
||||
gadget->dev.parent = parent;
|
||||
|
||||
#ifdef CONFIG_HAS_DMA
|
||||
dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask);
|
||||
gadget->dev.dma_parms = parent->dma_parms;
|
||||
gadget->dev.dma_mask = parent->dma_mask;
|
||||
#endif
|
||||
|
||||
if (release)
|
||||
gadget->dev.release = release;
|
||||
else
|
||||
|
|
|
@ -190,7 +190,8 @@ static int usbhsf_pkt_handler(struct usbhs_pipe *pipe, int type)
|
|||
goto __usbhs_pkt_handler_end;
|
||||
}
|
||||
|
||||
ret = func(pkt, &is_done);
|
||||
if (likely(func))
|
||||
ret = func(pkt, &is_done);
|
||||
|
||||
if (is_done)
|
||||
__usbhsf_pkt_del(pkt);
|
||||
|
@ -889,6 +890,7 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done)
|
|||
|
||||
pkt->trans = len;
|
||||
|
||||
usbhsf_tx_irq_ctrl(pipe, 0);
|
||||
INIT_WORK(&pkt->work, xfer_work);
|
||||
schedule_work(&pkt->work);
|
||||
|
||||
|
|
|
@ -158,10 +158,14 @@ static void usbhsg_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt)
|
|||
struct usbhs_pipe *pipe = pkt->pipe;
|
||||
struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe);
|
||||
struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt);
|
||||
unsigned long flags;
|
||||
|
||||
ureq->req.actual = pkt->actual;
|
||||
|
||||
usbhsg_queue_pop(uep, ureq, 0);
|
||||
usbhs_lock(priv, flags);
|
||||
if (uep)
|
||||
__usbhsg_queue_pop(uep, ureq, 0);
|
||||
usbhs_unlock(priv, flags);
|
||||
}
|
||||
|
||||
static void usbhsg_queue_push(struct usbhsg_uep *uep,
|
||||
|
|
Загрузка…
Ссылка в новой задаче