USB fixes for 5.16-final
Here are some small USB driver fixes for 5.16 to resolve some reported problems: - mtu3 driver fixes - typec ucsi driver fix - xhci driver quirk added - usb gadget f_fs fix for reported crash All of these have been in linux-next for a while with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYc3jlA8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymbwgCfbEHPGRtOsbEFFiJugbKhVHCi0w8An0CHzzTB 3nEwm+l4BUkUcvqTxc7A =95Py -----END PGP SIGNATURE----- Merge tag 'usb-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg KH: "Here are some small USB driver fixes for 5.16 to resolve some reported problems: - mtu3 driver fixes - typec ucsi driver fix - xhci driver quirk added - usb gadget f_fs fix for reported crash All of these have been in linux-next for a while with no reported problems" * tag 'usb-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: usb: typec: ucsi: Only check the contract if there is a connection xhci: Fresco FL1100 controller should not have BROKEN_MSI quirk set. usb: mtu3: set interval of FS intr and isoc endpoint usb: mtu3: fix list_head check warning usb: mtu3: add memory barrier before set GPD's HWO usb: mtu3: fix interval value for intr and isoc usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear.
This commit is contained in:
Коммит
2d40060bb5
|
@ -1773,11 +1773,15 @@ static void ffs_data_clear(struct ffs_data *ffs)
|
|||
|
||||
BUG_ON(ffs->gadget);
|
||||
|
||||
if (ffs->epfiles)
|
||||
if (ffs->epfiles) {
|
||||
ffs_epfiles_destroy(ffs->epfiles, ffs->eps_count);
|
||||
ffs->epfiles = NULL;
|
||||
}
|
||||
|
||||
if (ffs->ffs_eventfd)
|
||||
if (ffs->ffs_eventfd) {
|
||||
eventfd_ctx_put(ffs->ffs_eventfd);
|
||||
ffs->ffs_eventfd = NULL;
|
||||
}
|
||||
|
||||
kfree(ffs->raw_descs_data);
|
||||
kfree(ffs->raw_strings);
|
||||
|
@ -1790,7 +1794,6 @@ static void ffs_data_reset(struct ffs_data *ffs)
|
|||
|
||||
ffs_data_clear(ffs);
|
||||
|
||||
ffs->epfiles = NULL;
|
||||
ffs->raw_descs_data = NULL;
|
||||
ffs->raw_descs = NULL;
|
||||
ffs->raw_strings = NULL;
|
||||
|
|
|
@ -123,7 +123,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|||
/* Look for vendor-specific quirks */
|
||||
if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
|
||||
(pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK ||
|
||||
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 ||
|
||||
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) {
|
||||
if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
|
||||
pdev->revision == 0x0) {
|
||||
|
@ -158,6 +157,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|||
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1009)
|
||||
xhci->quirks |= XHCI_BROKEN_STREAMS;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
|
||||
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1100)
|
||||
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_NEC)
|
||||
xhci->quirks |= XHCI_NEC_HOST;
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
|
|||
if (usb_endpoint_xfer_int(desc) ||
|
||||
usb_endpoint_xfer_isoc(desc)) {
|
||||
interval = desc->bInterval;
|
||||
interval = clamp_val(interval, 1, 16) - 1;
|
||||
interval = clamp_val(interval, 1, 16);
|
||||
if (usb_endpoint_xfer_isoc(desc) && comp_desc)
|
||||
mult = comp_desc->bmAttributes;
|
||||
}
|
||||
|
@ -89,9 +89,16 @@ static int mtu3_ep_enable(struct mtu3_ep *mep)
|
|||
if (usb_endpoint_xfer_isoc(desc) ||
|
||||
usb_endpoint_xfer_int(desc)) {
|
||||
interval = desc->bInterval;
|
||||
interval = clamp_val(interval, 1, 16) - 1;
|
||||
interval = clamp_val(interval, 1, 16);
|
||||
mult = usb_endpoint_maxp_mult(desc) - 1;
|
||||
}
|
||||
break;
|
||||
case USB_SPEED_FULL:
|
||||
if (usb_endpoint_xfer_isoc(desc))
|
||||
interval = clamp_val(desc->bInterval, 1, 16);
|
||||
else if (usb_endpoint_xfer_int(desc))
|
||||
interval = clamp_val(desc->bInterval, 1, 255);
|
||||
|
||||
break;
|
||||
default:
|
||||
break; /*others are ignored */
|
||||
|
@ -235,6 +242,7 @@ struct usb_request *mtu3_alloc_request(struct usb_ep *ep, gfp_t gfp_flags)
|
|||
mreq->request.dma = DMA_ADDR_INVALID;
|
||||
mreq->epnum = mep->epnum;
|
||||
mreq->mep = mep;
|
||||
INIT_LIST_HEAD(&mreq->list);
|
||||
trace_mtu3_alloc_request(mreq);
|
||||
|
||||
return &mreq->request;
|
||||
|
|
|
@ -273,6 +273,8 @@ static int mtu3_prepare_tx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)
|
|||
gpd->dw3_info |= cpu_to_le32(GPD_EXT_FLAG_ZLP);
|
||||
}
|
||||
|
||||
/* prevent reorder, make sure GPD's HWO is set last */
|
||||
mb();
|
||||
gpd->dw0_info |= cpu_to_le32(GPD_FLAGS_IOC | GPD_FLAGS_HWO);
|
||||
|
||||
mreq->gpd = gpd;
|
||||
|
@ -306,6 +308,8 @@ static int mtu3_prepare_rx_gpd(struct mtu3_ep *mep, struct mtu3_request *mreq)
|
|||
gpd->next_gpd = cpu_to_le32(lower_32_bits(enq_dma));
|
||||
ext_addr |= GPD_EXT_NGP(mtu, upper_32_bits(enq_dma));
|
||||
gpd->dw3_info = cpu_to_le32(ext_addr);
|
||||
/* prevent reorder, make sure GPD's HWO is set last */
|
||||
mb();
|
||||
gpd->dw0_info |= cpu_to_le32(GPD_FLAGS_IOC | GPD_FLAGS_HWO);
|
||||
|
||||
mreq->gpd = gpd;
|
||||
|
@ -445,7 +449,8 @@ static void qmu_tx_zlp_error_handler(struct mtu3 *mtu, u8 epnum)
|
|||
return;
|
||||
}
|
||||
mtu3_setbits(mbase, MU3D_EP_TXCR0(mep->epnum), TX_TXPKTRDY);
|
||||
|
||||
/* prevent reorder, make sure GPD's HWO is set last */
|
||||
mb();
|
||||
/* by pass the current GDP */
|
||||
gpd_current->dw0_info |= cpu_to_le32(GPD_FLAGS_BPS | GPD_FLAGS_HWO);
|
||||
|
||||
|
|
|
@ -1150,7 +1150,9 @@ static int ucsi_register_port(struct ucsi *ucsi, int index)
|
|||
ret = 0;
|
||||
}
|
||||
|
||||
if (UCSI_CONSTAT_PWR_OPMODE(con->status.flags) == UCSI_CONSTAT_PWR_OPMODE_PD) {
|
||||
if (con->partner &&
|
||||
UCSI_CONSTAT_PWR_OPMODE(con->status.flags) ==
|
||||
UCSI_CONSTAT_PWR_OPMODE_PD) {
|
||||
ucsi_get_src_pdos(con);
|
||||
ucsi_check_altmodes(con);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче