usb: host: fotg210: fix the endpoint's transactional opportunities calculation
authorKelly Devilliv <kelly.devilliv@gmail.com>
Sun, 27 Jun 2021 12:57:46 +0000 (20:57 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Jul 2021 08:03:42 +0000 (10:03 +0200)
Now that usb_endpoint_maxp() only returns the lowest
11 bits from wMaxPacketSize, we should make use of the
usb_endpoint_* helpers instead and remove the unnecessary
max_packet()/hb_mult() macro.

Signed-off-by: Kelly Devilliv <kelly.devilliv@gmail.com>
Link: https://lore.kernel.org/r/20210627125747.127646-3-kelly.devilliv@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/fotg210-hcd.c

index 7858e93..629b353 100644 (file)
@@ -2512,11 +2512,6 @@ retry_xacterr:
        return count;
 }
 
-/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
-#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
-/* ... and packet size, for any kind of endpoint descriptor */
-#define max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
-
 /* reverse of qh_urb_transaction:  free a list of TDs.
  * used for cleanup after errors, before HC sees an URB's TDs.
  */
@@ -2602,7 +2597,7 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,
                token |= (1 /* "in" */ << 8);
        /* else it's already initted to "out" pid (0 << 8) */
 
-       maxpacket = max_packet(usb_maxpacket(urb->dev, urb->pipe, !is_input));
+       maxpacket = usb_maxpacket(urb->dev, urb->pipe, !is_input);
 
        /*
         * buffer gets wrapped in one or more qtds;
@@ -2716,9 +2711,11 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
                gfp_t flags)
 {
        struct fotg210_qh *qh = fotg210_qh_alloc(fotg210, flags);
+       struct usb_host_endpoint *ep;
        u32 info1 = 0, info2 = 0;
        int is_input, type;
        int maxp = 0;
+       int mult;
        struct usb_tt *tt = urb->dev->tt;
        struct fotg210_qh_hw *hw;
 
@@ -2733,14 +2730,15 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
 
        is_input = usb_pipein(urb->pipe);
        type = usb_pipetype(urb->pipe);
-       maxp = usb_maxpacket(urb->dev, urb->pipe, !is_input);
+       ep = usb_pipe_endpoint(urb->dev, urb->pipe);
+       maxp = usb_endpoint_maxp(&ep->desc);
+       mult = usb_endpoint_maxp_mult(&ep->desc);
 
        /* 1024 byte maxpacket is a hardware ceiling.  High bandwidth
         * acts like up to 3KB, but is built from smaller packets.
         */
-       if (max_packet(maxp) > 1024) {
-               fotg210_dbg(fotg210, "bogus qh maxpacket %d\n",
-                               max_packet(maxp));
+       if (maxp > 1024) {
+               fotg210_dbg(fotg210, "bogus qh maxpacket %d\n", maxp);
                goto done;
        }
 
@@ -2754,8 +2752,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
         */
        if (type == PIPE_INTERRUPT) {
                qh->usecs = NS_TO_US(usb_calc_bus_time(USB_SPEED_HIGH,
-                               is_input, 0,
-                               hb_mult(maxp) * max_packet(maxp)));
+                               is_input, 0, mult * maxp));
                qh->start = NO_FRAME;
 
                if (urb->dev->speed == USB_SPEED_HIGH) {
@@ -2792,7 +2789,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
                        think_time = tt ? tt->think_time : 0;
                        qh->tt_usecs = NS_TO_US(think_time +
                                        usb_calc_bus_time(urb->dev->speed,
-                                       is_input, 0, max_packet(maxp)));
+                                       is_input, 0, maxp));
                        qh->period = urb->interval;
                        if (qh->period > fotg210->periodic_size) {
                                qh->period = fotg210->periodic_size;
@@ -2855,11 +2852,11 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,
                         * to help them do so.  So now people expect to use
                         * such nonconformant devices with Linux too; sigh.
                         */
-                       info1 |= max_packet(maxp) << 16;
+                       info1 |= maxp << 16;
                        info2 |= (FOTG210_TUNE_MULT_HS << 30);
                } else {                /* PIPE_INTERRUPT */
-                       info1 |= max_packet(maxp) << 16;
-                       info2 |= hb_mult(maxp) << 30;
+                       info1 |= maxp << 16;
+                       info2 |= mult << 30;
                }
                break;
        default:
@@ -3929,6 +3926,7 @@ static void iso_stream_init(struct fotg210_hcd *fotg210,
        int is_input;
        long bandwidth;
        unsigned multi;
+       struct usb_host_endpoint *ep;
 
        /*
         * this might be a "high bandwidth" highspeed endpoint,
@@ -3936,14 +3934,14 @@ static void iso_stream_init(struct fotg210_hcd *fotg210,
         */
        epnum = usb_pipeendpoint(pipe);
        is_input = usb_pipein(pipe) ? USB_DIR_IN : 0;
-       maxp = usb_maxpacket(dev, pipe, !is_input);
+       ep = usb_pipe_endpoint(dev, pipe);
+       maxp = usb_endpoint_maxp(&ep->desc);
        if (is_input)
                buf1 = (1 << 11);
        else
                buf1 = 0;
 
-       maxp = max_packet(maxp);
-       multi = hb_mult(maxp);
+       multi = usb_endpoint_maxp_mult(&ep->desc);
        buf1 |= maxp;
        maxp *= multi;