Skip to content

Commit 80c82ff

Browse files
committed
Merge tag 'fixes-for-v4.14-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
Felipe writes: usb: fixes for v4.14-rc3 Alan Stern fixed 3 old bugs on dummy_hcd which were reported recently. Yoshihiro Shimoda continues his work on the renensas_usb3 driver by fixing several bugs all over the place. The most important of which is a fix for 2-stage control transfers, previously renesas_usb3 would, anyway, try to move a 0-length data stage, which is wrong. Apart from these, there are two minor bug fixes (atmel udc and ffs) and a new device ID for dwc3-of-simple.c
2 parents 8fec935 + c3cdce4 commit 80c82ff

File tree

7 files changed

+101
-18
lines changed

7 files changed

+101
-18
lines changed

drivers/usb/dwc3/dwc3-of-simple.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ static const struct of_device_id of_dwc3_simple_match[] = {
177177
{ .compatible = "rockchip,rk3399-dwc3" },
178178
{ .compatible = "xlnx,zynqmp-dwc3" },
179179
{ .compatible = "cavium,octeon-7130-usb-uctl" },
180+
{ .compatible = "sprd,sc9860-dwc3" },
180181
{ /* Sentinel */ }
181182
};
182183
MODULE_DEVICE_TABLE(of, of_dwc3_simple_match);

drivers/usb/gadget/function/f_fs.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
static void ffs_data_get(struct ffs_data *ffs);
4747
static void ffs_data_put(struct ffs_data *ffs);
4848
/* Creates new ffs_data object. */
49-
static struct ffs_data *__must_check ffs_data_new(void) __attribute__((malloc));
49+
static struct ffs_data *__must_check ffs_data_new(const char *dev_name)
50+
__attribute__((malloc));
5051

5152
/* Opened counter handling. */
5253
static void ffs_data_opened(struct ffs_data *ffs);
@@ -780,11 +781,12 @@ static void ffs_epfile_async_io_complete(struct usb_ep *_ep,
780781
struct usb_request *req)
781782
{
782783
struct ffs_io_data *io_data = req->context;
784+
struct ffs_data *ffs = io_data->ffs;
783785

784786
ENTER();
785787

786788
INIT_WORK(&io_data->work, ffs_user_copy_worker);
787-
schedule_work(&io_data->work);
789+
queue_work(ffs->io_completion_wq, &io_data->work);
788790
}
789791

790792
static void __ffs_epfile_read_buffer_free(struct ffs_epfile *epfile)
@@ -1500,7 +1502,7 @@ ffs_fs_mount(struct file_system_type *t, int flags,
15001502
if (unlikely(ret < 0))
15011503
return ERR_PTR(ret);
15021504

1503-
ffs = ffs_data_new();
1505+
ffs = ffs_data_new(dev_name);
15041506
if (unlikely(!ffs))
15051507
return ERR_PTR(-ENOMEM);
15061508
ffs->file_perms = data.perms;
@@ -1610,6 +1612,7 @@ static void ffs_data_put(struct ffs_data *ffs)
16101612
BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
16111613
waitqueue_active(&ffs->ep0req_completion.wait) ||
16121614
waitqueue_active(&ffs->wait));
1615+
destroy_workqueue(ffs->io_completion_wq);
16131616
kfree(ffs->dev_name);
16141617
kfree(ffs);
16151618
}
@@ -1642,14 +1645,20 @@ static void ffs_data_closed(struct ffs_data *ffs)
16421645
ffs_data_put(ffs);
16431646
}
16441647

1645-
static struct ffs_data *ffs_data_new(void)
1648+
static struct ffs_data *ffs_data_new(const char *dev_name)
16461649
{
16471650
struct ffs_data *ffs = kzalloc(sizeof *ffs, GFP_KERNEL);
16481651
if (unlikely(!ffs))
16491652
return NULL;
16501653

16511654
ENTER();
16521655

1656+
ffs->io_completion_wq = alloc_ordered_workqueue("%s", 0, dev_name);
1657+
if (!ffs->io_completion_wq) {
1658+
kfree(ffs);
1659+
return NULL;
1660+
}
1661+
16531662
refcount_set(&ffs->ref, 1);
16541663
atomic_set(&ffs->opened, 0);
16551664
ffs->state = FFS_READ_DESCRIPTORS;

drivers/usb/gadget/function/u_fs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ struct ffs_data {
279279
} file_perms;
280280

281281
struct eventfd_ctx *ffs_eventfd;
282+
struct workqueue_struct *io_completion_wq;
282283
bool no_disconnect;
283284
struct work_struct reset_work;
284285

drivers/usb/gadget/udc/atmel_usba_udc.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
#include <linux/of_gpio.h>
3030

3131
#include "atmel_usba_udc.h"
32+
#define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \
33+
| IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING)
3234

