hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/usb/gadget/udc/net2280.c
....@@ -52,6 +52,7 @@
5252 #include <linux/usb/gadget.h>
5353 #include <linux/prefetch.h>
5454 #include <linux/io.h>
55
+#include <linux/iopoll.h>
5556
5657 #include <asm/byteorder.h>
5758 #include <asm/irq.h>
....@@ -360,18 +361,16 @@
360361 static int handshake(u32 __iomem *ptr, u32 mask, u32 done, int usec)
361362 {
362363 u32 result;
364
+ int ret;
363365
364
- do {
365
- result = readl(ptr);
366
- if (result == ~(u32)0) /* "device unplugged" */
367
- return -ENODEV;
368
- result &= mask;
369
- if (result == done)
370
- return 0;
371
- udelay(1);
372
- usec--;
373
- } while (usec > 0);
374
- return -ETIMEDOUT;
366
+ ret = readl_poll_timeout_atomic(ptr, result,
367
+ ((result & mask) == done ||
368
+ result == U32_MAX),
369
+ 1, usec);
370
+ if (result == U32_MAX) /* device unplugged */
371
+ return -ENODEV;
372
+
373
+ return ret;
375374 }
376375
377376 static const struct usb_ep_ops net2280_ep_ops;
....@@ -516,8 +515,8 @@
516515 unsigned long flags;
517516
518517 ep = container_of(_ep, struct net2280_ep, ep);
519
- if (!_ep || !ep->desc || _ep->name == ep0name) {
520
- pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep);
518
+ if (!_ep || _ep->name == ep0name) {
519
+ pr_err("%s: Invalid ep=%p\n", __func__, _ep);
521520 return -EINVAL;
522521 }
523522 spin_lock_irqsave(&ep->dev->lock, flags);
....@@ -789,8 +788,7 @@
789788 (void) readl(&ep->regs->ep_rsp);
790789 }
791790
792
- return is_short || ((req->req.actual == req->req.length) &&
793
- !req->req.zero);
791
+ return is_short || req->req.actual == req->req.length;
794792 }
795793
796794 /* fill out dma descriptor to match a given request */
....@@ -1058,7 +1056,7 @@
10581056 /* PIO ... stuff the fifo, or unblock it. */
10591057 if (ep->is_in)
10601058 write_fifo(ep, _req);
1061
- else if (list_empty(&ep->queue)) {
1059
+ else {
10621060 u32 s;
10631061
10641062 /* OUT FIFO might have packet(s) buffered */
....@@ -1547,9 +1545,6 @@
15471545 }
15481546
15491547 spin_unlock_irqrestore(&dev->lock, flags);
1550
-
1551
- if (!is_on && dev->driver)
1552
- dev->driver->disconnect(&dev->gadget);
15531548
15541549 return 0;
15551550 }
....@@ -2248,30 +2243,40 @@
22482243 }
22492244
22502245 /* Hardware Defect and Workaround */
2251
- val = readl(&dev->ll_lfps_regs->ll_lfps_5);
2246
+ val = readl(&dev->llregs->ll_lfps_5);
22522247 val &= ~(0xf << TIMER_LFPS_6US);
22532248 val |= 0x5 << TIMER_LFPS_6US;
2254
- writel(val, &dev->ll_lfps_regs->ll_lfps_5);
2249
+ writel(val, &dev->llregs->ll_lfps_5);
22552250
2256
- val = readl(&dev->ll_lfps_regs->ll_lfps_6);
2251
+ val = readl(&dev->llregs->ll_lfps_6);
22572252 val &= ~(0xffff << TIMER_LFPS_80US);
22582253 val |= 0x0100 << TIMER_LFPS_80US;
2259
- writel(val, &dev->ll_lfps_regs->ll_lfps_6);
2254
+ writel(val, &dev->llregs->ll_lfps_6);
22602255
22612256 /*
22622257 * AA_AB Errata. Issue 4. Workaround for SuperSpeed USB
22632258 * Hot Reset Exit Handshake may Fail in Specific Case using
22642259 * Default Register Settings. Workaround for Enumeration test.
22652260 */
2266
- val = readl(&dev->ll_tsn_regs->ll_tsn_counters_2);
2261
+ val = readl(&dev->llregs->ll_tsn_counters_2);
22672262 val &= ~(0x1f << HOT_TX_NORESET_TS2);
22682263 val |= 0x10 << HOT_TX_NORESET_TS2;
2269
- writel(val, &dev->ll_tsn_regs->ll_tsn_counters_2);
2264
+ writel(val, &dev->llregs->ll_tsn_counters_2);
22702265
2271
- val = readl(&dev->ll_tsn_regs->ll_tsn_counters_3);
2266
+ val = readl(&dev->llregs->ll_tsn_counters_3);
22722267 val &= ~(0x1f << HOT_RX_RESET_TS2);
22732268 val |= 0x3 << HOT_RX_RESET_TS2;
2274
- writel(val, &dev->ll_tsn_regs->ll_tsn_counters_3);
2269
+ writel(val, &dev->llregs->ll_tsn_counters_3);
2270
+
2271
+ /*
2272
+ * AB errata. Errata 11. Workaround for Default Duration of LFPS
2273
+ * Handshake Signaling for Device-Initiated U1 Exit is too short.
2274
+ * Without this, various enumeration failures observed with
2275
+ * modern superspeed hosts.
2276
+ */
2277
+ val = readl(&dev->llregs->ll_lfps_timers_2);
2278
+ writel((val & 0xffff0000) | LFPS_TIMERS_2_WORKAROUND_VALUE,
2279
+ &dev->llregs->ll_lfps_timers_2);
22752280
22762281 /*
22772282 * Set Recovery Idle to Recover bit:
....@@ -2281,9 +2286,9 @@
22812286 * - R-M-W to leave other bits undisturbed.
22822287 * - Reference PLX TT-7372
22832288 */
2284
- val = readl(&dev->ll_chicken_reg->ll_tsn_chicken_bit);
2289
+ val = readl(&dev->llregs->ll_tsn_chicken_bit);
22852290 val |= BIT(RECOVERY_IDLE_TO_RECOVER_FMW);
2286
- writel(val, &dev->ll_chicken_reg->ll_tsn_chicken_bit);
2291
+ writel(val, &dev->llregs->ll_tsn_chicken_bit);
22872292
22882293 INIT_LIST_HEAD(&dev->gadget.ep0->ep_list);
22892294
....@@ -2855,6 +2860,8 @@
28552860 static void handle_stat0_irqs_superspeed(struct net2280 *dev,
28562861 struct net2280_ep *ep, struct usb_ctrlrequest r)
28572862 {
2863
+ struct net2280_ep *e;
2864
+ u16 status;
28582865 int tmp = 0;
28592866
28602867 #define w_value le16_to_cpu(r.wValue)
....@@ -2862,9 +2869,6 @@
28622869 #define w_length le16_to_cpu(r.wLength)
28632870
28642871 switch (r.bRequest) {
2865
- struct net2280_ep *e;
2866
- u16 status;
2867
-
28682872 case USB_REQ_SET_CONFIGURATION:
28692873 dev->addressed_state = !w_value;
28702874 goto usb3_delegate;
....@@ -3556,7 +3560,7 @@
35563560
35573561 static void gadget_release(struct device *_dev)
35583562 {
3559
- struct net2280 *dev = dev_get_drvdata(_dev);
3563
+ struct net2280 *dev = container_of(_dev, struct net2280, gadget.dev);
35603564
35613565 kfree(dev);
35623566 }
....@@ -3567,7 +3571,8 @@
35673571 {
35683572 struct net2280 *dev = pci_get_drvdata(pdev);
35693573
3570
- usb_del_gadget_udc(&dev->gadget);
3574
+ if (dev->added)
3575
+ usb_del_gadget(&dev->gadget);
35713576
35723577 BUG_ON(dev->driver);
35733578
....@@ -3598,6 +3603,7 @@
35983603 device_remove_file(&pdev->dev, &dev_attr_registers);
35993604
36003605 ep_info(dev, "unbind\n");
3606
+ usb_put_gadget(&dev->gadget);
36013607 }
36023608
36033609 /* wrap this driver around the specified device, but
....@@ -3619,6 +3625,7 @@
36193625 }
36203626
36213627 pci_set_drvdata(pdev, dev);
3628
+ usb_initialize_gadget(&pdev->dev, &dev->gadget, gadget_release);
36223629 spin_lock_init(&dev->lock);
36233630 dev->quirks = id->driver_data;
36243631 dev->pdev = pdev;
....@@ -3653,7 +3660,7 @@
36533660 * 8051 code into the chip, e.g. to turn on PCI PM.
36543661 */
36553662
3656
- base = ioremap_nocache(resource, len);
3663
+ base = ioremap(resource, len);
36573664 if (base == NULL) {
36583665 ep_dbg(dev, "can't map memory\n");
36593666 retval = -EFAULT;
....@@ -3673,12 +3680,6 @@
36733680 (base + 0x00b4);
36743681 dev->llregs = (struct usb338x_ll_regs __iomem *)
36753682 (base + 0x0700);
3676
- dev->ll_lfps_regs = (struct usb338x_ll_lfps_regs __iomem *)
3677
- (base + 0x0748);
3678
- dev->ll_tsn_regs = (struct usb338x_ll_tsn_regs __iomem *)
3679
- (base + 0x077c);
3680
- dev->ll_chicken_reg = (struct usb338x_ll_chi_regs __iomem *)
3681
- (base + 0x079c);
36823683 dev->plregs = (struct usb338x_pl_regs __iomem *)
36833684 (base + 0x0800);
36843685 usbstat = readl(&dev->usb->usbstat);
....@@ -3775,10 +3776,10 @@
37753776 if (retval)
37763777 goto done;
37773778
3778
- retval = usb_add_gadget_udc_release(&pdev->dev, &dev->gadget,
3779
- gadget_release);
3779
+ retval = usb_add_gadget(&dev->gadget);
37803780 if (retval)
37813781 goto done;
3782
+ dev->added = 1;
37823783 return 0;
37833784
37843785 done:
....@@ -3859,7 +3860,7 @@
38593860
38603861 /* pci driver glue; this is a "new style" PCI driver module */
38613862 static struct pci_driver net2280_pci_driver = {
3862
- .name = (char *) driver_name,
3863
+ .name = driver_name,
38633864 .id_table = pci_ids,
38643865
38653866 .probe = net2280_probe,