Skip to content

Commit d6b4278

Browse files
committed
Merge tag 'usb-6.17-rc6' 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 and new device ids for 6.17-rc6. Included in here are: - new usb-serial driver device ids - dummy-hcd locking bugfix for rt-enabled systems (which is crazy, but people have odd testing requirements at times...) - xhci driver bugfixes for reported issues - typec driver bugfix - midi2 gadget driver bugfixes - usb core sysfs file regression fix from -rc1 All of these, except for the last usb sysfs file fix, have been in linux-next with no reported issues. The sysfs fix was added to the tree on Friday, and is "obviously correct" and should not have any problems either, it just didn't have any time for linux-next to pick up (0-day had no problems with it)" * tag 'usb-6.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: USB: core: remove the move buf action usb: gadget: midi2: Fix MIDI2 IN EP max packet size usb: gadget: midi2: Fix missing UMP group attributes initialization usb: typec: tcpm: properly deliver cable vdms to altmode drivers USB: gadget: dummy-hcd: Fix locking bug in RT-enabled kernels xhci: fix memory leak regression when freeing xhci vdev devices depth first xhci: dbc: Fix full DbC transfer ring after several reconnects xhci: dbc: decouple endpoint allocation from initialization USB: serial: option: add Telit Cinterion LE910C4-WWX new compositions USB: serial: option: add Telit Cinterion FN990A w/audio compositions
2 parents df86f91 + 9dfec4a commit d6b4278

File tree

7 files changed

+108
-40
lines changed

7 files changed

+108
-40
lines changed

drivers/usb/core/driver.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,11 @@ ssize_t usb_show_dynids(struct usb_dynids *dynids, char *buf)
119119
guard(mutex)(&usb_dynids_lock);
120120
list_for_each_entry(dynid, &dynids->list, node)
121121
if (dynid->id.bInterfaceClass != 0)
122-
count += sysfs_emit_at(&buf[count], count, "%04x %04x %02x\n",
122+
count += sysfs_emit_at(buf, count, "%04x %04x %02x\n",
123123
dynid->id.idVendor, dynid->id.idProduct,
124124
dynid->id.bInterfaceClass);
125125
else
126-
count += sysfs_emit_at(&buf[count], count, "%04x %04x\n",
126+
count += sysfs_emit_at(buf, count, "%04x %04x\n",
127127
dynid->id.idVendor, dynid->id.idProduct);
128128
return count;
129129
}

drivers/usb/gadget/function/f_midi2.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,7 @@ static int f_midi2_create_card(struct f_midi2 *midi2)
15991599
strscpy(fb->info.name, ump_fb_name(b),
16001600
sizeof(fb->info.name));
16011601
}
1602+
snd_ump_update_group_attrs(ump);
16021603
}
16031604