3335
#ifdef CONFIG_USB_GADGET_DEBUG_FS
3436
#include <linux/debugfs.h>
@@ -2361,7 +2363,7 @@ static int usba_udc_probe(struct platform_device *pdev)
23612363
IRQ_NOAUTOEN);
23622364
ret = devm_request_threaded_irq(&pdev->dev,
23632365
gpio_to_irq(udc->vbus_pin), NULL,
2364-
usba_vbus_irq_thread, IRQF_ONESHOT,
2366+
usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS,
23652367
"atmel_usba_udc", udc);
23662368
if (ret) {
23672369
udc->vbus_pin = -ENODEV;

drivers/usb/gadget/udc/dummy_hcd.c

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ struct dummy_hcd {
237237

238238
struct usb_device *udev;
239239
struct list_head urbp_list;
240+
struct urbp *next_frame_urbp;
241+
240242
u32 stream_en_ep;
241243
u8 num_stream[30 / 2];
242244

@@ -253,11 +255,13 @@ struct dummy {
253255
*/
254256
struct dummy_ep ep[DUMMY_ENDPOINTS];
255257
int address;
258+
int callback_usage;
256259
struct usb_gadget gadget;
257260
struct usb_gadget_driver *driver;
258261
struct dummy_request fifo_req;
259262
u8 fifo_buf[FIFO_SIZE];
260263
u16 devstatus;
264+
unsigned ints_enabled:1;
261265
unsigned udc_suspended:1;
262266
unsigned pullup:1;
263267

@@ -439,18 +443,27 @@ static void set_link_state(struct dummy_hcd *dum_hcd)
439443
(~dum_hcd->old_status) & dum_hcd->port_status;
440444

441445
/* Report reset and disconnect events to the driver */
442-
if (dum->driver && (disconnect || reset)) {
446+
if (dum->ints_enabled && (disconnect || reset)) {
443447
stop_activity(dum);
448+
++dum->callback_usage;
449+
spin_unlock(&dum->lock);
444450
if (reset)
445451
usb_gadget_udc_reset(&dum->gadget, dum->driver);
446452
else
447453
dum->driver->disconnect(&dum->gadget);
454+
spin_lock(&dum->lock);
455+
--dum->callback_usage;
448456
}
449-
} else if (dum_hcd->active != dum_hcd->old_active) {
457+
} else if (dum_hcd->active != dum_hcd->old_active &&
458+
dum->ints_enabled) {
459+
++dum->callback_usage;
460+
spin_unlock(&dum->lock);
450461
if (dum_hcd->old_active && dum->driver->suspend)
451462
dum->driver->suspend(&dum->gadget);
452463
else if (!dum_hcd->old_active && dum->driver->resume)
453464
dum->driver->resume(&dum->gadget);
465+
spin_lock(&dum->lock);
466+
--dum->callback_usage;
454467
}
455468

456469
dum_hcd->old_status = dum_hcd->port_status;
@@ -971,8 +984,11 @@ static int dummy_udc_start(struct usb_gadget *g,
971984
* can't enumerate without help from the driver we're binding.
972985
*/
973986

987+
spin_lock_irq(&dum->lock);
974988
dum->devstatus = 0;
975989
dum->driver = driver;
990+
dum->ints_enabled = 1;
991+
spin_unlock_irq(&dum->lock);
976992

977993
return 0;
978994
}
@@ -983,6 +999,16 @@ static int dummy_udc_stop(struct usb_gadget *g)
983999
struct dummy *dum = dum_hcd->dum;
9841000

9851001
spin_lock_irq(&dum->lock);
1002+
dum->ints_enabled = 0;
1003+
stop_activity(dum);
1004+
1005+
/* emulate synchronize_irq(): wait for callbacks to finish */
1006+
while (dum->callback_usage > 0) {
1007+
spin_unlock_irq(&dum->lock);
1008+
usleep_range(1000, 2000);
1009+
spin_lock_irq(&dum->lock);
1010+
}
1011+
9861012
dum->driver = NULL;
9871013
spin_unlock_irq(&dum->lock);
9881014

@@ -1036,7 +1062,12 @@ static int dummy_udc_probe(struct platform_device *pdev)
10361062
memzero_explicit(&dum->gadget, sizeof(struct usb_gadget));
10371063
dum->gadget.name = gadget_name;
10381064
dum->gadget.ops = &dummy_ops;
1039-
dum->gadget.max_speed = USB_SPEED_SUPER;
1065+
if (mod_data.is_super_speed)
1066+
dum->gadget.max_speed = USB_SPEED_SUPER;
1067+
else if (mod_data.is_high_speed)
1068+
dum->gadget.max_speed = USB_SPEED_HIGH;
1069+
else
1070+
dum->gadget.max_speed = USB_SPEED_FULL;
10401071

10411072
dum->gadget.dev.parent = &pdev->dev;
10421073
init_dummy_udc_hw(dum);
@@ -1245,6 +1276,8 @@ static int dummy_urb_enqueue(
12451276

12461277
list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list);
12471278
urb->hcpriv = urbp;
1279+
if (!dum_hcd->next_frame_urbp)
1280+
dum_hcd->next_frame_urbp = urbp;
12481281
if (usb_pipetype(urb->pipe) == PIPE_CONTROL)
12491282
urb->error_count = 1; /* mark as a new urb */
12501283

@@ -1520,6 +1553,8 @@ static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address)
15201553
if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ?
15211554
dum->ss_hcd : dum->hs_hcd)))
15221555
return NULL;
1556+
if (!dum->ints_enabled)
1557+
return NULL;
15231558
if ((address & ~USB_DIR_IN) == 0)
15241559
return &dum->ep[0];
15251560
for (i = 1; i < DUMMY_ENDPOINTS; i++) {
@@ -1761,6 +1796,7 @@ static void dummy_timer(unsigned long _dum_hcd)
17611796
spin_unlock_irqrestore(&dum->lock, flags);
17621797
return;
17631798
}
1799+
dum_hcd->next_frame_urbp = NULL;
17641800

