]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/orinoco.c
airo: Off-by-one channel fix
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / orinoco.c
index da4c5e94a959ef6126fe82fe307ad39e71f949d3..6fd0bf736830f4c7a0694005d32b50613f05818b 100644 (file)
@@ -490,13 +490,12 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
                return 0;
        }
 
-       /* Check packet length, pad short packets, round up odd length */
+       /* Length of the packet body */
+       /* FIXME: what if the skb is smaller than this? */
        len = max_t(int, ALIGN(skb->len, 2), ETH_ZLEN);
-       if (skb->len < len) {
-               skb = skb_padto(skb, len);
-               if (skb == NULL)
-                       goto fail;
-       }
+       skb = skb_padto(skb, len);
+       if (skb == NULL)
+               goto fail;
        len -= ETH_HLEN;
 
        eh = (struct ethhdr *)skb->data;
@@ -543,13 +542,21 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
                        stats->tx_errors++;
                        goto fail;
                }
+               /* Actual xfer length - allow for padding */
+               len = ALIGN(data_len, 2);
+               if (len < ETH_ZLEN - ETH_HLEN)
+                       len = ETH_ZLEN - ETH_HLEN;
        } else { /* IEEE 802.3 frame */
                data_len = len + ETH_HLEN;
                data_off = HERMES_802_3_OFFSET;
                p = skb->data;
+               /* Actual xfer length - round up for odd length packets */
+               len = ALIGN(data_len, 2);
+               if (len < ETH_ZLEN)
+                       len = ETH_ZLEN;
        }
 
-       err = hermes_bap_pwrite(hw, USER_BAP, p, data_len,
+       err = hermes_bap_pwrite_pad(hw, USER_BAP, p, data_len, len,
                                txfid, data_off);
        if (err) {
                printk(KERN_ERR "%s: Error %d writing packet to BAP\n",
@@ -565,8 +572,9 @@ static int orinoco_xmit(struct sk_buff *skb, struct net_device *dev)
                                txfid, NULL);
        if (err) {
                netif_start_queue(dev);
-               printk(KERN_ERR "%s: Error %d transmitting packet\n",
-                      dev->name, err);
+               if (net_ratelimit())
+                       printk(KERN_ERR "%s: Error %d transmitting packet\n",
+                               dev->name, err);
                stats->tx_errors++;
                goto fail;
        }
@@ -3504,9 +3512,8 @@ static int orinoco_ioctl_setpower(struct net_device *dev,
                        break;
                default:
                        err = -EINVAL;
-               }
-               if (err)
                        goto out;
+               }
                
                if (prq->flags & IW_POWER_TIMEOUT) {
                        priv->pm_on = 1;