16041605
for (i = 0; i < midi2->num_eps; i++) {
@@ -1736,9 +1737,12 @@ static int f_midi2_create_usb_configs(struct f_midi2 *midi2,
17361737
case USB_SPEED_HIGH:
17371738
midi2_midi1_ep_out_desc.wMaxPacketSize = cpu_to_le16(512);
17381739
midi2_midi1_ep_in_desc.wMaxPacketSize = cpu_to_le16(512);
1739-
for (i = 0; i < midi2->num_eps; i++)
1740+
for (i = 0; i < midi2->num_eps; i++) {
17401741
midi2_midi2_ep_out_desc[i].wMaxPacketSize =
17411742
cpu_to_le16(512);
1743+
midi2_midi2_ep_in_desc[i].wMaxPacketSize =
1744+
cpu_to_le16(512);
1745+
}
17421746
fallthrough;
17431747
case USB_SPEED_FULL:
17441748
midi1_in_eps = midi2_midi1_ep_in_descs;
@@ -1747,9 +1751,12 @@ static int f_midi2_create_usb_configs(struct f_midi2 *midi2,
17471751
case USB_SPEED_SUPER:
17481752
midi2_midi1_ep_out_desc.wMaxPacketSize = cpu_to_le16(1024);
17491753
midi2_midi1_ep_in_desc.wMaxPacketSize = cpu_to_le16(1024);
1750-
for (i = 0; i < midi2->num_eps; i++)
1754+
for (i = 0; i < midi2->num_eps; i++) {
17511755
midi2_midi2_ep_out_desc[i].wMaxPacketSize =
17521756
cpu_to_le16(1024);
1757+
midi2_midi2_ep_in_desc[i].wMaxPacketSize =
1758+
cpu_to_le16(1024);
1759+
}
17531760
midi1_in_eps = midi2_midi1_ep_in_ss_descs;
17541761
midi1_out_eps = midi2_midi1_ep_out_ss_descs;
17551762
break;

drivers/usb/gadget/udc/dummy_hcd.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -765,8 +765,7 @@ static int dummy_dequeue(struct usb_ep *_ep, struct usb_request *_req)
765765
if (!dum->driver)
766766
return -ESHUTDOWN;
767767

768-
local_irq_save(flags);
769-
spin_lock(&dum->lock);
768+
spin_lock_irqsave(&dum->lock, flags);
770769
list_for_each_entry(iter, &ep->queue, queue) {
771770
if (&iter->req != _req)
772771
continue;
@@ -776,15 +775,16 @@ static int dummy_dequeue(struct usb_ep *_ep, struct usb_request *_req)
776775
retval = 0;
777776
break;
778777
}
779-
spin_unlock(&dum->lock);
780778

781779
if (retval == 0) {
782780
dev_dbg(udc_dev(dum),
783781
"dequeued req %p from %s, len %d buf %p\n",
784782
req, _ep->name, _req->length, _req->buf);
783+
spin_unlock(&dum->lock);
785784
usb_gadget_giveback_request(_ep, _req);
785+
spin_lock(&dum->lock);
786786
}
787-
local_irq_restore(flags);
787+
spin_unlock_irqrestore(&dum->lock, flags);
788788
return retval;
789789
}
790790

drivers/usb/host/xhci-dbgcap.c

Lines changed: 67 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,34 @@ static u32 xhci_dbc_populate_strings(struct dbc_str_descs *strings)
101101
return string_length;
102102
}
103103

104+
static void xhci_dbc_init_ep_contexts(struct xhci_dbc *dbc)
105+
{
106+
struct xhci_ep_ctx *ep_ctx;
107+
unsigned int max_burst;
108+
dma_addr_t deq;
109+
110+
max_burst = DBC_CTRL_MAXBURST(readl(&dbc->regs->control));
111+
112+
/* Populate bulk out endpoint context: */
113+
ep_ctx = dbc_bulkout_ctx(dbc);
114+
deq = dbc_bulkout_enq(dbc);
115+
ep_ctx->ep_info = 0;
116+
ep_ctx->ep_info2 = dbc_epctx_info2(BULK_OUT_EP, 1024, max_burst);
117+
ep_ctx->deq = cpu_to_le64(deq | dbc->ring_out->cycle_state);
118+
119+
/* Populate bulk in endpoint context: */
120+
ep_ctx = dbc_bulkin_ctx(dbc);
121+
deq = dbc_bulkin_enq(dbc);
122+
ep_ctx->ep_info = 0;
123+
ep_ctx->ep_info2 = dbc_epctx_info2(BULK_IN_EP, 1024, max_burst);
124+
ep_ctx->deq = cpu_to_le64(deq | dbc->ring_in->cycle_state);
125+
}
126+
104127
static void xhci_dbc_init_contexts(struct xhci_dbc *dbc, u32 string_length)
105128
{
106129
struct dbc_info_context *info;
107-
struct xhci_ep_ctx *ep_ctx;
108130
u32 dev_info;
109-
dma_addr_t deq, dma;
110-
unsigned int max_burst;
131+
dma_addr_t dma;
111132

112133
if (!dbc)
113134
return;
@@ -121,20 +142,8 @@ static void xhci_dbc_init_contexts(struct xhci_dbc *dbc, u32 string_length)
121142
info->serial = cpu_to_le64(dma + DBC_MAX_STRING_LENGTH * 3);
122143
info->length = cpu_to_le32(string_length);
123144

124-
/* Populate bulk out endpoint context: */
125-
ep_ctx = dbc_bulkout_ctx(dbc);
126-
max_burst = DBC_CTRL_MAXBURST(readl(&dbc->regs->control));
127-
deq = dbc_bulkout_enq(dbc);
128-
ep_ctx->ep_info = 0;
129-
ep_ctx->ep_info2 = dbc_epctx_info2(BULK_OUT_EP, 1024, max_burst);
130-
ep_ctx->deq = cpu_to_le64(deq | dbc->ring_out->cycle_state);
131-
132-
/* Populate bulk in endpoint context: */
133-
ep_ctx = dbc_bulkin_ctx(dbc);
134-
deq = dbc_bulkin_enq(dbc);
135-
ep_ctx->ep_info = 0;
136-
ep_ctx->ep_info2 = dbc_epctx_info2(BULK_IN_EP, 1024, max_burst);
137-
ep_ctx->deq = cpu_to_le64(deq | dbc->ring_in->cycle_state);
145+
/* Populate bulk in and out endpoint contexts: */
146+
xhci_dbc_init_ep_contexts(dbc);
138147

139148
/* Set DbC context and info registers: */
140149
lo_hi_writeq(dbc->ctx->dma, &dbc->regs->dccp);
@@ -436,6 +445,42 @@ dbc_alloc_ctx(struct device *dev, gfp_t flags)
436445
return ctx;
437446
}
438447

448+
static void xhci_dbc_ring_init(struct xhci_ring *ring)
449+
{
450+
struct xhci_segment *seg = ring->first_seg;
451+
452+
/* clear all trbs on ring in case of old ring */
453+
memset(seg->trbs, 0, TRB_SEGMENT_SIZE);
454+
455+
/* Only event ring does not use link TRB */
456+
if (ring->type != TYPE_EVENT) {
457+
union xhci_trb *trb = &seg->trbs[TRBS_PER_SEGMENT - 1];
458+
459+
trb->link.segment_ptr = cpu_to_le64(ring->first_seg->dma);
460+
trb->link.control = cpu_to_le32(LINK_TOGGLE | TRB_TYPE(TRB_LINK));
461+
}
462+
xhci_initialize_ring_info(ring);
463+
}
464+
465+
static int xhci_dbc_reinit_ep_rings(struct xhci_dbc *dbc)
466+
{
467+
struct xhci_ring *in_ring = dbc->eps[BULK_IN].ring;
468+
struct xhci_ring *out_ring = dbc->eps[BULK_OUT].ring;
469+
470+
if (!in_ring || !out_ring || !dbc->ctx) {
471+
dev_warn(dbc->dev, "Can't re-init unallocated endpoints\n");
472+
return -ENODEV;
473+
}
474+
475+
xhci_dbc_ring_init(in_ring);
476+
xhci_dbc_ring_init(out_ring);
477+
478+
/* set ep context enqueue, dequeue, and cycle to initial values */
479+
xhci_dbc_init_ep_contexts(dbc);
480+
481+
return 0;
482+
}
483+
439484
static struct xhci_ring *
440485
xhci_dbc_ring_alloc(struct device *dev, enum xhci_ring_type type, gfp_t flags)
441486
{
@@ -464,15 +509,10 @@ xhci_dbc_ring_alloc(struct device *dev, enum xhci_ring_type type, gfp_t flags)
464509

465510
seg->dma = dma;
466511

467-
/* Only event ring does not use link TRB */
468-
if (type != TYPE_EVENT) {
469-
union xhci_trb *trb = &seg->trbs[TRBS_PER_SEGMENT - 1];
470-
471-
trb->link.segment_ptr = cpu_to_le64(dma);
472-
trb->link.control = cpu_to_le32(LINK_TOGGLE | TRB_TYPE(TRB_LINK));
473-
}
474512
INIT_LIST_HEAD(&ring->td_list);
475-
xhci_initialize_ring_info(ring);
513+
514+
xhci_dbc_ring_init(ring);
515+
476516
return ring;
477517
dma_fail:
478518
kfree(seg);
@@ -864,7 +904,7 @@ static enum evtreturn xhci_dbc_do_handle_events(struct xhci_dbc *dbc)
864904
dev_info(dbc->dev, "DbC cable unplugged\n");
865905
dbc->state = DS_ENABLED;
866906
xhci_dbc_flush_requests(dbc);
867-
907+
xhci_dbc_reinit_ep_rings(dbc);
868908
return EVT_DISC;
869909
}
870910

@@ -874,7 +914,7 @@ static enum evtreturn xhci_dbc_do_handle_events(struct xhci_dbc *dbc)
874914
writel(portsc, &dbc->regs->portsc);
875915
dbc->state = DS_ENABLED;
876916
xhci_dbc_flush_requests(dbc);
877-
917+
xhci_dbc_reinit_ep_rings(dbc);
878918
return EVT_DISC;
879919
}
880920