17651801
for (i = 0; i < DUMMY_ENDPOINTS; i++) {
17661802
if (!ep_info[i].name)
@@ -1777,6 +1813,10 @@ static void dummy_timer(unsigned long _dum_hcd)
17771813
int type;
17781814
int status = -EINPROGRESS;
17791815

1816+
/* stop when we reach URBs queued after the timer interrupt */
1817+
if (urbp == dum_hcd->next_frame_urbp)
1818+
break;
1819+
17801820
urb = urbp->urb;
17811821
if (urb->unlinked)
17821822
goto return_urb;
@@ -1856,10 +1896,12 @@ static void dummy_timer(unsigned long _dum_hcd)
18561896
* until setup() returns; no reentrancy issues etc.
18571897
*/
18581898
if (value > 0) {
1899+
++dum->callback_usage;
18591900
spin_unlock(&dum->lock);
18601901
value = dum->driver->setup(&dum->gadget,
18611902
&setup);
18621903
spin_lock(&dum->lock);
1904+
--dum->callback_usage;
18631905

18641906
if (value >= 0) {
18651907
/* no delays (max 64KB data stage) */
@@ -2560,8 +2602,6 @@ static struct hc_driver dummy_hcd = {
25602602
.product_desc = "Dummy host controller",
25612603
.hcd_priv_size = sizeof(struct dummy_hcd),
25622604

2563-
.flags = HCD_USB3 | HCD_SHARED,
2564-
25652605
.reset = dummy_setup,
25662606
.start = dummy_start,
25672607
.stop = dummy_stop,
@@ -2590,8 +2630,12 @@ static int dummy_hcd_probe(struct platform_device *pdev)
25902630
dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc);
25912631
dum = *((void **)dev_get_platdata(&pdev->dev));
25922632

2593-
if (!mod_data.is_super_speed)
2633+
if (mod_data.is_super_speed)
2634+
dummy_hcd.flags = HCD_USB3 | HCD_SHARED;
2635+
else if (mod_data.is_high_speed)
25942636
dummy_hcd.flags = HCD_USB2;
2637+
else
2638+
dummy_hcd.flags = HCD_USB11;
25952639
hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev));
25962640
if (!hs_hcd)
25972641
return -ENOMEM;

drivers/usb/gadget/udc/renesas_usb3.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep,
10381038
usb3_ep->ep.maxpacket);
10391039
u8 *buf = usb3_req->req.buf + usb3_req->req.actual;
10401040
u32 tmp = 0;
1041-
bool is_last;
1041+
bool is_last = !len ? true : false;
10421042

