]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
USB: wusbcore: add HWA-specific fields to usb_rpipe_descriptor
authorThomas Pugliese <thomas.pugliese@gmail.com>
Thu, 6 Jun 2013 19:06:01 +0000 (14:06 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Jun 2013 19:14:39 +0000 (12:14 -0700)
This patch adds the HWA specific members to struct usb_rpipe_descriptor
and sets them correctly based on the wireless endpoint compananion
descriptor.

Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/wa-rpipe.c
include/linux/usb/wusb-wa.h

index f0d546c5a089d3513f037b2eb4c63c841fff8cb5..9429c12e4bfd78dc4563ad90574b3957a60a1d5a 100644 (file)
@@ -251,8 +251,8 @@ static int __rpipe_reset(struct wahc *wa, unsigned index)
 static struct usb_wireless_ep_comp_descriptor epc0 = {
        .bLength = sizeof(epc0),
        .bDescriptorType = USB_DT_WIRELESS_ENDPOINT_COMP,
-/*     .bMaxBurst = 1, */
-       .bMaxSequence = 31,
+       .bMaxBurst = 1,
+       .bMaxSequence = 2,
 };
 
 /*
@@ -317,6 +317,7 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa,
        struct device *dev = &wa->usb_iface->dev;
        struct usb_device *usb_dev = urb->dev;
        struct usb_wireless_ep_comp_descriptor *epcd;
+       u32 ack_window, epcd_max_sequence;
        u8 unauth;
 
        epcd = rpipe_epc_find(dev, ep);
@@ -333,8 +334,11 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa,
        rpipe->descr.wBlocks = cpu_to_le16(16);         /* given */
        /* ep0 maxpktsize is 0x200 (WUSB1.0[4.8.1]) */
        rpipe->descr.wMaxPacketSize = cpu_to_le16(ep->desc.wMaxPacketSize);
-       rpipe->descr.bHSHubAddress = 0;                 /* reserved: zero */
-       rpipe->descr.bHSHubPort = wusb_port_no_to_idx(urb->dev->portnum);
+
+       rpipe->descr.hwa_bMaxBurst = max(min_t(unsigned int,
+                               epcd->bMaxBurst, 16U), 1U);
+       rpipe->descr.hwa_bDeviceInfoIndex =
+                       wusb_port_no_to_idx(urb->dev->portnum);
        /* FIXME: use maximum speed as supported or recommended by device */
        rpipe->descr.bSpeed = usb_pipeendpoint(urb->pipe) == 0 ?
                UWB_PHY_RATE_53 : UWB_PHY_RATE_200;
@@ -344,23 +348,24 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa,
                le16_to_cpu(rpipe->descr.wRPipeIndex),
                usb_pipeendpoint(urb->pipe), rpipe->descr.bSpeed);
 
-       /* see security.c:wusb_update_address() */
-       if (unlikely(urb->dev->devnum == 0x80))
-               rpipe->descr.bDeviceAddress = 0;
-       else
-               rpipe->descr.bDeviceAddress = urb->dev->devnum | unauth;
+       rpipe->descr.hwa_reserved = 0;
+
        rpipe->descr.bEndpointAddress = ep->desc.bEndpointAddress;
        /* FIXME: bDataSequence */
        rpipe->descr.bDataSequence = 0;
-       /* FIXME: dwCurrentWindow */
-       rpipe->descr.dwCurrentWindow = cpu_to_le32(1);
-       /* FIXME: bMaxDataSequence */
-       rpipe->descr.bMaxDataSequence = epcd->bMaxSequence - 1;
+
+       /* start with base window of hwa_bMaxBurst bits starting at 0. */
+       ack_window = 0xFFFFFFFF >> (32 - rpipe->descr.hwa_bMaxBurst);
+       rpipe->descr.dwCurrentWindow = cpu_to_le32(ack_window);
+       epcd_max_sequence = max(min_t(unsigned int,
+                       epcd->bMaxSequence, 32U), 2U);
+       rpipe->descr.bMaxDataSequence = epcd_max_sequence - 1;
        rpipe->descr.bInterval = ep->desc.bInterval;
        /* FIXME: bOverTheAirInterval */
        rpipe->descr.bOverTheAirInterval = 0;   /* 0 if not isoc */
        /* FIXME: xmit power & preamble blah blah */
