Commit aa95abefccc25efea5c8654bc3475e8161319b94
Committed by
Jeff Garzik
1 parent
c7985051de
Exists in
master
and in
7 other branches
[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
drivers/net/8390.c
... | ... | @@ -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 |