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 <thomas.pugliese@xxxxxxxxx> > > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html