]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/r6040.c
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[net-next-2.6.git] / drivers / net / r6040.c
index 0a00850da79d67c59bf592588242b4b85f9320da..0b014c894686b06921d4fa4fa31321fdb0d1412e 100644 (file)
@@ -745,6 +745,9 @@ static void r6040_mac_address(struct net_device *dev)
        iowrite16(adrp[0], ioaddr + MID_0L);
        iowrite16(adrp[1], ioaddr + MID_0M);
        iowrite16(adrp[2], ioaddr + MID_0H);
+
+       /* Store MAC Address in perm_addr */
+       memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN);
 }
 
 static int r6040_open(struct net_device *dev)
@@ -756,7 +759,7 @@ static int r6040_open(struct net_device *dev)
        ret = request_irq(dev->irq, r6040_interrupt,
                IRQF_SHARED, dev->name, dev);
        if (ret)
-               return ret;
+               goto out;
 
        /* Set MAC address */
        r6040_mac_address(dev);
@@ -764,30 +767,37 @@ static int r6040_open(struct net_device *dev)
        /* Allocate Descriptor memory */
        lp->rx_ring =
                pci_alloc_consistent(lp->pdev, RX_DESC_SIZE, &lp->rx_ring_dma);
-       if (!lp->rx_ring)
-               return -ENOMEM;
+       if (!lp->rx_ring) {
+               ret = -ENOMEM;
+               goto err_free_irq;
+       }
 
        lp->tx_ring =
                pci_alloc_consistent(lp->pdev, TX_DESC_SIZE, &lp->tx_ring_dma);
        if (!lp->tx_ring) {
-               pci_free_consistent(lp->pdev, RX_DESC_SIZE, lp->rx_ring,
-                                    lp->rx_ring_dma);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto err_free_rx_ring;
        }
 
        ret = r6040_up(dev);
-       if (ret) {
-               pci_free_consistent(lp->pdev, TX_DESC_SIZE, lp->tx_ring,
-                                                       lp->tx_ring_dma);
-               pci_free_consistent(lp->pdev, RX_DESC_SIZE, lp->rx_ring,
-                                                       lp->rx_ring_dma);
-               return ret;
-       }
+       if (ret)
+               goto err_free_tx_ring;
 
        napi_enable(&lp->napi);
        netif_start_queue(dev);
 
        return 0;
+
+err_free_tx_ring:
+       pci_free_consistent(lp->pdev, TX_DESC_SIZE, lp->tx_ring,
+                       lp->tx_ring_dma);
+err_free_rx_ring:
+       pci_free_consistent(lp->pdev, RX_DESC_SIZE, lp->rx_ring,
+                       lp->rx_ring_dma);
+err_free_irq:
+       free_irq(dev->irq, dev);
+out:
+       return ret;
 }
 
 static netdev_tx_t r6040_start_xmit(struct sk_buff *skb,
@@ -898,16 +908,18 @@ static void r6040_multicast_list(struct net_device *dev)
        /* Multicast Address 1~4 case */
        i = 0;
        netdev_for_each_mc_addr(ha, dev) {
-               if (i < MCAST_MAX) {
-                       adrp = (u16 *) ha->addr;
-                       iowrite16(adrp[0], ioaddr + MID_1L + 8 * i);
-                       iowrite16(adrp[1], ioaddr + MID_1M + 8 * i);
-                       iowrite16(adrp[2], ioaddr + MID_1H + 8 * i);
-               } else {
-                       iowrite16(0xffff, ioaddr + MID_1L + 8 * i);
-                       iowrite16(0xffff, ioaddr + MID_1M + 8 * i);
-                       iowrite16(0xffff, ioaddr + MID_1H + 8 * i);
-               }
+               if (i >= MCAST_MAX)
+                       break;
+               adrp = (u16 *) ha->addr;
+               iowrite16(adrp[0], ioaddr + MID_1L + 8 * i);
+               iowrite16(adrp[1], ioaddr + MID_1M + 8 * i);
+               iowrite16(adrp[2], ioaddr + MID_1H + 8 * i);
+               i++;
+       }
+       while (i < MCAST_MAX) {
+               iowrite16(0xffff, ioaddr + MID_1L + 8 * i);
+               iowrite16(0xffff, ioaddr + MID_1M + 8 * i);
+               iowrite16(0xffff, ioaddr + MID_1H + 8 * i);
                i++;
        }
 }