Re:

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 23, 2011 at 7:13 PM, Sebastian Andrzej Siewior
<bigeasy@xxxxxxxxxxxxx> wrote:
>
> Bcc:
> Subject: Re: [RFC][PATCH] usb: use usb_endpoint_maxp() instead of
>  le16_to_cpu()
> Reply-To:
> In-Reply-To: <87mxf0mo7s.wl%kuninori.morimoto.gx@xxxxxxxxxxx>
> X-Key-Id: 97C4700B
> X-Key-Fingerprint: 09E2 D1F3 9A3A FF13 C3D3  961C 0688 1C1E 97C4 700B
>
> [cut some people from cc ]
>
> * Kuninori Morimoto | 2011-08-23 03:12:03 [-0700]:
>
> >index 0149c09..d956965 100644
> >--- a/drivers/usb/core/devices.c
> >+++ b/drivers/usb/core/devices.c
> >@@ -190,7 +190,7 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,
> >       dir = usb_endpoint_dir_in(desc) ? 'I' : 'O';
> >
> >       if (speed == USB_SPEED_HIGH) {
> >-              switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) {
> >+              switch (usb_endpoint_maxp(desc) & (0x03 << 11)) {
> >               case 1 << 11:
> >                       bandwidth = 2; break;
> >               case 2 << 11:
> >@@ -240,7 +240,7 @@ static char *usb_dump_endpoint_descriptor(int speed, char *start, char *end,
> >
> >       start += sprintf(start, format_endpt, desc->bEndpointAddress, dir,
> >                        desc->bmAttributes, type,
> >-                       (le16_to_cpu(desc->wMaxPacketSize) & 0x07ff) *
> >+                       (usb_endpoint_maxp(desc) & 0x07ff) *
> >                        bandwidth,
> >                        interval, unit);
> >       return start;
> >diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c
> >index ab98ea9..6fef1c0 100644
> >--- a/drivers/usb/gadget/net2272.c
> >+++ b/drivers/usb/gadget/net2272.c
> >@@ -204,7 +204,7 @@ net2272_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
> >       if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
> >               return -ESHUTDOWN;
> >
> >-      max = le16_to_cpu(desc->wMaxPacketSize) & 0x1fff;
> >+      max = usb_endpoint_maxp(desc) & 0x1fff;
> >
> >       spin_lock_irqsave(&dev->lock, flags);
> >       _ep->maxpacket = max & 0x7fff;
> >diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
> >index d446886..d873a03 100644
> >--- a/drivers/usb/host/xhci-mem.c
> >+++ b/drivers/usb/host/xhci-mem.c
> >@@ -1141,8 +1141,8 @@ static u32 xhci_get_max_esit_payload(struct xhci_hcd *xhci,
> >       if (udev->speed == USB_SPEED_SUPER)
> >               return le16_to_cpu(ep->ss_ep_comp.wBytesPerInterval);
> >
> >-      max_packet = GET_MAX_PACKET(le16_to_cpu(ep->desc.wMaxPacketSize));
> >-      max_burst = (le16_to_cpu(ep->desc.wMaxPacketSize) & 0x1800) >> 11;
> >+      max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc));
> >+      max_burst = (usb_endpoint_maxp(&ep->desc) & 0x1800) >> 11;
> >       /* A 0 in max burst means 1 transfer per ESIT */
> >       return max_packet * (max_burst + 1);
> > }
>
> We have three masks here which are common:
> - 0x07ff: only max packet size
> - 0x1fff: max packet size + additional microframes
> - 0x1800: only the additional microframes
>
> I don't know if net2272 really meant to get both fields or only one.
> From the context I see that it tried to set ->maxpacket to the maxpacket
> but it got one f too much.
> From looking at the xhci code it seems to make sense to include that
> GET_MAX_PACKET() macro into usb_endpoint_maxp() and add another inline
> function for the "0x1800 >> 11" magic. So the switch case would not
> require that "1 << 11".
> Any comments?
>

The GET_MAX_PACKET() in xhci is introduced to fix a bug (originally masked with
0x03ff, not 0x07ff). I suggest introducing two macros to deal with
these 0x07ff and
0x1800 >> 11 things in usb subsystem so many drivers can benefit: usbcore, ehci
all use mask 0x07ff directly.

Thanks,
Andiry
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux