aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sunhme.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/sunhme.c')
-rw-r--r--drivers/net/sunhme.c53
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
3205static struct pci_device_id happymeal_pci_ids[] = { 3206static 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};