10431043
if (usb3_wait_pipe_status(usb3_ep, PX_STA_BUFSTS) < 0)
10441044
return -EBUSY;
@@ -1059,7 +1059,8 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep,
10591059
usb3_write(usb3, tmp, fifo_reg);
10601060
}
10611061

1062-
is_last = usb3_is_transfer_complete(usb3_ep, usb3_req);
1062+
if (!is_last)
1063+
is_last = usb3_is_transfer_complete(usb3_ep, usb3_req);
10631064
/* Send the data */
10641065
usb3_set_px_con_send(usb3_ep, len, is_last);
10651066

@@ -1150,7 +1151,8 @@ static void usb3_start_pipe0(struct renesas_usb3_ep *usb3_ep,
11501151
usb3_set_p0_con_for_ctrl_read_data(usb3);
11511152
} else {
11521153
usb3_clear_bit(usb3, P0_MOD_DIR, USB3_P0_MOD);
1153-
usb3_set_p0_con_for_ctrl_write_data(usb3);
1154+
if (usb3_req->req.length)
1155+
usb3_set_p0_con_for_ctrl_write_data(usb3);
11541156
}
11551157

11561158
usb3_p0_xfer(usb3_ep, usb3_req);
@@ -2053,7 +2055,16 @@ static u32 usb3_calc_ramarea(int ram_size)
20532055
static u32 usb3_calc_rammap_val(struct renesas_usb3_ep *usb3_ep,
20542056
const struct usb_endpoint_descriptor *desc)
20552057
{
2056-
return usb3_ep->rammap_val | PN_RAMMAP_MPKT(usb_endpoint_maxp(desc));
2058+
int i;
2059+
const u32 max_packet_array[] = {8, 16, 32, 64, 512};
2060+
u32 mpkt = PN_RAMMAP_MPKT(1024);
2061+
2062+
for (i = 0; i < ARRAY_SIZE(max_packet_array); i++) {
2063+
if (usb_endpoint_maxp(desc) <= max_packet_array[i])
2064+
mpkt = PN_RAMMAP_MPKT(max_packet_array[i]);
2065+
}
2066+
2067+
return usb3_ep->rammap_val | mpkt;
20572068
}
20582069

20592070
static int usb3_enable_pipe_n(struct renesas_usb3_ep *usb3_ep,

drivers/usb/renesas_usbhs/fifo.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,26 @@ static void usbhsf_fifo_clear(struct usbhs_pipe *pipe,
282282
struct usbhs_fifo *fifo)
283283
{
284284
struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
285+
int ret = 0;
285286

286-
if (!usbhs_pipe_is_dcp(pipe))
287-
usbhsf_fifo_barrier(priv, fifo);
287+
if (!usbhs_pipe_is_dcp(pipe)) {
288+
/*
289+
* This driver checks the pipe condition first to avoid -EBUSY
290+
* from usbhsf_fifo_barrier() with about 10 msec delay in
291+
* the interrupt handler if the pipe is RX direction and empty.
292+
*/
293+
if (usbhs_pipe_is_dir_in(pipe))
294+
ret = usbhs_pipe_is_accessible(pipe);
295+
if (!ret)
296+
ret = usbhsf_fifo_barrier(priv, fifo);
297+
}
288298

289-
usbhs_write(priv, fifo->ctr, BCLR);
299+
/*
300+
* if non-DCP pipe, this driver should set BCLR when
301+
* usbhsf_fifo_barrier() returns 0.
302+
*/
303+
if (!ret)
304+
usbhs_write(priv, fifo->ctr, BCLR);
290305
}
291306

292307
static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv,

0 commit comments

Comments
 (0)