diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/sunhme.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/sunhme.c')
-rw-r--r-- | drivers/net/sunhme.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index 37d721bbdb35..b17dbb11bd67 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
@@ -1226,10 +1226,16 @@ static void happy_meal_clean_rings(struct happy_meal *hp) | |||
1226 | for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { | 1226 | for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { |
1227 | txd = &hp->happy_block->happy_meal_txd[i]; | 1227 | txd = &hp->happy_block->happy_meal_txd[i]; |
1228 | dma_addr = hme_read_desc32(hp, &txd->tx_addr); | 1228 | dma_addr = hme_read_desc32(hp, &txd->tx_addr); |
1229 | dma_unmap_single(hp->dma_dev, dma_addr, | 1229 | if (!frag) |
1230 | (hme_read_desc32(hp, &txd->tx_flags) | 1230 | dma_unmap_single(hp->dma_dev, dma_addr, |
1231 | & TXFLAG_SIZE), | 1231 | (hme_read_desc32(hp, &txd->tx_flags) |
1232 | DMA_TO_DEVICE); | 1232 | & TXFLAG_SIZE), |
1233 | DMA_TO_DEVICE); | ||
1234 | else | ||
1235 | dma_unmap_page(hp->dma_dev, dma_addr, | ||
1236 | (hme_read_desc32(hp, &txd->tx_flags) | ||
1237 | & TXFLAG_SIZE), | ||
1238 | DMA_TO_DEVICE); | ||
1233 | 1239 | ||
1234 | if (frag != skb_shinfo(skb)->nr_frags) | 1240 | if (frag != skb_shinfo(skb)->nr_frags) |
1235 | i++; | 1241 | i++; |
@@ -1510,24 +1516,20 @@ static int happy_meal_init(struct happy_meal *hp) | |||
1510 | 1516 | ||
1511 | HMD(("htable, ")); | 1517 | HMD(("htable, ")); |
1512 | if ((hp->dev->flags & IFF_ALLMULTI) || | 1518 | if ((hp->dev->flags & IFF_ALLMULTI) || |
1513 | (hp->dev->mc_count > 64)) { | 1519 | (netdev_mc_count(hp->dev) > 64)) { |
1514 | hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff); | 1520 | hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff); |
1515 | hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff); | 1521 | hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff); |
1516 | hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff); | 1522 | hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff); |
1517 | hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff); | 1523 | hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff); |
1518 | } else if ((hp->dev->flags & IFF_PROMISC) == 0) { | 1524 | } else if ((hp->dev->flags & IFF_PROMISC) == 0) { |
1519 | u16 hash_table[4]; | 1525 | u16 hash_table[4]; |
1520 | struct dev_mc_list *dmi = hp->dev->mc_list; | 1526 | struct dev_mc_list *dmi; |
1521 | char *addrs; | 1527 | char *addrs; |
1522 | int i; | ||
1523 | u32 crc; | 1528 | u32 crc; |
1524 | 1529 | ||
1525 | for (i = 0; i < 4; i++) | 1530 | memset(hash_table, 0, sizeof(hash_table)); |
1526 | hash_table[i] = 0; | 1531 | netdev_for_each_mc_addr(dmi, hp->dev) { |
1527 | |||
1528 | for (i = 0; i < hp->dev->mc_count; i++) { | ||
1529 | addrs = dmi->dmi_addr; | 1532 | addrs = dmi->dmi_addr; |
1530 | dmi = dmi->next; | ||
1531 | 1533 | ||
1532 | if (!(*addrs & 1)) | 1534 | if (!(*addrs & 1)) |
1533 | continue; | 1535 | continue; |
@@ -1953,7 +1955,10 @@ static void happy_meal_tx(struct happy_meal *hp) | |||
1953 | dma_len = hme_read_desc32(hp, &this->tx_flags); | 1955 | dma_len = hme_read_desc32(hp, &this->tx_flags); |
1954 | 1956 | ||
1955 | dma_len &= TXFLAG_SIZE; | 1957 | dma_len &= TXFLAG_SIZE; |
1956 | dma_unmap_single(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | 1958 | if (!frag) |
1959 | dma_unmap_single(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | ||
1960 | else | ||
1961 | dma_unmap_page(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | ||
1957 | 1962 | ||
1958 | elem = NEXT_TX(elem); | 1963 | elem = NEXT_TX(elem); |
1959 | this = &txbase[elem]; | 1964 | this = &txbase[elem]; |
@@ -2184,7 +2189,7 @@ static int happy_meal_open(struct net_device *dev) | |||
2184 | * into a single source which we register handling at probe time. | 2189 | * into a single source which we register handling at probe time. |
2185 | */ | 2190 | */ |
2186 | if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { | 2191 | if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { |
2187 | if (request_irq(dev->irq, &happy_meal_interrupt, | 2192 | if (request_irq(dev->irq, happy_meal_interrupt, |
2188 | IRQF_SHARED, dev->name, (void *)dev)) { | 2193 | IRQF_SHARED, dev->name, (void *)dev)) { |
2189 | HMD(("EAGAIN\n")); | 2194 | HMD(("EAGAIN\n")); |
2190 | printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n", | 2195 | printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n", |
@@ -2357,14 +2362,13 @@ static void happy_meal_set_multicast(struct net_device *dev) | |||
2357 | { | 2362 | { |
2358 | struct happy_meal *hp = netdev_priv(dev); | 2363 | struct happy_meal *hp = netdev_priv(dev); |
2359 | void __iomem *bregs = hp->bigmacregs; | 2364 | void __iomem *bregs = hp->bigmacregs; |
2360 | struct dev_mc_list *dmi = dev->mc_list; | 2365 | struct dev_mc_list *dmi; |
2361 | char *addrs; | 2366 | char *addrs; |
2362 | int i; | ||
2363 | u32 crc; | 2367 | u32 crc; |
2364 | 2368 | ||
2365 | spin_lock_irq(&hp->happy_lock); | 2369 | spin_lock_irq(&hp->happy_lock); |
2366 | 2370 | ||
2367 | if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) { | 2371 | if ((dev->flags & IFF_ALLMULTI) || (netdev_mc_count(dev) > 64)) { |
2368 | hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff); | 2372 | hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff); |
2369 | hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff); | 2373 | hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff); |
2370 | hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff); | 2374 | hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff); |
@@ -2375,12 +2379,9 @@ static void happy_meal_set_multicast(struct net_device *dev) | |||
2375 | } else { | 2379 | } else { |
2376 | u16 hash_table[4]; | 2380 | u16 hash_table[4]; |
2377 | 2381 | ||
2378 | for (i = 0; i < 4; i++) | 2382 | memset(hash_table, 0, sizeof(hash_table)); |
2379 | hash_table[i] = 0; | 2383 | netdev_for_each_mc_addr(dmi, dev) { |
2380 | |||
2381 | for (i = 0; i < dev->mc_count; i++) { | ||
2382 | addrs = dmi->dmi_addr; | 2384 | addrs = dmi->dmi_addr; |
2383 | dmi = dmi->next; | ||
2384 | 2385 | ||
2385 | if (!(*addrs & 1)) | 2386 | if (!(*addrs & 1)) |
2386 | continue; | 2387 | continue; |
@@ -3047,9 +3048,9 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, | |||
3047 | int len; | 3048 | int len; |
3048 | 3049 | ||
3049 | if (qfe_slot != -1 && | 3050 | if (qfe_slot != -1 && |
3050 | (addr = of_get_property(dp, | 3051 | (addr = of_get_property(dp, "local-mac-address", &len)) |
3051 | "local-mac-address", &len)) != NULL | 3052 | != NULL && |
3052 | && len == 6) { | 3053 | len == 6) { |
3053 | memcpy(dev->dev_addr, addr, 6); | 3054 | memcpy(dev->dev_addr, addr, 6); |
3054 | } else { | 3055 | } else { |
3055 | memcpy(dev->dev_addr, idprom->id_ethaddr, 6); | 3056 | memcpy(dev->dev_addr, idprom->id_ethaddr, 6); |
@@ -3202,7 +3203,7 @@ static void __devexit happy_meal_pci_remove(struct pci_dev *pdev) | |||
3202 | dev_set_drvdata(&pdev->dev, NULL); | 3203 | dev_set_drvdata(&pdev->dev, NULL); |
3203 | } | 3204 | } |
3204 | 3205 | ||
3205 | static struct pci_device_id happymeal_pci_ids[] = { | 3206 | static DEFINE_PCI_DEVICE_TABLE(happymeal_pci_ids) = { |
3206 | { PCI_DEVICE(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_HAPPYMEAL) }, | 3207 | { PCI_DEVICE(PCI_VENDOR_ID_SUN, PCI_DEVICE_ID_SUN_HAPPYMEAL) }, |
3207 | { } /* Terminating entry */ | 3208 | { } /* Terminating entry */ |
3208 | }; | 3209 | }; |