Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
[safe/jmp/linux-2.6] / drivers / net / b44.c
index 0e7470a..c38512e 100644 (file)
@@ -73,8 +73,8 @@
          (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP))
 #define NEXT_TX(N)             (((N) + 1) & (B44_TX_RING_SIZE - 1))
 
-#define RX_PKT_OFFSET          30
-#define RX_PKT_BUF_SZ          (1536 + RX_PKT_OFFSET + 64)
+#define RX_PKT_OFFSET          (RX_HEADER_LEN + 2)
+#define RX_PKT_BUF_SZ          (1536 + RX_PKT_OFFSET)
 
 /* minimum number of free TX descriptors required to wake up TX process */
 #define B44_TX_WAKEUP_THRESH           (B44_TX_RING_SIZE / 4)
@@ -679,10 +679,10 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
                        dev_kfree_skb_any(skb);
                        return -ENOMEM;
                }
+               bp->force_copybreak = 1;
        }
 
        rh = (struct rx_header *) skb->data;
-       skb_reserve(skb, RX_PKT_OFFSET);
 
        rh->len = 0;
        rh->flags = 0;
@@ -693,13 +693,13 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
        if (src_map != NULL)
                src_map->skb = NULL;
 
-       ctrl  = (DESC_CTRL_LEN & (RX_PKT_BUF_SZ - RX_PKT_OFFSET));
+       ctrl = (DESC_CTRL_LEN & RX_PKT_BUF_SZ);
        if (dest_idx == (B44_RX_RING_SIZE - 1))
                ctrl |= DESC_CTRL_EOT;
 
        dp = &bp->rx_ring[dest_idx];
        dp->ctrl = cpu_to_le32(ctrl);
-       dp->addr = cpu_to_le32((u32) mapping + RX_PKT_OFFSET + bp->dma_offset);
+       dp->addr = cpu_to_le32((u32) mapping + bp->dma_offset);
 
        if (bp->flags & B44_FLAG_RX_RING_HACK)
                b44_sync_dma_desc_for_device(bp->sdev, bp->rx_ring_dma,
@@ -801,7 +801,7 @@ static int b44_rx(struct b44 *bp, int budget)
                /* Omit CRC. */
                len -= 4;
 
-               if (len > RX_COPY_THRESHOLD) {
+               if (!bp->force_copybreak && len > RX_COPY_THRESHOLD) {
                        int skb_size;
                        skb_size = b44_alloc_rx_skb(bp, cons, bp->rx_prod);
                        if (skb_size < 0)
@@ -809,8 +809,8 @@ static int b44_rx(struct b44 *bp, int budget)
                        ssb_dma_unmap_single(bp->sdev, map,
                                             skb_size, DMA_FROM_DEVICE);
                        /* Leave out rx_header */
-                       skb_put(skb, len + RX_PKT_OFFSET);
-                       skb_pull(skb, RX_PKT_OFFSET);
+                       skb_put(skb, len + RX_PKT_OFFSET);
+                       skb_pull(skb, RX_PKT_OFFSET);
                } else {
                        struct sk_buff *copy_skb;
 
@@ -2108,6 +2108,22 @@ static int __devinit b44_get_invariants(struct b44 *bp)
        return err;
 }
 
+static const struct net_device_ops b44_netdev_ops = {
+       .ndo_open               = b44_open,
+       .ndo_stop               = b44_close,
+       .ndo_start_xmit         = b44_start_xmit,
+       .ndo_get_stats          = b44_get_stats,
+       .ndo_set_multicast_list = b44_set_rx_mode,
+       .ndo_set_mac_address    = b44_set_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+       .ndo_do_ioctl           = b44_ioctl,
+       .ndo_tx_timeout         = b44_tx_timeout,
+       .ndo_change_mtu         = b44_change_mtu,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+       .ndo_poll_controller    = b44_poll_controller,
+#endif
+};
+
 static int __devinit b44_init_one(struct ssb_device *sdev,
                                  const struct ssb_device_id *ent)
 {
@@ -2137,6 +2153,7 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
        bp = netdev_priv(dev);
        bp->sdev = sdev;
        bp->dev = dev;
+       bp->force_copybreak = 0;
 
        bp->msg_enable = netif_msg_init(b44_debug, B44_DEF_MSG_ENABLE);
 
@@ -2145,20 +2162,9 @@ static int __devinit b44_init_one(struct ssb_device *sdev,
        bp->rx_pending = B44_DEF_RX_RING_PENDING;
        bp->tx_pending = B44_DEF_TX_RING_PENDING;
 
-       dev->open = b44_open;
-       dev->stop = b44_close;
-       dev->hard_start_xmit = b44_start_xmit;
-       dev->get_stats = b44_get_stats;
-       dev->set_multicast_list = b44_set_rx_mode;
-       dev->set_mac_address = b44_set_mac_addr;
-       dev->do_ioctl = b44_ioctl;
-       dev->tx_timeout = b44_tx_timeout;
+       dev->netdev_ops = &b44_netdev_ops;
        netif_napi_add(dev, &bp->napi, b44_poll, 64);
        dev->watchdog_timeo = B44_TX_TIMEOUT;
-#ifdef CONFIG_NET_POLL_CONTROLLER
-       dev->poll_controller = b44_poll_controller;
-#endif
-       dev->change_mtu = b44_change_mtu;
        dev->irq = sdev->irq;
        SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);