> +static struct sk_buff *aqc111_tx_fixup(struct usbnet *dev, struct sk_buff 
> *skb,
> +                                    gfp_t flags)
> +{
> +     struct aq_tx_packet_desc tx_hdr;
> +     int frame_size = dev->maxpacket;
> +     int headroom = 0;
> +     int tailroom = 0;
> +     int padding_size = 0;
> +     struct sk_buff *new_skb = NULL;
> +
> +     memset(&tx_hdr, 0x00, sizeof(tx_hdr));
> +
> +     /*Length of actual data*/
> +     tx_hdr.length = (skb->len & 0x1FFFFF);
> +
> +     headroom = (skb->len + AQ_TX_HEADER_SIZE) % 8;
> +     if (headroom != 0)
> +             padding_size = 8 - headroom;
> +
> +     if (((skb->len + AQ_TX_HEADER_SIZE + padding_size) % frame_size) == 0) {
> +             padding_size += 8;
> +             tx_hdr.drop_padding = 1;
> +     }
> +
> +     if (!dev->can_dma_sg && (dev->net->features & NETIF_F_SG) &&
> +         skb_linearize(skb))
> +             return NULL;
> +
> +     headroom = skb_headroom(skb);
> +     tailroom = skb_tailroom(skb);
> +
> +     if (!(headroom >= AQ_TX_HEADER_SIZE && tailroom >= padding_size)) {
> +             new_skb = skb_copy_expand(skb, AQ_TX_HEADER_SIZE,
> +                                       padding_size, flags);
> +             dev_kfree_skb_any(skb);
> +             skb = new_skb;
> +             if (!skb)
> +                     return NULL;
> +     }
> +     if (padding_size != 0)
> +             skb_put(skb, padding_size);
> +     /* Copy TX header */
> +     skb_push(skb, AQ_TX_HEADER_SIZE);
> +     cpu_to_le64s(&tx_hdr);

Is that portable? tx_hdr is a structure of 2x u32 bitfields.  What
endian have you tested that one?

> +     skb_copy_to_linear_data(skb, &tx_hdr, 8);
> +
> +     usbnet_set_skb_tx_stats(skb, 1, 0);
> +
> +     return skb;
> +}

> +struct aq_tx_packet_desc {
> +     struct {
> +             u32 length:21;
> +             u32 checksum:7;
> +             u32 drop_padding:1;
> +             u32 vlan_tag:1;
> +             u32 cphi:1;
> +             u32 dicf:1;
> +     };
> +     struct {
> +             u32 max_seg_size:15;
> +             u32 reserved:1;
> +             u32 vlan_info:16;
> +     };
> +};

  Andrew

Reply via email to