[rt2x00-users] [PATCH] rt2800usb: Let rt2x00usb handle USB padding

Jakub Kiciński kubakici at wp.pl
Thu Dec 22 20:48:55 EST 2011


Hi,

On Thu, 22 Dec 2011 09:44:39 +0100
Helmut Schaa <helmut.schaa at googlemail.com> wrote:
> Hi,
> 
> 2011/12/21 Jakub Kiciński <kubakici at wp.pl>:
> > Older USB drivers does not append end padding to skb but instead report
> > it in size of data to be transmitted to HW. rt2800usb should follow that
> > behaviour. Custom write_tx_data callback which was adding pad to skb
> > is not be needed any more.
> >
> > Thanks to this patch frames handed back from rt2800usb to mac80211 will
> > no longer contain end padding.
> >
> >
> > Signed-off-by: Jakub Kicinski <kubakici at wp.pl>
> > ---
> >  drivers/net/wireless/rt2x00/rt2800usb.c |   37 ++++++++----------------------
> >  1 files changed, 10 insertions(+), 27 deletions(-)
> >
> > diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> > index 3778763..3c4b88c 100644
> > --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> > +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> > @@ -400,10 +400,10 @@ static void rt2800usb_write_tx_desc(struct queue_entry *entry,
> >        /*
> >         * The size of TXINFO_W0_USB_DMA_TX_PKT_LEN is
> >         * TXWI + 802.11 header + L2 pad + payload + pad,
> > -        * so need to decrease size of TXINFO and USB end pad.
> > +        * so need to decrease size of TXINFO.
> >         */
> >        rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
> > -                          entry->skb->len - TXINFO_DESC_SIZE - 4);
> > +                          roundup(entry->skb->len, 4) - TXINFO_DESC_SIZE);
> >        rt2x00_set_field32(&word, TXINFO_W0_WIV,
> >                           !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
> >        rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
> > @@ -421,37 +421,20 @@ static void rt2800usb_write_tx_desc(struct queue_entry *entry,
> >        skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
> >  }
> >
> > -static void rt2800usb_write_tx_data(struct queue_entry *entry,
> > -                                       struct txentry_desc *txdesc)
> > +/*
> > + * TX data initialization
> > + */
> > +static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
> >  {
> > -       unsigned int len;
> > -       int err;
> > -
> > -       rt2800_write_tx_data(entry, txdesc);
> > -
> >        /*
> > -        * pad(1~3 bytes) is added after each 802.11 payload.
> > -        * USB end pad(4 bytes) is added at each USB bulk out packet end.
> > +        * pad(1~3 bytes) is needed after each 802.11 payload.
> > +        * USB end pad(4 bytes) is needed at each USB bulk out packet end.
> >         * TX frame format is :
> >         * | TXINFO | TXWI | 802.11 header | L2 pad | payload | pad | USB end pad |
> >         *                 |<------------- tx_pkt_len ------------->|
> >         */
> > -       len = roundup(entry->skb->len, 4) + 4;
> > -       err = skb_padto(entry->skb, len);
> > -       if (unlikely(err)) {
> > -               WARNING(entry->queue->rt2x00dev, "TX SKB padding error, out of memory\n");
> > -               return;
> > -       }
> >
> > -       entry->skb->len = len;
> > -}
> > -
> > -/*
> > - * TX data initialization
> > - */
> > -static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
> > -{
> > -       return entry->skb->len;
> > +       return roundup(entry->skb->len, 4) + 4;
> 
> So, you're returning a len that is bigger then the actual size of the skb?

Yes, that's what rt73usb and rt2500usb are doing. get_tx_data_len is
used only in rt2x00usb_kick_tx_entry to determine overall length of URB
to be submitted to HW. The name may be a little unfortunate, could be
something like get_tx_dma_len.

  -- Kuba



More information about the users mailing list