-       rpipe->descr.bmAttribute = ep->desc.bmAttributes & 0x03;
+       rpipe->descr.bmAttribute = (ep->desc.bmAttributes &
+                                       USB_ENDPOINT_XFERTYPE_MASK);
        /* rpipe->descr.bmCharacteristics RO */
        /* FIXME: bmRetryOptions */
        rpipe->descr.bmRetryOptions = 15;
@@ -387,10 +392,8 @@ static int rpipe_check_aim(const struct wa_rpipe *rpipe, const struct wahc *wa,
                           const struct usb_host_endpoint *ep,
                           const struct urb *urb, gfp_t gfp)
 {
-       int result = 0;         /* better code for lack of companion? */
+       int result = 0;
        struct device *dev = &wa->usb_iface->dev;
-       struct usb_device *usb_dev = urb->dev;
-       u8 unauth = (usb_dev->wusb && !usb_dev->authenticated) ? 0x80 : 0;
        u8 portnum = wusb_port_no_to_idx(urb->dev->portnum);
 
 #define AIM_CHECK(rdf, val, text)                                      \
@@ -403,13 +406,10 @@ static int rpipe_check_aim(const struct wa_rpipe *rpipe, const struct wahc *wa,
                        WARN_ON(1);                                     \
                }                                                       \
        } while (0)
-       AIM_CHECK(wMaxPacketSize, cpu_to_le16(ep->desc.wMaxPacketSize),
-                 "(%u vs %u)");
-       AIM_CHECK(bHSHubPort, portnum, "(%u vs %u)");
+       AIM_CHECK(hwa_bDeviceInfoIndex, portnum, "(%u vs %u)");
        AIM_CHECK(bSpeed, usb_pipeendpoint(urb->pipe) == 0 ?
                        UWB_PHY_RATE_53 : UWB_PHY_RATE_200,
                  "(%u vs %u)");
-       AIM_CHECK(bDeviceAddress, urb->dev->devnum | unauth, "(%u vs %u)");
        AIM_CHECK(bEndpointAddress, ep->desc.bEndpointAddress, "(%u vs %u)");
        AIM_CHECK(bInterval, ep->desc.bInterval, "(%u vs %u)");
        AIM_CHECK(bmAttribute, ep->desc.bmAttributes & 0x03, "(%u vs %u)");
index f9dec37f617bf8c1f4af017e9ac1f55459e23c36..6be985b2a4342fc7ebabc1df2245cb3460aa71cb 100644 (file)
@@ -92,11 +92,20 @@ struct usb_rpipe_descriptor {
        __le16  wRPipeIndex;
        __le16  wRequests;
        __le16  wBlocks;                /* rw if 0 */
-       __le16  wMaxPacketSize;         /* rw? */
-       u8      bHSHubAddress;          /* reserved: 0 */
-       u8      bHSHubPort;             /* ??? FIXME ??? */
+       __le16  wMaxPacketSize;         /* rw */
+       union {
+               u8      dwa_bHSHubAddress;              /* rw: DWA. */
+               u8      hwa_bMaxBurst;                  /* rw: HWA. */
+       };
+       union {
+               u8      dwa_bHSHubPort;         /*  rw: DWA. */
+               u8      hwa_bDeviceInfoIndex;   /*  rw: HWA. */
+       };
        u8      bSpeed;                 /* rw: xfer rate 'enum uwb_phy_rate' */
-       u8      bDeviceAddress;         /* rw: Target device address */
+       union {
+               u8 dwa_bDeviceAddress;  /* rw: DWA Target device address. */
+               u8 hwa_reserved;                /* rw: HWA. */
+       };
        u8      bEndpointAddress;       /* rw: Target EP address */
        u8      bDataSequence;          /* ro: Current Data sequence */
        __le32  dwCurrentWindow;        /* ro */