On Tue, 4 Jun 2013, Thomas Pugliese wrote:

> This patch adds the HWA-specific RPIPE fields to usb_rpipe_descriptor and 
> sets the appropriate values in usb/wusbcore/wa-rpipe.c:rpipe_aim.
> 
> Signed-off-by: Thomas Pugliese <[email protected]>
> 
> diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c
> index f0d546c..ed77ec7 100644
> --- a/drivers/usb/wusbcore/wa-rpipe.c
> +++ b/drivers/usb/wusbcore/wa-rpipe.c
> @@ -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;
>       u8 unauth;
>  
>       epcd = rpipe_epc_find(dev, ep);
> @@ -333,8 +334,18 @@ 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);
> +
> +     /* Set burst length based on endopint type.
> +      *      Use max allowed burst length for bulk and isoc. */
> +     if (usb_endpoint_xfer_int(&(ep->desc)) ||
> +              usb_endpoint_xfer_control(&(ep->desc))) {
> +             rpipe->descr.hwa_bMaxBurst = 1;
> +     } else {
> +             rpipe->descr.hwa_bMaxBurst = 16;
> +     }
> +
> +     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 +355,23 @@ 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);
> +
> +     ack_window = 0xFFFFFFFF >> (32 - rpipe->descr.hwa_bMaxBurst);
> +     ack_window <<= (rpipe->descr.bDataSequence);
> +     rpipe->descr.dwCurrentWindow = cpu_to_le32(ack_window);
>       /* FIXME: bMaxDataSequence */
>       rpipe->descr.bMaxDataSequence = epcd->bMaxSequence - 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 +398,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 +412,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)");
> diff --git a/include/linux/usb/wusb-wa.h b/include/linux/usb/wusb-wa.h
> index f9dec37..6be985b 100644
> --- a/include/linux/usb/wusb-wa.h
> +++ b/include/linux/usb/wusb-wa.h
> @@ -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 */
> 

Actually, the maxburst and maxsequence values should be assigned from the 
wireless endpoint companion descriptor.  I will send out a corrected patch 
shortly.

Tom
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to