drivers/usb/host/xhci-mem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ static void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_i
962962
out:
963963
/* we are now at a leaf device */
964964
xhci_debugfs_remove_slot(xhci, slot_id);
965-
xhci_free_virt_device(xhci, vdev, slot_id);
965+
xhci_free_virt_device(xhci, xhci->devs[slot_id], slot_id);
966966
}
967967

968968
int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,

drivers/usb/serial/option.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,7 +1322,18 @@ static const struct usb_device_id option_ids[] = {
13221322
.driver_info = NCTRL(0) | RSVD(3) },
13231323
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */
13241324
.driver_info = NCTRL(0) },
1325+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1034, 0xff), /* Telit LE910C4-WWX (rmnet) */
1326+
.driver_info = RSVD(2) },
13251327
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1035, 0xff) }, /* Telit LE910C4-WWX (ECM) */
1328+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1036, 0xff) }, /* Telit LE910C4-WWX */
1329+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1037, 0xff), /* Telit LE910C4-WWX (rmnet) */
1330+
.driver_info = NCTRL(0) | NCTRL(1) | RSVD(4) },
1331+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1038, 0xff), /* Telit LE910C4-WWX (rmnet) */
1332+
.driver_info = NCTRL(0) | RSVD(3) },
1333+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x103b, 0xff), /* Telit LE910C4-WWX */
1334+
.driver_info = NCTRL(0) | NCTRL(1) },
1335+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x103c, 0xff), /* Telit LE910C4-WWX */
1336+
.driver_info = NCTRL(0) },
13261337
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0),
13271338
.driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) },
13281339
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),
@@ -1369,6 +1380,12 @@ static const struct usb_device_id option_ids[] = {
13691380
.driver_info = NCTRL(0) | RSVD(1) },
13701381
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1075, 0xff), /* Telit FN990A (PCIe) */
13711382
.driver_info = RSVD(0) },
1383+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1077, 0xff), /* Telit FN990A (rmnet + audio) */
1384+
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
1385+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1078, 0xff), /* Telit FN990A (MBIM + audio) */
1386+
.driver_info = NCTRL(0) | RSVD(1) },
1387+
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1079, 0xff), /* Telit FN990A (RNDIS + audio) */
1388+
.driver_info = NCTRL(2) | RSVD(3) },
13721389
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1080, 0xff), /* Telit FE990A (rmnet) */
13731390
.driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
13741391
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1081, 0xff), /* Telit FE990A (MBIM) */

drivers/usb/typec/tcpm/tcpm.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,17 +2426,21 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
24262426
case ADEV_NONE:
24272427
break;
24282428
case ADEV_NOTIFY_USB_AND_QUEUE_VDM:
2429-
WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
2430-
typec_altmode_vdm(adev, p[0], &p[1], cnt);
2429+
if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2430+
typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
2431+
} else {
2432+
WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
2433+
typec_altmode_vdm(adev, p[0], &p[1], cnt);
2434+
}
24312435
break;
24322436
case ADEV_QUEUE_VDM:
2433-
if (response_tx_sop_type == TCPC_TX_SOP_PRIME)
2437+
if (rx_sop_type == TCPC_TX_SOP_PRIME)
24342438
typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
24352439
else
24362440
typec_altmode_vdm(adev, p[0], &p[1], cnt);
24372441
break;
24382442
case ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL:
2439-
if (response_tx_sop_type == TCPC_TX_SOP_PRIME) {
2443+
if (rx_sop_type == TCPC_TX_SOP_PRIME) {
24402444
if (typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P,
24412445
p[0], &p[1], cnt)) {
24422446
int svdm_version = typec_get_cable_svdm_version(

0 commit comments

Comments
 (0)