Commit aa95abefccc25efea5c8654bc3475e8161319b94

Authored by Alan Cox
Committed by Jeff Garzik
1 parent c7985051de

[PATCH] skb_padto()-area fixes in 8390, wavelan

Ar Iau, 2006-06-22 am 21:29 +1000, ysgrifennodd Herbert Xu:
> Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> >
> > The 8390 change (corrected version) also makes 8390.c faster so should
> > be applied anyway, and the orinoco one fixes some code that isn't even
> > needed and someone forgot to remove long ago. Otherwise the skb_padto
>
> Yeah I agree totally.  However, I haven't actually seen the fixed 8390
> version being posted yet or at least not to netdev :)

Ah the resounding clang of a subtle hint ;)

Signed-off-by: Alan Cox <alan@redhat.com>

- Return 8390.c to the old way of handling short packets (which is also
faster)

- Remove the skb_padto from orinoco. This got left in when the padding bad
write patch was added and is actually not needed. This is fixing a merge
error way back when.

- Wavelan can also use the stack based buffer trick if you want
Signed-off-by: Jeff Garzik <jeff@garzik.org>

Showing 2 changed files with 14 additions and 10 deletions Side-by-side Diff

... ... @@ -275,12 +275,14 @@
275 275 struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
276 276 int send_length = skb->len, output_page;
277 277 unsigned long flags;
  278 + char buf[ETH_ZLEN];
  279 + char *data = skb->data;
278 280  
279 281 if (skb->len < ETH_ZLEN) {
280   - skb = skb_padto(skb, ETH_ZLEN);
281   - if (skb == NULL)
282   - return 0;
  282 + memset(buf, 0, ETH_ZLEN); /* more efficient than doing just the needed bits */
  283 + memcpy(buf, data, skb->len);
283 284 send_length = ETH_ZLEN;
  285 + data = buf;
284 286 }
285 287  
286 288 /* Mask interrupts from the ethercard.
... ... @@ -347,7 +349,7 @@
347 349 * trigger the send later, upon receiving a Tx done interrupt.
348 350 */
349 351  
350   - ei_block_output(dev, send_length, skb->data, output_page);
  352 + ei_block_output(dev, send_length, data, output_page);
351 353  
352 354 if (! ei_local->txing)
353 355 {
drivers/net/wireless/wavelan.c
... ... @@ -2903,6 +2903,7 @@
2903 2903 {
2904 2904 net_local *lp = (net_local *) dev->priv;
2905 2905 unsigned long flags;
  2906 + char data[ETH_ZLEN];
2906 2907  
2907 2908 #ifdef DEBUG_TX_TRACE
2908 2909 printk(KERN_DEBUG "%s: ->wavelan_packet_xmit(0x%X)\n", dev->name,
2909 2910  
2910 2911  
... ... @@ -2937,14 +2938,15 @@
2937 2938 * able to detect collisions, therefore in theory we don't really
2938 2939 * need to pad. Jean II */
2939 2940 if (skb->len < ETH_ZLEN) {
2940   - skb = skb_padto(skb, ETH_ZLEN);
2941   - if (skb == NULL)
2942   - return 0;
  2941 + memset(data, 0, ETH_ZLEN);
  2942 + memcpy(data, skb->data, skb->len);
  2943 + /* Write packet on the card */
  2944 + if(wv_packet_write(dev, data, ETH_ZLEN))
  2945 + return 1; /* We failed */
2943 2946 }
2944   -
2945   - /* Write packet on the card */
2946   - if(wv_packet_write(dev, skb->data, skb->len))
  2947 + else if(wv_packet_write(dev, skb->data, skb->len))
2947 2948 return 1; /* We failed */
  2949 +
2948 2950  
2949 2951 dev_kfree_skb(skb);
2950 2952