Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

+848 -679
+1 -1
drivers/net/Kconfig
··· 812 812 tristate "SMC 91C9x/91C1xxx support" 813 813 select CRC32 814 814 select MII 815 - depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH) 815 + depends on NET_ETHERNET && (ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || SOC_AU1X00) 816 816 help 817 817 This is a driver for SMC's 91x series of Ethernet chipsets, 818 818 including the SMC91C94 and the SMC91C111. Say Y if you want it
+138 -93
drivers/net/forcedeth.c
··· 80 80 * into nv_close, otherwise reenabling for wol can 81 81 * cause DMA to kfree'd memory. 82 82 * 0.31: 14 Nov 2004: ethtool support for getting/setting link 83 - * capabilities. 83 + * capabilities. 84 84 * 0.32: 16 Apr 2005: RX_ERROR4 handling added. 85 85 * 0.33: 16 May 2005: Support for MCP51 added. 86 86 * 0.34: 18 Jun 2005: Add DEV_NEED_LINKTIMER to all nForce nics. ··· 89 89 * 0.37: 10 Jul 2005: Additional ethtool support, cleanup of pci id list 90 90 * 0.38: 16 Jul 2005: tx irq rewrite: Use global flags instead of 91 91 * per-packet flags. 92 - * 0.39: 18 Jul 2005: Add 64bit descriptor support. 93 - * 0.40: 19 Jul 2005: Add support for mac address change. 94 - * 0.41: 30 Jul 2005: Write back original MAC in nv_close instead 92 + * 0.39: 18 Jul 2005: Add 64bit descriptor support. 93 + * 0.40: 19 Jul 2005: Add support for mac address change. 94 + * 0.41: 30 Jul 2005: Write back original MAC in nv_close instead 95 95 * of nv_remove 96 - * 0.42: 06 Aug 2005: Fix lack of link speed initialization 96 + * 0.42: 06 Aug 2005: Fix lack of link speed initialization 97 97 * in the second (and later) nv_open call 98 - * 0.43: 10 Aug 2005: Add support for tx checksum. 99 - * 0.44: 20 Aug 2005: Add support for scatter gather and segmentation. 98 + * 0.43: 10 Aug 2005: Add support for tx checksum. 99 + * 0.44: 20 Aug 2005: Add support for scatter gather and segmentation. 100 + * 0.45: 18 Sep 2005: Remove nv_stop/start_rx from every link check 101 + * 0.46: 20 Oct 2005: Add irq optimization modes. 102 + * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. 100 103 * 101 104 * Known bugs: 102 105 * We suspect that on some hardware no TX done interrupts are generated. ··· 111 108 * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few 112 109 * superfluous timer interrupts from the nic. 113 110 */ 114 - #define FORCEDETH_VERSION "0.44" 111 + #define FORCEDETH_VERSION "0.47" 115 112 #define DRV_NAME "forcedeth" 116 113 117 114 #include <linux/module.h> ··· 166 163 #define NVREG_IRQ_LINK 0x0040 167 164 #define NVREG_IRQ_TX_ERROR 0x0080 168 165 #define NVREG_IRQ_TX1 0x0100 169 - #define NVREG_IRQMASK_WANTED 0x00df 166 + #define NVREG_IRQMASK_THROUGHPUT 0x00df 167 + #define NVREG_IRQMASK_CPU 0x0040 170 168 171 169 #define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR| \ 172 170 NVREG_IRQ_TX_OK|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX_ERROR| \ ··· 181 177 * NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms 182 178 */ 183 179 NvRegPollingInterval = 0x00c, 184 - #define NVREG_POLL_DEFAULT 970 180 + #define NVREG_POLL_DEFAULT_THROUGHPUT 970 181 + #define NVREG_POLL_DEFAULT_CPU 13 185 182 NvRegMisc1 = 0x080, 186 183 #define NVREG_MISC1_HD 0x02 187 184 #define NVREG_MISC1_FORCE 0x3b0f3c ··· 542 537 * is stuck. Overridable with module param. 543 538 */ 544 539 static int max_interrupt_work = 5; 540 + 541 + /* 542 + * Optimization can be either throuput mode or cpu mode 543 + * 544 + * Throughput Mode: Every tx and rx packet will generate an interrupt. 545 + * CPU Mode: Interrupts are controlled by a timer. 546 + */ 547 + #define NV_OPTIMIZATION_MODE_THROUGHPUT 0 548 + #define NV_OPTIMIZATION_MODE_CPU 1 549 + static int optimization_mode = NV_OPTIMIZATION_MODE_THROUGHPUT; 550 + 551 + /* 552 + * Poll interval for timer irq 553 + * 554 + * This interval determines how frequent an interrupt is generated. 555 + * The is value is determined by [(time_in_micro_secs * 100) / (2^10)] 556 + * Min = 0, and Max = 65535 557 + */ 558 + static int poll_interval = -1; 545 559 546 560 static inline struct fe_priv *get_nvpriv(struct net_device *dev) 547 561 { ··· 1352 1328 if (!(Flags & NV_RX_DESCRIPTORVALID)) 1353 1329 goto next_pkt; 1354 1330 1355 - if (Flags & NV_RX_MISSEDFRAME) { 1356 - np->stats.rx_missed_errors++; 1357 - np->stats.rx_errors++; 1358 - goto next_pkt; 1359 - } 1360 - if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) { 1361 - np->stats.rx_errors++; 1362 - goto next_pkt; 1363 - } 1364 - if (Flags & NV_RX_CRCERR) { 1365 - np->stats.rx_crc_errors++; 1366 - np->stats.rx_errors++; 1367 - goto next_pkt; 1368 - } 1369 - if (Flags & NV_RX_OVERFLOW) { 1370 - np->stats.rx_over_errors++; 1371 - np->stats.rx_errors++; 1372 - goto next_pkt; 1373 - } 1374 - if (Flags & NV_RX_ERROR4) { 1375 - len = nv_getlen(dev, np->rx_skbuff[i]->data, len); 1376 - if (len < 0) { 1331 + if (Flags & NV_RX_ERROR) { 1332 + if (Flags & NV_RX_MISSEDFRAME) { 1333 + np->stats.rx_missed_errors++; 1377 1334 np->stats.rx_errors++; 1378 1335 goto next_pkt; 1379 1336 } 1380 - } 1381 - /* framing errors are soft errors. */ 1382 - if (Flags & NV_RX_FRAMINGERR) { 1383 - if (Flags & NV_RX_SUBSTRACT1) { 1384 - len--; 1337 + if (Flags & (NV_RX_ERROR1|NV_RX_ERROR2|NV_RX_ERROR3)) { 1338 + np->stats.rx_errors++; 1339 + goto next_pkt; 1340 + } 1341 + if (Flags & NV_RX_CRCERR) { 1342 + np->stats.rx_crc_errors++; 1343 + np->stats.rx_errors++; 1344 + goto next_pkt; 1345 + } 1346 + if (Flags & NV_RX_OVERFLOW) { 1347 + np->stats.rx_over_errors++; 1348 + np->stats.rx_errors++; 1349 + goto next_pkt; 1350 + } 1351 + if (Flags & NV_RX_ERROR4) { 1352 + len = nv_getlen(dev, np->rx_skbuff[i]->data, len); 1353 + if (len < 0) { 1354 + np->stats.rx_errors++; 1355 + goto next_pkt; 1356 + } 1357 + } 1358 + /* framing errors are soft errors. */ 1359 + if (Flags & NV_RX_FRAMINGERR) { 1360 + if (Flags & NV_RX_SUBSTRACT1) { 1361 + len--; 1362 + } 1385 1363 } 1386 1364 } 1387 1365 } else { 1388 1366 if (!(Flags & NV_RX2_DESCRIPTORVALID)) 1389 1367 goto next_pkt; 1390 1368 1391 - if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) { 1392 - np->stats.rx_errors++; 1393 - goto next_pkt; 1394 - } 1395 - if (Flags & NV_RX2_CRCERR) { 1396 - np->stats.rx_crc_errors++; 1397 - np->stats.rx_errors++; 1398 - goto next_pkt; 1399 - } 1400 - if (Flags & NV_RX2_OVERFLOW) { 1401 - np->stats.rx_over_errors++; 1402 - np->stats.rx_errors++; 1403 - goto next_pkt; 1404 - } 1405 - if (Flags & NV_RX2_ERROR4) { 1406 - len = nv_getlen(dev, np->rx_skbuff[i]->data, len); 1407 - if (len < 0) { 1369 + if (Flags & NV_RX2_ERROR) { 1370 + if (Flags & (NV_RX2_ERROR1|NV_RX2_ERROR2|NV_RX2_ERROR3)) { 1408 1371 np->stats.rx_errors++; 1409 1372 goto next_pkt; 1410 1373 } 1411 - } 1412 - /* framing errors are soft errors */ 1413 - if (Flags & NV_RX2_FRAMINGERR) { 1414 - if (Flags & NV_RX2_SUBSTRACT1) { 1415 - len--; 1374 + if (Flags & NV_RX2_CRCERR) { 1375 + np->stats.rx_crc_errors++; 1376 + np->stats.rx_errors++; 1377 + goto next_pkt; 1378 + } 1379 + if (Flags & NV_RX2_OVERFLOW) { 1380 + np->stats.rx_over_errors++; 1381 + np->stats.rx_errors++; 1382 + goto next_pkt; 1383 + } 1384 + if (Flags & NV_RX2_ERROR4) { 1385 + len = nv_getlen(dev, np->rx_skbuff[i]->data, len); 1386 + if (len < 0) { 1387 + np->stats.rx_errors++; 1388 + goto next_pkt; 1389 + } 1390 + } 1391 + /* framing errors are soft errors */ 1392 + if (Flags & NV_RX2_FRAMINGERR) { 1393 + if (Flags & NV_RX2_SUBSTRACT1) { 1394 + len--; 1395 + } 1416 1396 } 1417 1397 } 1418 1398 Flags &= NV_RX2_CHECKSUMMASK; ··· 1640 1612 spin_unlock_irq(&np->lock); 1641 1613 } 1642 1614 1615 + /** 1616 + * nv_update_linkspeed: Setup the MAC according to the link partner 1617 + * @dev: Network device to be configured 1618 + * 1619 + * The function queries the PHY and checks if there is a link partner. 1620 + * If yes, then it sets up the MAC accordingly. Otherwise, the MAC is 1621 + * set to 10 MBit HD. 1622 + * 1623 + * The function returns 0 if there is no link partner and 1 if there is 1624 + * a good link partner. 1625 + */ 1643 1626 static int nv_update_linkspeed(struct net_device *dev) 1644 1627 { 1645 1628 struct fe_priv *np = netdev_priv(dev); ··· 1790 1751 static void nv_linkchange(struct net_device *dev) 1791 1752 { 1792 1753 if (nv_update_linkspeed(dev)) { 1793 - if (netif_carrier_ok(dev)) { 1794 - nv_stop_rx(dev); 1795 - } else { 1754 + if (!netif_carrier_ok(dev)) { 1796 1755 netif_carrier_on(dev); 1797 1756 printk(KERN_INFO "%s: link up.\n", dev->name); 1757 + nv_start_rx(dev); 1798 1758 } 1799 - nv_start_rx(dev); 1800 1759 } else { 1801 1760 if (netif_carrier_ok(dev)) { 1802 1761 netif_carrier_off(dev); ··· 1836 1799 if (!(events & np->irqmask)) 1837 1800 break; 1838 1801 1839 - if (events & (NVREG_IRQ_TX1|NVREG_IRQ_TX_OK|NVREG_IRQ_TX_ERROR|NVREG_IRQ_TX_ERR)) { 1802 + spin_lock(&np->lock); 1803 + nv_tx_done(dev); 1804 + spin_unlock(&np->lock); 1805 + 1806 + nv_rx_process(dev); 1807 + if (nv_alloc_rx(dev)) { 1840 1808 spin_lock(&np->lock); 1841 - nv_tx_done(dev); 1809 + if (!np->in_shutdown) 1810 + mod_timer(&np->oom_kick, jiffies + OOM_REFILL); 1842 1811 spin_unlock(&np->lock); 1843 1812 } 1844 - 1845 - if (events & (NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF)) { 1846 - nv_rx_process(dev); 1847 - if (nv_alloc_rx(dev)) { 1848 - spin_lock(&np->lock); 1849 - if (!np->in_shutdown) 1850 - mod_timer(&np->oom_kick, jiffies + OOM_REFILL); 1851 - spin_unlock(&np->lock); 1852 - } 1853 - } 1854 - 1813 + 1855 1814 if (events & NVREG_IRQ_LINK) { 1856 1815 spin_lock(&np->lock); 1857 1816 nv_link_irq(dev); ··· 2249 2216 writel(NVREG_RNDSEED_FORCE | (i&NVREG_RNDSEED_MASK), base + NvRegRandomSeed); 2250 2217 writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1); 2251 2218 writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2); 2252 - writel(NVREG_POLL_DEFAULT, base + NvRegPollingInterval); 2219 + if (poll_interval == -1) { 2220 + if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) 2221 + writel(NVREG_POLL_DEFAULT_THROUGHPUT, base + NvRegPollingInterval); 2222 + else 2223 + writel(NVREG_POLL_DEFAULT_CPU, base + NvRegPollingInterval); 2224 + } 2225 + else 2226 + writel(poll_interval & 0xFFFF, base + NvRegPollingInterval); 2253 2227 writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6); 2254 2228 writel((np->phyaddr << NVREG_ADAPTCTL_PHYSHIFT)|NVREG_ADAPTCTL_PHYVALID|NVREG_ADAPTCTL_RUNNING, 2255 2229 base + NvRegAdapterControl); ··· 2541 2501 } else { 2542 2502 np->tx_flags = NV_TX2_VALID; 2543 2503 } 2544 - np->irqmask = NVREG_IRQMASK_WANTED; 2504 + if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT) 2505 + np->irqmask = NVREG_IRQMASK_THROUGHPUT; 2506 + else 2507 + np->irqmask = NVREG_IRQMASK_CPU; 2508 + 2545 2509 if (id->driver_data & DEV_NEED_TIMERIRQ) 2546 2510 np->irqmask |= NVREG_IRQ_TIMER; 2547 2511 if (id->driver_data & DEV_NEED_LINKTIMER) { ··· 2558 2514 } 2559 2515 2560 2516 /* find a suitable phy */ 2561 - for (i = 1; i < 32; i++) { 2517 + for (i = 1; i <= 32; i++) { 2562 2518 int id1, id2; 2519 + int phyaddr = i & 0x1F; 2563 2520 2564 2521 spin_lock_irq(&np->lock); 2565 - id1 = mii_rw(dev, i, MII_PHYSID1, MII_READ); 2522 + id1 = mii_rw(dev, phyaddr, MII_PHYSID1, MII_READ); 2566 2523 spin_unlock_irq(&np->lock); 2567 2524 if (id1 < 0 || id1 == 0xffff) 2568 2525 continue; 2569 2526 spin_lock_irq(&np->lock); 2570 - id2 = mii_rw(dev, i, MII_PHYSID2, MII_READ); 2527 + id2 = mii_rw(dev, phyaddr, MII_PHYSID2, MII_READ); 2571 2528 spin_unlock_irq(&np->lock); 2572 2529 if (id2 < 0 || id2 == 0xffff) 2573 2530 continue; ··· 2576 2531 id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT; 2577 2532 id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT; 2578 2533 dprintk(KERN_DEBUG "%s: open: Found PHY %04x:%04x at address %d.\n", 2579 - pci_name(pci_dev), id1, id2, i); 2580 - np->phyaddr = i; 2534 + pci_name(pci_dev), id1, id2, phyaddr); 2535 + np->phyaddr = phyaddr; 2581 2536 np->phy_oui = id1 | id2; 2582 2537 break; 2583 2538 } 2584 - if (i == 32) { 2585 - /* PHY in isolate mode? No phy attached and user wants to 2586 - * test loopback? Very odd, but can be correct. 2587 - */ 2539 + if (i == 33) { 2588 2540 printk(KERN_INFO "%s: open: Could not find a valid PHY.\n", 2589 - pci_name(pci_dev)); 2541 + pci_name(pci_dev)); 2542 + goto out_freering; 2590 2543 } 2591 - 2592 - if (i != 32) { 2593 - /* reset it */ 2594 - phy_init(dev); 2595 - } 2544 + 2545 + /* reset it */ 2546 + phy_init(dev); 2596 2547 2597 2548 /* set default link speed settings */ 2598 2549 np->linkspeed = NVREG_LINKSPEED_FORCE|NVREG_LINKSPEED_10; ··· 2730 2689 2731 2690 module_param(max_interrupt_work, int, 0); 2732 2691 MODULE_PARM_DESC(max_interrupt_work, "forcedeth maximum events handled per interrupt"); 2692 + module_param(optimization_mode, int, 0); 2693 + MODULE_PARM_DESC(optimization_mode, "In throughput mode (0), every tx & rx packet will generate an interrupt. In CPU mode (1), interrupts are controlled by a timer."); 2694 + module_param(poll_interval, int, 0); 2695 + MODULE_PARM_DESC(poll_interval, "Interval determines how frequent timer interrupt is generated by [(time_in_micro_secs * 100) / (2^10)]. Min is 0 and Max is 65535."); 2733 2696 2734 2697 MODULE_AUTHOR("Manfred Spraul <manfred@colorfullife.com>"); 2735 2698 MODULE_DESCRIPTION("Reverse Engineered nForce ethernet driver");
+1 -1
drivers/net/gianfar_mii.c
··· 133 133 if (NULL == dev) 134 134 return -EINVAL; 135 135 136 - new_bus = kmalloc(sizeof(struct mii_bus), GFP_KERNEL); 136 + new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 137 137 138 138 if (NULL == new_bus) 139 139 return -ENOMEM;
+4 -6
drivers/net/gt96100eth.c
··· 72 72 static void dump_rx_desc(int dbg_lvl, struct net_device *dev, int i); 73 73 static void dump_skb(int dbg_lvl, struct net_device *dev, 74 74 struct sk_buff *skb); 75 - static void dump_hw_addr(int dbg_lvl, struct net_device *dev, 76 - const char* pfx, unsigned char* addr_str); 77 75 static void update_stats(struct gt96100_private *gp); 78 76 static void abort(struct net_device *dev, u32 abort_bits); 79 77 static void hard_stop(struct net_device *dev); ··· 332 334 333 335 static void 334 336 dump_hw_addr(int dbg_lvl, struct net_device *dev, const char* pfx, 335 - unsigned char* addr_str) 337 + const char* func, unsigned char* addr_str) 336 338 { 337 339 int i; 338 340 char buf[100], octet[5]; 339 341 340 342 if (dbg_lvl <= GT96100_DEBUG) { 341 - strcpy(buf, pfx); 343 + sprintf(buf, pfx, func); 342 344 for (i = 0; i < 6; i++) { 343 345 sprintf(octet, "%2.2x%s", 344 346 addr_str[i], i<5 ? ":" : "\n"); ··· 706 708 707 709 info("%s found at 0x%x, irq %d\n", 708 710 chip_name(gp->chip_rev), gtif->iobase, gtif->irq); 709 - dump_hw_addr(0, dev, "HW Address ", dev->dev_addr); 711 + dump_hw_addr(0, dev, "%s: HW Address ", __FUNCTION__, dev->dev_addr); 710 712 info("%s chip revision=%d\n", chip_name(gp->chip_rev), gp->chip_rev); 711 713 info("%s ethernet port %d\n", chip_name(gp->chip_rev), gp->port_num); 712 714 info("external PHY ID1=0x%04x, ID2=0x%04x\n", phy_id1, phy_id2); ··· 1486 1488 gt96100_add_hash_entry(dev, dev->dev_addr); 1487 1489 1488 1490 for (mcptr = dev->mc_list; mcptr; mcptr = mcptr->next) { 1489 - dump_hw_addr(2, dev, __FUNCTION__ ": addr=", 1491 + dump_hw_addr(2, dev, "%s: addr=", __FUNCTION__, 1490 1492 mcptr->dmi_addr); 1491 1493 gt96100_add_hash_entry(dev, mcptr->dmi_addr); 1492 1494 }
+1 -1
drivers/net/ibmveth.c
··· 58 58 59 59 #include "ibmveth.h" 60 60 61 - #define DEBUG 1 61 + #undef DEBUG 62 62 63 63 #define ibmveth_printk(fmt, args...) \ 64 64 printk(KERN_INFO "%s: " fmt, __FILE__, ## args)
+288 -321
drivers/net/saa9730.c
··· 1 1 /* 2 - * Carsten Langgaard, carstenl@mips.com 3 - * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. 4 - * 5 - * ######################################################################## 2 + * Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved. 3 + * Authors: Carsten Langgaard <carstenl@mips.com> 4 + * Maciej W. Rozycki <macro@mips.com> 5 + * Copyright (C) 2004 Ralf Baechle <ralf@linux-mips.org> 6 6 * 7 7 * This program is free software; you can distribute it and/or modify it 8 8 * under the terms of the GNU General Public License (Version 2) as ··· 17 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 18 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 19 19 * 20 - * ######################################################################## 21 - * 22 20 * SAA9730 ethernet driver. 23 21 * 24 22 * Changes: 25 - * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API (pci_driver). 26 - * Conversion to spinlocks. 27 - * Error handling fixes. 28 - * 23 + * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API 24 + * (pci_driver). 25 + * Conversion to spinlocks. 26 + * Error handling fixes. 29 27 */ 30 28 31 29 #include <linux/init.h> ··· 34 36 #include <linux/skbuff.h> 35 37 #include <linux/pci.h> 36 38 #include <linux/spinlock.h> 39 + #include <linux/types.h> 37 40 38 41 #include <asm/addrspace.h> 42 + #include <asm/io.h> 43 + 39 44 #include <asm/mips-boards/prom.h> 40 45 41 46 #include "saa9730.h" ··· 52 51 #define DRV_MODULE_NAME "saa9730" 53 52 54 53 static struct pci_device_id saa9730_pci_tbl[] = { 55 - { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9370, 56 - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 54 + { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9730, 55 + PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 57 56 { 0, } 58 57 }; 59 58 ··· 62 61 /* Non-zero only if the current card is a PCI with BIOS-set IRQ. */ 63 62 static unsigned int pci_irq_line; 64 63 65 - #define INL(a) inl((unsigned long)a) 66 - #define OUTL(x,a) outl(x,(unsigned long)a) 67 - 68 64 static void evm_saa9730_enable_lan_int(struct lan_saa9730_private *lp) 69 65 { 70 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 66 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 71 67 &lp->evm_saa9730_regs->InterruptBlock1); 72 - OUTL(INL(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT, 68 + outl(readl(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT, 73 69 &lp->evm_saa9730_regs->InterruptStatus1); 74 - OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT | 70 + outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT | 75 71 EVM_MASTER_EN, &lp->evm_saa9730_regs->InterruptEnable1); 76 72 } 73 + 77 74 static void evm_saa9730_disable_lan_int(struct lan_saa9730_private *lp) 78 75 { 79 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 76 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 80 77 &lp->evm_saa9730_regs->InterruptBlock1); 81 - OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT, 78 + outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT, 82 79 &lp->evm_saa9730_regs->InterruptEnable1); 83 80 } 84 81 85 82 static void evm_saa9730_clear_lan_int(struct lan_saa9730_private *lp) 86 83 { 87 - OUTL(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1); 84 + outl(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1); 88 85 } 89 86 90 87 static void evm_saa9730_block_lan_int(struct lan_saa9730_private *lp) 91 88 { 92 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 89 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 93 90 &lp->evm_saa9730_regs->InterruptBlock1); 94 91 } 95 92 96 93 static void evm_saa9730_unblock_lan_int(struct lan_saa9730_private *lp) 97 94 { 98 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 95 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 99 96 &lp->evm_saa9730_regs->InterruptBlock1); 100 97 } 101 98 102 - static void show_saa9730_regs(struct lan_saa9730_private *lp) 99 + static void __attribute_used__ show_saa9730_regs(struct lan_saa9730_private *lp) 103 100 { 104 101 int i, j; 105 - printk("TxmBufferA = %x\n", lp->TxmBuffer[0][0]); 106 - printk("TxmBufferB = %x\n", lp->TxmBuffer[1][0]); 107 - printk("RcvBufferA = %x\n", lp->RcvBuffer[0][0]); 108 - printk("RcvBufferB = %x\n", lp->RcvBuffer[1][0]); 102 + printk("TxmBufferA = %p\n", lp->TxmBuffer[0][0]); 103 + printk("TxmBufferB = %p\n", lp->TxmBuffer[1][0]); 104 + printk("RcvBufferA = %p\n", lp->RcvBuffer[0][0]); 105 + printk("RcvBufferB = %p\n", lp->RcvBuffer[1][0]); 109 106 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { 110 107 for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) { 111 108 printk("TxmBuffer[%d][%d] = %x\n", i, j, ··· 119 120 } 120 121 } 121 122 printk("lp->evm_saa9730_regs->InterruptBlock1 = %x\n", 122 - INL(&lp->evm_saa9730_regs->InterruptBlock1)); 123 + readl(&lp->evm_saa9730_regs->InterruptBlock1)); 123 124 printk("lp->evm_saa9730_regs->InterruptStatus1 = %x\n", 124 - INL(&lp->evm_saa9730_regs->InterruptStatus1)); 125 + readl(&lp->evm_saa9730_regs->InterruptStatus1)); 125 126 printk("lp->evm_saa9730_regs->InterruptEnable1 = %x\n", 126 - INL(&lp->evm_saa9730_regs->InterruptEnable1)); 127 + readl(&lp->evm_saa9730_regs->InterruptEnable1)); 127 128 printk("lp->lan_saa9730_regs->Ok2Use = %x\n", 128 - INL(&lp->lan_saa9730_regs->Ok2Use)); 129 + readl(&lp->lan_saa9730_regs->Ok2Use)); 129 130 printk("lp->NextTxmBufferIndex = %x\n", lp->NextTxmBufferIndex); 130 131 printk("lp->NextTxmPacketIndex = %x\n", lp->NextTxmPacketIndex); 131 132 printk("lp->PendingTxmBufferIndex = %x\n", ··· 133 134 printk("lp->PendingTxmPacketIndex = %x\n", 134 135 lp->PendingTxmPacketIndex); 135 136 printk("lp->lan_saa9730_regs->LanDmaCtl = %x\n", 136 - INL(&lp->lan_saa9730_regs->LanDmaCtl)); 137 + readl(&lp->lan_saa9730_regs->LanDmaCtl)); 137 138 printk("lp->lan_saa9730_regs->DmaStatus = %x\n", 138 - INL(&lp->lan_saa9730_regs->DmaStatus)); 139 + readl(&lp->lan_saa9730_regs->DmaStatus)); 139 140 printk("lp->lan_saa9730_regs->CamCtl = %x\n", 140 - INL(&lp->lan_saa9730_regs->CamCtl)); 141 + readl(&lp->lan_saa9730_regs->CamCtl)); 141 142 printk("lp->lan_saa9730_regs->TxCtl = %x\n", 142 - INL(&lp->lan_saa9730_regs->TxCtl)); 143 + readl(&lp->lan_saa9730_regs->TxCtl)); 143 144 printk("lp->lan_saa9730_regs->TxStatus = %x\n", 144 - INL(&lp->lan_saa9730_regs->TxStatus)); 145 + readl(&lp->lan_saa9730_regs->TxStatus)); 145 146 printk("lp->lan_saa9730_regs->RxCtl = %x\n", 146 - INL(&lp->lan_saa9730_regs->RxCtl)); 147 + readl(&lp->lan_saa9730_regs->RxCtl)); 147 148 printk("lp->lan_saa9730_regs->RxStatus = %x\n", 148 - INL(&lp->lan_saa9730_regs->RxStatus)); 149 + readl(&lp->lan_saa9730_regs->RxStatus)); 149 150 for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) { 150 - OUTL(i, &lp->lan_saa9730_regs->CamAddress); 151 + outl(i, &lp->lan_saa9730_regs->CamAddress); 151 152 printk("lp->lan_saa9730_regs->CamData = %x\n", 152 - INL(&lp->lan_saa9730_regs->CamData)); 153 + readl(&lp->lan_saa9730_regs->CamData)); 153 154 } 154 155 printk("lp->stats.tx_packets = %lx\n", lp->stats.tx_packets); 155 156 printk("lp->stats.tx_errors = %lx\n", lp->stats.tx_errors); ··· 177 178 lp->stats.rx_length_errors); 178 179 179 180 printk("lp->lan_saa9730_regs->DebugPCIMasterAddr = %x\n", 180 - INL(&lp->lan_saa9730_regs->DebugPCIMasterAddr)); 181 + readl(&lp->lan_saa9730_regs->DebugPCIMasterAddr)); 181 182 printk("lp->lan_saa9730_regs->DebugLanTxStateMachine = %x\n", 182 - INL(&lp->lan_saa9730_regs->DebugLanTxStateMachine)); 183 + readl(&lp->lan_saa9730_regs->DebugLanTxStateMachine)); 183 184 printk("lp->lan_saa9730_regs->DebugLanRxStateMachine = %x\n", 184 - INL(&lp->lan_saa9730_regs->DebugLanRxStateMachine)); 185 + readl(&lp->lan_saa9730_regs->DebugLanRxStateMachine)); 185 186 printk("lp->lan_saa9730_regs->DebugLanTxFifoPointers = %x\n", 186 - INL(&lp->lan_saa9730_regs->DebugLanTxFifoPointers)); 187 + readl(&lp->lan_saa9730_regs->DebugLanTxFifoPointers)); 187 188 printk("lp->lan_saa9730_regs->DebugLanRxFifoPointers = %x\n", 188 - INL(&lp->lan_saa9730_regs->DebugLanRxFifoPointers)); 189 + readl(&lp->lan_saa9730_regs->DebugLanRxFifoPointers)); 189 190 printk("lp->lan_saa9730_regs->DebugLanCtlStateMachine = %x\n", 190 - INL(&lp->lan_saa9730_regs->DebugLanCtlStateMachine)); 191 + readl(&lp->lan_saa9730_regs->DebugLanCtlStateMachine)); 191 192 } 192 193 193 194 static void lan_saa9730_buffer_init(struct lan_saa9730_private *lp) ··· 213 214 } 214 215 } 215 216 216 - static int lan_saa9730_allocate_buffers(struct lan_saa9730_private *lp) 217 + static void lan_saa9730_free_buffers(struct pci_dev *pdev, 218 + struct lan_saa9730_private *lp) 217 219 { 218 - unsigned int mem_size; 220 + pci_free_consistent(pdev, lp->buffer_size, lp->buffer_start, 221 + lp->dma_addr); 222 + } 223 + 224 + static int lan_saa9730_allocate_buffers(struct pci_dev *pdev, 225 + struct lan_saa9730_private *lp) 226 + { 219 227 void *Pa; 220 - unsigned int i, j, RcvBufferSize, TxmBufferSize; 221 - unsigned int buffer_start; 222 - 223 - /* 224 - * Allocate all RX and TX packets in one chunk. 225 - * The Rx and Tx packets must be PACKET_SIZE aligned. 226 - */ 227 - mem_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) * 228 - LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) + 229 - LAN_SAA9730_PACKET_SIZE; 230 - buffer_start = 231 - (unsigned int) kmalloc(mem_size, GFP_DMA | GFP_KERNEL); 232 - 233 - if (!buffer_start) 234 - return -ENOMEM; 235 - 236 - /* 237 - * Set DMA buffer to kseg1 (uncached). 238 - * Make sure to flush before using it uncached. 239 - */ 240 - Pa = (void *) KSEG1ADDR((buffer_start + LAN_SAA9730_PACKET_SIZE) & 241 - ~(LAN_SAA9730_PACKET_SIZE - 1)); 242 - dma_cache_wback_inv((unsigned long) Pa, mem_size); 228 + unsigned int i, j, rxoffset, txoffset; 229 + int ret; 243 230 244 231 /* Initialize buffer space */ 245 - RcvBufferSize = LAN_SAA9730_PACKET_SIZE; 246 - TxmBufferSize = LAN_SAA9730_PACKET_SIZE; 247 232 lp->DmaRcvPackets = LAN_SAA9730_RCV_Q_SIZE; 248 233 lp->DmaTxmPackets = LAN_SAA9730_TXM_Q_SIZE; 234 + 235 + /* Initialize Rx Buffer Index */ 236 + lp->NextRcvPacketIndex = 0; 237 + lp->NextRcvBufferIndex = 0; 238 + 239 + /* Set current buffer index & next available packet index */ 240 + lp->NextTxmPacketIndex = 0; 241 + lp->NextTxmBufferIndex = 0; 242 + lp->PendingTxmPacketIndex = 0; 243 + lp->PendingTxmBufferIndex = 0; 244 + 245 + /* 246 + * Allocate all RX and TX packets in one chunk. 247 + * The Rx and Tx packets must be PACKET_SIZE aligned. 248 + */ 249 + lp->buffer_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) * 250 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) + 251 + LAN_SAA9730_PACKET_SIZE; 252 + lp->buffer_start = pci_alloc_consistent(pdev, lp->buffer_size, 253 + &lp->dma_addr); 254 + if (!lp->buffer_start) { 255 + ret = -ENOMEM; 256 + goto out; 257 + } 258 + 259 + Pa = (void *)ALIGN((unsigned long)lp->buffer_start, 260 + LAN_SAA9730_PACKET_SIZE); 261 + 262 + rxoffset = Pa - lp->buffer_start; 249 263 250 264 /* Init RX buffers */ 251 265 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { ··· 266 254 *(unsigned int *) Pa = 267 255 cpu_to_le32(RXSF_READY << 268 256 RX_STAT_CTL_OWNER_SHF); 269 - lp->RcvBuffer[i][j] = (unsigned int) Pa; 270 - Pa += RcvBufferSize; 257 + lp->RcvBuffer[i][j] = Pa; 258 + Pa += LAN_SAA9730_PACKET_SIZE; 271 259 } 272 260 } 261 + 262 + txoffset = Pa - lp->buffer_start; 273 263 274 264 /* Init TX buffers */ 275 265 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { ··· 279 265 *(unsigned int *) Pa = 280 266 cpu_to_le32(TXSF_EMPTY << 281 267 TX_STAT_CTL_OWNER_SHF); 282 - lp->TxmBuffer[i][j] = (unsigned int) Pa; 283 - Pa += TxmBufferSize; 268 + lp->TxmBuffer[i][j] = Pa; 269 + Pa += LAN_SAA9730_PACKET_SIZE; 284 270 } 285 271 } 286 272 287 - /* 288 - * Set rx buffer A and rx buffer B to point to the first two buffer 273 + /* 274 + * Set rx buffer A and rx buffer B to point to the first two buffer 289 275 * spaces. 290 276 */ 291 - OUTL(PHYSADDR(lp->RcvBuffer[0][0]), 277 + outl(lp->dma_addr + rxoffset, 292 278 &lp->lan_saa9730_regs->RxBuffA); 293 - OUTL(PHYSADDR(lp->RcvBuffer[1][0]), 279 + outl(lp->dma_addr + rxoffset + 280 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_RCV_Q_SIZE, 294 281 &lp->lan_saa9730_regs->RxBuffB); 295 282 296 - /* Initialize Buffer Index */ 297 - lp->NextRcvPacketIndex = 0; 298 - lp->NextRcvToUseIsA = 1; 299 - 300 - /* Set current buffer index & next availble packet index */ 301 - lp->NextTxmPacketIndex = 0; 302 - lp->NextTxmBufferIndex = 0; 303 - lp->PendingTxmPacketIndex = 0; 304 - lp->PendingTxmBufferIndex = 0; 305 - 306 - /* 283 + /* 307 284 * Set txm_buf_a and txm_buf_b to point to the first two buffer 308 - * space 285 + * space 309 286 */ 310 - OUTL(PHYSADDR(lp->TxmBuffer[0][0]), 287 + outl(lp->dma_addr + txoffset, 311 288 &lp->lan_saa9730_regs->TxBuffA); 312 - OUTL(PHYSADDR(lp->TxmBuffer[1][0]), 289 + outl(lp->dma_addr + txoffset + 290 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_TXM_Q_SIZE, 313 291 &lp->lan_saa9730_regs->TxBuffB); 314 292 315 293 /* Set packet number */ 316 - OUTL((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) | 294 + outl((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) | 317 295 (lp->DmaRcvPackets << PK_COUNT_RX_B_SHF) | 318 296 (lp->DmaTxmPackets << PK_COUNT_TX_A_SHF) | 319 297 (lp->DmaTxmPackets << PK_COUNT_TX_B_SHF), 320 298 &lp->lan_saa9730_regs->PacketCount); 321 299 322 300 return 0; 301 + 302 + out: 303 + return ret; 323 304 } 324 305 325 306 static int lan_saa9730_cam_load(struct lan_saa9730_private *lp) ··· 326 317 327 318 for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) { 328 319 /* First set address to where data is written */ 329 - OUTL(i, &lp->lan_saa9730_regs->CamAddress); 330 - OUTL((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16) 320 + outl(i, &lp->lan_saa9730_regs->CamAddress); 321 + outl((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16) 331 322 | (NetworkAddress[2] << 8) | NetworkAddress[3], 332 323 &lp->lan_saa9730_regs->CamData); 333 324 NetworkAddress += 4; ··· 337 328 338 329 static int lan_saa9730_cam_init(struct net_device *dev) 339 330 { 340 - struct lan_saa9730_private *lp = 341 - (struct lan_saa9730_private *) dev->priv; 331 + struct lan_saa9730_private *lp = netdev_priv(dev); 342 332 unsigned int i; 343 333 344 334 /* Copy MAC-address into all entries. */ ··· 355 347 356 348 /* Check link status, spin here till station is not busy. */ 357 349 i = 0; 358 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 350 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 359 351 i++; 360 352 if (i > 100) { 361 353 printk("Error: lan_saa9730_mii_init: timeout\n"); ··· 365 357 } 366 358 367 359 /* Now set the control and address register. */ 368 - OUTL(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF, 360 + outl(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF, 369 361 &lp->lan_saa9730_regs->StationMgmtCtl); 370 362 371 363 /* check link status, spin here till station is not busy */ 372 364 i = 0; 373 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 365 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 374 366 i++; 375 367 if (i > 100) { 376 368 printk("Error: lan_saa9730_mii_init: timeout\n"); ··· 383 375 mdelay(1); 384 376 385 377 /* Check the link status. */ 386 - if (INL(&lp->lan_saa9730_regs->StationMgmtData) & 378 + if (readl(&lp->lan_saa9730_regs->StationMgmtData) & 387 379 PHY_STATUS_LINK_UP) { 388 380 /* Link is up. */ 389 381 return 0; ··· 391 383 /* Link is down, reset the PHY first. */ 392 384 393 385 /* set PHY address = 'CONTROL' */ 394 - OUTL(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL, 386 + outl(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL, 395 387 &lp->lan_saa9730_regs->StationMgmtCtl); 396 388 397 389 /* Wait for 1 ms. */ 398 390 mdelay(1); 399 391 400 392 /* set 'CONTROL' = force reset and renegotiate */ 401 - OUTL(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG | 393 + outl(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG | 402 394 PHY_CONTROL_RESTART_AUTO_NEG, 403 395 &lp->lan_saa9730_regs->StationMgmtData); 404 396 ··· 406 398 mdelay(50); 407 399 408 400 /* set 'BUSY' to start operation */ 409 - OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | 401 + outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | 410 402 PHY_CONTROL, &lp->lan_saa9730_regs->StationMgmtCtl); 411 403 412 404 /* await completion */ 413 405 i = 0; 414 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & 406 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & 415 407 MD_CA_BUSY) { 416 408 i++; 417 409 if (i > 100) { ··· 427 419 428 420 for (l = 0; l < 2; l++) { 429 421 /* set PHY address = 'STATUS' */ 430 - OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | 422 + outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | 431 423 PHY_STATUS, 432 424 &lp->lan_saa9730_regs->StationMgmtCtl); 433 425 434 426 /* await completion */ 435 427 i = 0; 436 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & 428 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & 437 429 MD_CA_BUSY) { 438 430 i++; 439 431 if (i > 100) { ··· 448 440 mdelay(3000); 449 441 450 442 /* check the link status */ 451 - if (INL(&lp->lan_saa9730_regs->StationMgmtData) & 443 + if (readl(&lp->lan_saa9730_regs->StationMgmtData) & 452 444 PHY_STATUS_LINK_UP) { 453 445 /* link is up */ 454 446 break; ··· 462 454 static int lan_saa9730_control_init(struct lan_saa9730_private *lp) 463 455 { 464 456 /* Initialize DMA control register. */ 465 - OUTL((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) | 457 + outl((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) | 466 458 (LANEND_LITTLE << DMA_CTL_ENDIAN_SHF) | 467 459 (LAN_SAA9730_RCV_Q_INT_THRESHOLD << DMA_CTL_RX_INT_COUNT_SHF) 468 460 | DMA_CTL_RX_INT_TO_EN | DMA_CTL_RX_INT_EN | ··· 470 462 &lp->lan_saa9730_regs->LanDmaCtl); 471 463 472 464 /* Initial MAC control register. */ 473 - OUTL((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP, 465 + outl((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP, 474 466 &lp->lan_saa9730_regs->MacCtl); 475 467 476 468 /* Initialize CAM control register. */ 477 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC, 469 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC, 478 470 &lp->lan_saa9730_regs->CamCtl); 479 471 480 - /* 472 + /* 481 473 * Initialize CAM enable register, only turn on first entry, should 482 - * contain own addr. 474 + * contain own addr. 483 475 */ 484 - OUTL(0x0001, &lp->lan_saa9730_regs->CamEnable); 476 + outl(0x0001, &lp->lan_saa9730_regs->CamEnable); 485 477 486 478 /* Initialize Tx control register */ 487 - OUTL(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl); 479 + outl(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl); 488 480 489 481 /* Initialize Rcv control register */ 490 - OUTL(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl); 482 + outl(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl); 491 483 492 484 /* Reset DMA engine */ 493 - OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 485 + outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 494 486 495 487 return 0; 496 488 } ··· 500 492 int i; 501 493 502 494 /* Stop DMA first */ 503 - OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) & 495 + outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) & 504 496 ~(DMA_CTL_EN_TX_DMA | DMA_CTL_EN_RX_DMA), 505 497 &lp->lan_saa9730_regs->LanDmaCtl); 506 498 507 499 /* Set the SW Reset bits in DMA and MAC control registers */ 508 - OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 509 - OUTL(INL(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET, 500 + outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 501 + outl(readl(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET, 510 502 &lp->lan_saa9730_regs->MacCtl); 511 503 512 - /* 504 + /* 513 505 * Wait for MAC reset to have finished. The reset bit is auto cleared 514 506 * when the reset is done. 515 507 */ 516 508 i = 0; 517 - while (INL(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) { 509 + while (readl(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) { 518 510 i++; 519 511 if (i > 100) { 520 512 printk ··· 532 524 /* Stop lan controller. */ 533 525 lan_saa9730_stop(lp); 534 526 535 - OUTL(LAN_SAA9730_DEFAULT_TIME_OUT_CNT, 527 + outl(LAN_SAA9730_DEFAULT_TIME_OUT_CNT, 536 528 &lp->lan_saa9730_regs->Timeout); 537 529 538 530 return 0; ··· 544 536 545 537 /* Initialize Rx Buffer Index */ 546 538 lp->NextRcvPacketIndex = 0; 547 - lp->NextRcvToUseIsA = 1; 539 + lp->NextRcvBufferIndex = 0; 548 540 549 - /* Set current buffer index & next availble packet index */ 541 + /* Set current buffer index & next available packet index */ 550 542 lp->NextTxmPacketIndex = 0; 551 543 lp->NextTxmBufferIndex = 0; 552 544 lp->PendingTxmPacketIndex = 0; 553 545 lp->PendingTxmBufferIndex = 0; 554 546 555 - OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA | 547 + outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA | 556 548 DMA_CTL_EN_RX_DMA, &lp->lan_saa9730_regs->LanDmaCtl); 557 549 558 550 /* For Tx, turn on MAC then DMA */ 559 - OUTL(INL(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN, 551 + outl(readl(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN, 560 552 &lp->lan_saa9730_regs->TxCtl); 561 553 562 554 /* For Rx, turn on DMA then MAC */ 563 - OUTL(INL(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN, 555 + outl(readl(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN, 564 556 &lp->lan_saa9730_regs->RxCtl); 565 557 566 - /* Set Ok2Use to let hardware owns the buffers */ 567 - OUTL(OK2USE_RX_A | OK2USE_RX_B | OK2USE_TX_A | OK2USE_TX_B, 568 - &lp->lan_saa9730_regs->Ok2Use); 558 + /* Set Ok2Use to let hardware own the buffers. */ 559 + outl(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use); 569 560 570 561 return 0; 571 562 } ··· 579 572 580 573 static int lan_saa9730_tx(struct net_device *dev) 581 574 { 582 - struct lan_saa9730_private *lp = 583 - (struct lan_saa9730_private *) dev->priv; 575 + struct lan_saa9730_private *lp = netdev_priv(dev); 584 576 unsigned int *pPacket; 585 577 unsigned int tx_status; 586 578 ··· 587 581 printk("lan_saa9730_tx interrupt\n"); 588 582 589 583 /* Clear interrupt. */ 590 - OUTL(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus); 584 + outl(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus); 591 585 592 586 while (1) { 593 - pPacket = 594 - (unsigned int *) lp->TxmBuffer[lp-> 595 - PendingTxmBufferIndex] 596 - [lp->PendingTxmPacketIndex]; 587 + pPacket = lp->TxmBuffer[lp->PendingTxmBufferIndex] 588 + [lp->PendingTxmPacketIndex]; 597 589 598 590 /* Get status of first packet transmitted. */ 599 591 tx_status = le32_to_cpu(*pPacket); ··· 609 605 lp->stats.tx_errors++; 610 606 if (tx_status & 611 607 (TX_STATUS_EX_COLL << TX_STAT_CTL_STATUS_SHF)) 612 - lp->stats.tx_aborted_errors++; 608 + lp->stats.tx_aborted_errors++; 613 609 if (tx_status & 614 - (TX_STATUS_LATE_COLL << 615 - TX_STAT_CTL_STATUS_SHF)) lp->stats. 616 - tx_window_errors++; 610 + (TX_STATUS_LATE_COLL << TX_STAT_CTL_STATUS_SHF)) 611 + lp->stats.tx_window_errors++; 617 612 if (tx_status & 618 613 (TX_STATUS_L_CARR << TX_STAT_CTL_STATUS_SHF)) 619 - lp->stats.tx_carrier_errors++; 614 + lp->stats.tx_carrier_errors++; 620 615 if (tx_status & 621 616 (TX_STATUS_UNDER << TX_STAT_CTL_STATUS_SHF)) 622 - lp->stats.tx_fifo_errors++; 617 + lp->stats.tx_fifo_errors++; 623 618 if (tx_status & 624 619 (TX_STATUS_SQ_ERR << TX_STAT_CTL_STATUS_SHF)) 625 - lp->stats.tx_heartbeat_errors++; 620 + lp->stats.tx_heartbeat_errors++; 626 621 627 622 lp->stats.collisions += 628 - tx_status & TX_STATUS_TX_COLL_MSK; 623 + tx_status & TX_STATUS_TX_COLL_MSK; 629 624 } 630 625 631 626 /* Free buffer. */ ··· 639 636 } 640 637 } 641 638 642 - /* Make sure A and B are available to hardware. */ 643 - OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use); 644 - 645 - if (netif_queue_stopped(dev)) { 646 - /* The tx buffer is no longer full. */ 647 - netif_wake_queue(dev); 648 - } 639 + /* The tx buffer is no longer full. */ 640 + netif_wake_queue(dev); 649 641 650 642 return 0; 651 643 } 652 644 653 645 static int lan_saa9730_rx(struct net_device *dev) 654 646 { 655 - struct lan_saa9730_private *lp = 656 - (struct lan_saa9730_private *) dev->priv; 647 + struct lan_saa9730_private *lp = netdev_priv(dev); 657 648 int len = 0; 658 649 struct sk_buff *skb = 0; 659 650 unsigned int rx_status; ··· 660 663 printk("lan_saa9730_rx interrupt\n"); 661 664 662 665 /* Clear receive interrupts. */ 663 - OUTL(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 666 + outl(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 664 667 DMA_STATUS_RX_TO_INT, &lp->lan_saa9730_regs->DmaStatus); 665 668 666 669 /* Address next packet */ 667 - if (lp->NextRcvToUseIsA) 668 - BufferIndex = 0; 669 - else 670 - BufferIndex = 1; 670 + BufferIndex = lp->NextRcvBufferIndex; 671 671 PacketIndex = lp->NextRcvPacketIndex; 672 - pPacket = (unsigned int *) lp->RcvBuffer[BufferIndex][PacketIndex]; 672 + pPacket = lp->RcvBuffer[BufferIndex][PacketIndex]; 673 673 rx_status = le32_to_cpu(*pPacket); 674 674 675 675 /* Process each packet. */ ··· 709 715 lp->stats.rx_errors++; 710 716 if (rx_status & 711 717 (RX_STATUS_CRC_ERR << RX_STAT_CTL_STATUS_SHF)) 712 - lp->stats.rx_crc_errors++; 718 + lp->stats.rx_crc_errors++; 713 719 if (rx_status & 714 - (RX_STATUS_ALIGN_ERR << 715 - RX_STAT_CTL_STATUS_SHF)) lp->stats. 716 - rx_frame_errors++; 720 + (RX_STATUS_ALIGN_ERR << RX_STAT_CTL_STATUS_SHF)) 721 + lp->stats.rx_frame_errors++; 717 722 if (rx_status & 718 723 (RX_STATUS_OVERFLOW << RX_STAT_CTL_STATUS_SHF)) 719 - lp->stats.rx_fifo_errors++; 724 + lp->stats.rx_fifo_errors++; 720 725 if (rx_status & 721 726 (RX_STATUS_LONG_ERR << RX_STAT_CTL_STATUS_SHF)) 722 - lp->stats.rx_length_errors++; 727 + lp->stats.rx_length_errors++; 723 728 } 724 729 725 730 /* Indicate we have processed the buffer. */ 726 - *pPacket = 727 - cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF); 731 + *pPacket = cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF); 732 + 733 + /* Make sure A or B is available to hardware as appropriate. */ 734 + outl(BufferIndex ? OK2USE_RX_B : OK2USE_RX_A, 735 + &lp->lan_saa9730_regs->Ok2Use); 728 736 729 737 /* Go to next packet in sequence. */ 730 738 lp->NextRcvPacketIndex++; 731 739 if (lp->NextRcvPacketIndex >= LAN_SAA9730_RCV_Q_SIZE) { 732 740 lp->NextRcvPacketIndex = 0; 733 - if (BufferIndex) { 734 - lp->NextRcvToUseIsA = 1; 735 - } else { 736 - lp->NextRcvToUseIsA = 0; 737 - } 741 + lp->NextRcvBufferIndex ^= 1; 738 742 } 739 - OUTL(OK2USE_RX_A | OK2USE_RX_B, 740 - &lp->lan_saa9730_regs->Ok2Use); 741 743 742 744 /* Address next packet */ 743 - if (lp->NextRcvToUseIsA) 744 - BufferIndex = 0; 745 - else 746 - BufferIndex = 1; 745 + BufferIndex = lp->NextRcvBufferIndex; 747 746 PacketIndex = lp->NextRcvPacketIndex; 748 - pPacket = 749 - (unsigned int *) lp-> 750 - RcvBuffer[BufferIndex][PacketIndex]; 747 + pPacket = lp->RcvBuffer[BufferIndex][PacketIndex]; 751 748 rx_status = le32_to_cpu(*pPacket); 752 749 } 753 - 754 - /* Make sure A and B are available to hardware. */ 755 - OUTL(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use); 756 750 757 751 return 0; 758 752 } ··· 749 767 struct pt_regs *regs) 750 768 { 751 769 struct net_device *dev = (struct net_device *) dev_id; 752 - struct lan_saa9730_private *lp = 753 - (struct lan_saa9730_private *) dev->priv; 770 + struct lan_saa9730_private *lp = netdev_priv(dev); 754 771 755 772 if (lan_saa9730_debug > 5) 756 773 printk("lan_saa9730_interrupt\n"); ··· 761 780 evm_saa9730_clear_lan_int(lp); 762 781 763 782 /* Service pending transmit interrupts. */ 764 - if (INL(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT) 783 + if (readl(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT) 765 784 lan_saa9730_tx(dev); 766 785 767 786 /* Service pending receive interrupts. */ 768 - if (INL(&lp->lan_saa9730_regs->DmaStatus) & 787 + if (readl(&lp->lan_saa9730_regs->DmaStatus) & 769 788 (DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 770 789 DMA_STATUS_RX_TO_INT)) lan_saa9730_rx(dev); 771 790 ··· 775 794 return IRQ_HANDLED; 776 795 } 777 796 778 - static int lan_saa9730_open_fail(struct net_device *dev) 779 - { 780 - return -ENODEV; 781 - } 782 - 783 797 static int lan_saa9730_open(struct net_device *dev) 784 798 { 785 - struct lan_saa9730_private *lp = 786 - (struct lan_saa9730_private *) dev->priv; 799 + struct lan_saa9730_private *lp = netdev_priv(dev); 787 800 788 801 /* Associate IRQ with lan_saa9730_interrupt */ 789 802 if (request_irq(dev->irq, &lan_saa9730_interrupt, 0, "SAA9730 Eth", ··· 809 834 int PacketIndex; 810 835 811 836 if (lan_saa9730_debug > 5) 812 - printk("lan_saa9730_write: skb=%08x\n", 813 - (unsigned int) skb); 837 + printk("lan_saa9730_write: skb=%p\n", skb); 814 838 815 839 BufferIndex = lp->NextTxmBufferIndex; 816 840 PacketIndex = lp->NextTxmPacketIndex; 817 841 818 - tx_status = 819 - le32_to_cpu(*(unsigned int *) lp-> 820 - TxmBuffer[BufferIndex][PacketIndex]); 842 + tx_status = le32_to_cpu(*(unsigned int *)lp->TxmBuffer[BufferIndex] 843 + [PacketIndex]); 821 844 if ((tx_status & TX_STAT_CTL_OWNER_MSK) != 822 845 (TXSF_EMPTY << TX_STAT_CTL_OWNER_SHF)) { 823 846 if (lan_saa9730_debug > 4) ··· 831 858 lp->NextTxmBufferIndex ^= 1; 832 859 } 833 860 834 - pbPacketData = 835 - (unsigned char *) lp->TxmBuffer[BufferIndex][PacketIndex]; 861 + pbPacketData = lp->TxmBuffer[BufferIndex][PacketIndex]; 836 862 pbPacketData += 4; 837 863 838 864 /* copy the bits */ 839 865 memcpy(pbPacketData, pbData, len); 840 866 841 867 /* Set transmit status for hardware */ 842 - *(unsigned int *) lp->TxmBuffer[BufferIndex][PacketIndex] = 843 - cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) | 844 - (TX_STAT_CTL_INT_AFTER_TX << TX_STAT_CTL_FRAME_SHF) 845 - | (len << TX_STAT_CTL_LENGTH_SHF)); 868 + *(unsigned int *)lp->TxmBuffer[BufferIndex][PacketIndex] = 869 + cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) | 870 + (TX_STAT_CTL_INT_AFTER_TX << 871 + TX_STAT_CTL_FRAME_SHF) | 872 + (len << TX_STAT_CTL_LENGTH_SHF)); 846 873 847 - /* Set hardware tx buffer. */ 848 - OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use); 874 + /* Make sure A or B is available to hardware as appropriate. */ 875 + outl(BufferIndex ? OK2USE_TX_B : OK2USE_TX_A, 876 + &lp->lan_saa9730_regs->Ok2Use); 849 877 850 878 return 0; 851 879 } 852 880 853 881 static void lan_saa9730_tx_timeout(struct net_device *dev) 854 882 { 855 - struct lan_saa9730_private *lp = 856 - (struct lan_saa9730_private *) dev->priv; 883 + struct lan_saa9730_private *lp = netdev_priv(dev); 857 884 858 885 /* Transmitter timeout, serious problems */ 859 886 lp->stats.tx_errors++; ··· 862 889 lan_saa9730_restart(lp); 863 890 864 891 dev->trans_start = jiffies; 865 - netif_start_queue(dev); 892 + netif_wake_queue(dev); 866 893 } 867 894 868 895 static int lan_saa9730_start_xmit(struct sk_buff *skb, 869 896 struct net_device *dev) 870 897 { 871 - struct lan_saa9730_private *lp = 872 - (struct lan_saa9730_private *) dev->priv; 898 + struct lan_saa9730_private *lp = netdev_priv(dev); 873 899 unsigned long flags; 874 900 int skblen; 875 901 int len; 876 902 877 903 if (lan_saa9730_debug > 4) 878 - printk("Send packet: skb=%08x\n", (unsigned int) skb); 904 + printk("Send packet: skb=%p\n", skb); 879 905 880 906 skblen = skb->len; 881 907 ··· 884 912 885 913 if (lan_saa9730_write(lp, skb, skblen)) { 886 914 spin_unlock_irqrestore(&lp->lock, flags); 887 - printk("Error when writing packet to controller: skb=%08x\n", 888 - (unsigned int) skb); 915 + printk("Error when writing packet to controller: skb=%p\n", skb); 889 916 netif_stop_queue(dev); 890 917 return -1; 891 918 } ··· 893 922 lp->stats.tx_packets++; 894 923 895 924 dev->trans_start = jiffies; 896 - netif_start_queue(dev); 925 + netif_wake_queue(dev); 897 926 dev_kfree_skb(skb); 898 927 899 928 spin_unlock_irqrestore(&lp->lock, flags); ··· 903 932 904 933 static int lan_saa9730_close(struct net_device *dev) 905 934 { 906 - struct lan_saa9730_private *lp = 907 - (struct lan_saa9730_private *) dev->priv; 935 + struct lan_saa9730_private *lp = netdev_priv(dev); 908 936 909 937 if (lan_saa9730_debug > 1) 910 938 printk("lan_saa9730_close:\n"); ··· 925 955 static struct net_device_stats *lan_saa9730_get_stats(struct net_device 926 956 *dev) 927 957 { 928 - struct lan_saa9730_private *lp = 929 - (struct lan_saa9730_private *) dev->priv; 958 + struct lan_saa9730_private *lp = netdev_priv(dev); 930 959 931 960 return &lp->stats; 932 961 } 933 962 934 963 static void lan_saa9730_set_multicast(struct net_device *dev) 935 964 { 936 - struct lan_saa9730_private *lp = 937 - (struct lan_saa9730_private *) dev->priv; 965 + struct lan_saa9730_private *lp = netdev_priv(dev); 938 966 939 967 /* Stop the controller */ 940 968 lan_saa9730_stop(lp); 941 969 942 970 if (dev->flags & IFF_PROMISC) { 943 971 /* accept all packets */ 944 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC | 972 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC | 945 973 CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC, 946 974 &lp->lan_saa9730_regs->CamCtl); 947 975 } else { 948 976 if (dev->flags & IFF_ALLMULTI) { 949 977 /* accept all multicast packets */ 950 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC | 978 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC | 951 979 CAM_CONTROL_BROAD_ACC, 952 980 &lp->lan_saa9730_regs->CamCtl); 953 981 } else { 954 - /* 982 + /* 955 983 * Will handle the multicast stuff later. -carstenl 956 984 */ 957 985 } ··· 961 993 962 994 static void __devexit saa9730_remove_one(struct pci_dev *pdev) 963 995 { 964 - struct net_device *dev = pci_get_drvdata(pdev); 996 + struct net_device *dev = pci_get_drvdata(pdev); 997 + struct lan_saa9730_private *lp = netdev_priv(dev); 965 998 966 - if (dev) { 967 - unregister_netdev(dev); 968 - kfree(dev->priv); 969 - free_netdev(dev); 970 - pci_release_regions(pdev); 971 - pci_disable_device(pdev); 972 - pci_set_drvdata(pdev, NULL); 973 - } 999 + if (dev) { 1000 + unregister_netdev(dev); 1001 + lan_saa9730_free_buffers(pdev, lp); 1002 + iounmap(lp->lan_saa9730_regs); 1003 + iounmap(lp->evm_saa9730_regs); 1004 + free_netdev(dev); 1005 + pci_release_regions(pdev); 1006 + pci_disable_device(pdev); 1007 + pci_set_drvdata(pdev, NULL); 1008 + } 974 1009 } 975 1010 976 1011 977 - static int lan_saa9730_init(struct net_device *dev, int ioaddr, int irq) 1012 + static int lan_saa9730_init(struct net_device *dev, struct pci_dev *pdev, 1013 + unsigned long ioaddr, int irq) 978 1014 { 979 - struct lan_saa9730_private *lp; 1015 + struct lan_saa9730_private *lp = netdev_priv(dev); 980 1016 unsigned char ethernet_addr[6]; 981 - int ret = 0; 1017 + int ret; 982 1018 983 - dev->open = lan_saa9730_open_fail; 1019 + if (get_ethernet_addr(ethernet_addr)) { 1020 + ret = -ENODEV; 1021 + goto out; 1022 + } 984 1023 985 - if (get_ethernet_addr(ethernet_addr)) 986 - return -ENODEV; 987 - 988 1024 memcpy(dev->dev_addr, ethernet_addr, 6); 989 1025 dev->base_addr = ioaddr; 990 1026 dev->irq = irq; 991 - 992 - /* 993 - * Make certain the data structures used by the controller are aligned 994 - * and DMAble. 995 - */ 996 - /* 997 - * XXX: that is obviously broken - kfree() won't be happy with us. 998 - */ 999 - lp = (struct lan_saa9730_private *) (((unsigned long) 1000 - kmalloc(sizeof(*lp) + 7, 1001 - GFP_DMA | GFP_KERNEL) 1002 - + 7) & ~7); 1003 1027 1004 - if (!lp) 1005 - return -ENOMEM; 1006 - 1007 - dev->priv = lp; 1008 - memset(lp, 0, sizeof(*lp)); 1028 + lp->pci_dev = pdev; 1009 1029 1010 1030 /* Set SAA9730 LAN base address. */ 1011 - lp->lan_saa9730_regs = (t_lan_saa9730_regmap *) (ioaddr + 1012 - SAA9730_LAN_REGS_ADDR); 1031 + lp->lan_saa9730_regs = ioremap(ioaddr + SAA9730_LAN_REGS_ADDR, 1032 + SAA9730_LAN_REGS_SIZE); 1033 + if (!lp->lan_saa9730_regs) { 1034 + ret = -ENOMEM; 1035 + goto out; 1036 + } 1013 1037 1014 1038 /* Set SAA9730 EVM base address. */ 1015 - lp->evm_saa9730_regs = (t_evm_saa9730_regmap *) (ioaddr + 1016 - SAA9730_EVM_REGS_ADDR); 1039 + lp->evm_saa9730_regs = ioremap(ioaddr + SAA9730_EVM_REGS_ADDR, 1040 + SAA9730_EVM_REGS_SIZE); 1041 + if (!lp->evm_saa9730_regs) { 1042 + ret = -ENOMEM; 1043 + goto out_iounmap_lan; 1044 + } 1017 1045 1018 1046 /* Allocate LAN RX/TX frame buffer space. */ 1019 - /* FIXME: a leak */ 1020 - if ((ret = lan_saa9730_allocate_buffers(lp))) 1021 - goto out; 1047 + if ((ret = lan_saa9730_allocate_buffers(pdev, lp))) 1048 + goto out_iounmap; 1022 1049 1023 1050 /* Stop LAN controller. */ 1024 - if ((ret = lan_saa9730_stop(lp))) 1025 - goto out; 1026 - 1051 + if ((ret = lan_saa9730_stop(lp))) 1052 + goto out_free_consistent; 1053 + 1027 1054 /* Initialize CAM registers. */ 1028 1055 if ((ret = lan_saa9730_cam_init(dev))) 1029 - goto out; 1056 + goto out_free_consistent; 1030 1057 1031 1058 /* Initialize MII registers. */ 1032 1059 if ((ret = lan_saa9730_mii_init(lp))) 1033 - goto out; 1060 + goto out_free_consistent; 1034 1061 1035 1062 /* Initialize control registers. */ 1036 - if ((ret = lan_saa9730_control_init(lp))) 1037 - goto out; 1038 - 1063 + if ((ret = lan_saa9730_control_init(lp))) 1064 + goto out_free_consistent; 1065 + 1039 1066 /* Load CAM registers. */ 1040 - if ((ret = lan_saa9730_cam_load(lp))) 1041 - goto out; 1042 - 1067 + if ((ret = lan_saa9730_cam_load(lp))) 1068 + goto out_free_consistent; 1069 + 1043 1070 /* Initialize DMA context registers. */ 1044 1071 if ((ret = lan_saa9730_dma_init(lp))) 1045 - goto out; 1046 - 1072 + goto out_free_consistent; 1073 + 1047 1074 spin_lock_init(&lp->lock); 1048 - 1075 + 1049 1076 dev->open = lan_saa9730_open; 1050 1077 dev->hard_start_xmit = lan_saa9730_start_xmit; 1051 1078 dev->stop = lan_saa9730_close; ··· 1049 1086 dev->tx_timeout = lan_saa9730_tx_timeout; 1050 1087 dev->watchdog_timeo = (HZ >> 1); 1051 1088 dev->dma = 0; 1052 - 1053 - ret = register_netdev(dev); 1089 + 1090 + ret = register_netdev (dev); 1054 1091 if (ret) 1055 - goto out; 1092 + goto out_free_consistent; 1093 + 1056 1094 return 0; 1057 1095 1058 - out: 1059 - kfree(dev->priv); 1096 + out_free_consistent: 1097 + lan_saa9730_free_buffers(pdev, lp); 1098 + out_iounmap: 1099 + iounmap(lp->evm_saa9730_regs); 1100 + out_iounmap_lan: 1101 + iounmap(lp->lan_saa9730_regs); 1102 + out: 1060 1103 return ret; 1061 1104 } 1062 1105 1063 1106 1064 1107 static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 1065 1108 { 1066 - struct net_device *dev; 1067 - unsigned int pci_ioaddr; 1109 + struct net_device *dev = NULL; 1110 + unsigned long pci_ioaddr; 1068 1111 int err; 1069 1112 1070 1113 if (lan_saa9730_debug > 1) 1071 1114 printk("saa9730.c: PCI bios is present, checking for devices...\n"); 1072 1115 1073 - err = -ENOMEM; 1074 - dev = alloc_etherdev(0); 1075 - if (!dev) 1076 - goto out; 1077 - 1078 - SET_MODULE_OWNER(dev); 1079 - 1080 1116 err = pci_enable_device(pdev); 1081 - if (err) { 1082 - printk(KERN_ERR "Cannot enable PCI device, aborting.\n"); 1083 - goto out1; 1084 - } 1117 + if (err) { 1118 + printk(KERN_ERR "Cannot enable PCI device, aborting.\n"); 1119 + goto out; 1120 + } 1085 1121 1086 1122 err = pci_request_regions(pdev, DRV_MODULE_NAME); 1087 1123 if (err) { 1088 1124 printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n"); 1089 - goto out2; 1125 + goto out_disable_pdev; 1090 1126 } 1091 1127 1092 1128 pci_irq_line = pdev->irq; ··· 1094 1132 pci_ioaddr = pci_resource_start(pdev, 1); 1095 1133 pci_set_master(pdev); 1096 1134 1097 - printk("Found SAA9730 (PCI) at %#x, irq %d.\n", 1135 + printk("Found SAA9730 (PCI) at %lx, irq %d.\n", 1098 1136 pci_ioaddr, pci_irq_line); 1099 1137 1100 - err = lan_saa9730_init(dev, pci_ioaddr, pci_irq_line); 1138 + dev = alloc_etherdev(sizeof(struct lan_saa9730_private)); 1139 + if (!dev) 1140 + goto out_disable_pdev; 1141 + 1142 + err = lan_saa9730_init(dev, pdev, pci_ioaddr, pci_irq_line); 1101 1143 if (err) { 1102 - printk("Lan init failed"); 1103 - goto out2; 1144 + printk("LAN init failed"); 1145 + goto out_free_netdev; 1104 1146 } 1105 1147 1106 1148 pci_set_drvdata(pdev, dev); 1107 1149 SET_NETDEV_DEV(dev, &pdev->dev); 1108 1150 return 0; 1109 - 1110 - out2: 1111 - pci_disable_device(pdev); 1112 - out1: 1151 + 1152 + out_free_netdev: 1113 1153 free_netdev(dev); 1154 + out_disable_pdev: 1155 + pci_disable_device(pdev); 1114 1156 out: 1157 + pci_set_drvdata(pdev, NULL); 1115 1158 return err; 1116 1159 } 1117 1160 1118 1161 1119 1162 static struct pci_driver saa9730_driver = { 1120 - .name = DRV_MODULE_NAME, 1121 - .id_table = saa9730_pci_tbl, 1122 - .probe = saa9730_init_one, 1123 - .remove = __devexit_p(saa9730_remove_one), 1163 + .name = DRV_MODULE_NAME, 1164 + .id_table = saa9730_pci_tbl, 1165 + .probe = saa9730_init_one, 1166 + .remove = __devexit_p(saa9730_remove_one), 1124 1167 }; 1125 1168 1126 1169 1127 1170 static int __init saa9730_init(void) 1128 1171 { 1129 - return pci_module_init(&saa9730_driver); 1172 + return pci_module_init(&saa9730_driver); 1130 1173 } 1131 1174 1132 1175 static void __exit saa9730_cleanup(void) 1133 1176 { 1134 - pci_unregister_driver(&saa9730_driver); 1177 + pci_unregister_driver(&saa9730_driver); 1135 1178 } 1136 1179 1137 1180 module_init(saa9730_init); 1138 1181 module_exit(saa9730_cleanup); 1139 1182 1140 - 1141 - 1183 + MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>"); 1184 + MODULE_DESCRIPTION("Philips SAA9730 ethernet driver"); 1142 1185 MODULE_LICENSE("GPL");
+32
drivers/net/smc91x.h
··· 289 289 #define RPC_LSA_DEFAULT RPC_LED_TX_RX 290 290 #define RPC_LSB_DEFAULT RPC_LED_100_10 291 291 292 + #elif defined(CONFIG_SOC_AU1X00) 293 + 294 + #include <au1xxx.h> 295 + 296 + /* We can only do 16-bit reads and writes in the static memory space. */ 297 + #define SMC_CAN_USE_8BIT 0 298 + #define SMC_CAN_USE_16BIT 1 299 + #define SMC_CAN_USE_32BIT 0 300 + #define SMC_IO_SHIFT 0 301 + #define SMC_NOWAIT 1 302 + 303 + #define SMC_inw(a, r) au_readw((unsigned long)((a) + (r))) 304 + #define SMC_insw(a, r, p, l) \ 305 + do { \ 306 + unsigned long _a = (unsigned long)((a) + (r)); \ 307 + int _l = (l); \ 308 + u16 *_p = (u16 *)(p); \ 309 + while (_l-- > 0) \ 310 + *_p++ = au_readw(_a); \ 311 + } while(0) 312 + #define SMC_outw(v, a, r) au_writew(v, (unsigned long)((a) + (r))) 313 + #define SMC_outsw(a, r, p, l) \ 314 + do { \ 315 + unsigned long _a = (unsigned long)((a) + (r)); \ 316 + int _l = (l); \ 317 + const u16 *_p = (const u16 *)(p); \ 318 + while (_l-- > 0) \ 319 + au_writew(*_p++ , _a); \ 320 + } while(0) 321 + 322 + #define set_irq_type(irq, type) do {} while (0) 323 + 292 324 #else 293 325 294 326 #define SMC_CAN_USE_8BIT 1
+1 -1
drivers/net/wireless/Kconfig
··· 330 330 331 331 config ATMEL 332 332 tristate "Atmel at76c50x chipset 802.11b support" 333 - depends on NET_RADIO && EXPERIMENTAL 333 + depends on NET_RADIO 334 334 select FW_LOADER 335 335 select CRC32 336 336 ---help---
+43 -45
drivers/net/wireless/atmel.c
··· 72 72 #include "atmel.h" 73 73 74 74 #define DRIVER_MAJOR 0 75 - #define DRIVER_MINOR 96 75 + #define DRIVER_MINOR 98 76 76 77 77 MODULE_AUTHOR("Simon Kelley"); 78 78 MODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards."); ··· 1504 1504 return len; 1505 1505 } 1506 1506 1507 - struct net_device *init_atmel_card( unsigned short irq, int port, const AtmelFWType fw_type, 1507 + struct net_device *init_atmel_card( unsigned short irq, unsigned long port, const AtmelFWType fw_type, 1508 1508 struct device *sys_dev, int (*card_present)(void *), void *card) 1509 1509 { 1510 1510 struct net_device *dev; ··· 1605 1605 goto err_out_free; 1606 1606 } 1607 1607 1608 - if (priv->bus_type == BUS_TYPE_PCI && 1609 - !request_region( dev->base_addr, 64, dev->name )) { 1608 + if (!request_region(dev->base_addr, 32, 1609 + priv->bus_type == BUS_TYPE_PCCARD ? "atmel_cs" : "atmel_pci")) { 1610 1610 goto err_out_irq; 1611 1611 } 1612 1612 ··· 1622 1622 1623 1623 create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv); 1624 1624 1625 - printk(KERN_INFO "%s: Atmel at76c50x wireless. Version %d.%d simon@thekelleys.org.uk\n", 1626 - dev->name, DRIVER_MAJOR, DRIVER_MINOR); 1625 + printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", 1626 + dev->name, DRIVER_MAJOR, DRIVER_MINOR, 1627 + dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], 1628 + dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] ); 1627 1629 1628 1630 SET_MODULE_OWNER(dev); 1629 1631 return dev; 1630 1632 1631 1633 err_out_res: 1632 - if (priv->bus_type == BUS_TYPE_PCI) 1633 - release_region( dev->base_addr, 64 ); 1634 + release_region( dev->base_addr, 32); 1634 1635 err_out_irq: 1635 1636 free_irq(dev->irq, dev); 1636 1637 err_out_free: ··· 1641 1640 1642 1641 EXPORT_SYMBOL(init_atmel_card); 1643 1642 1644 - void stop_atmel_card(struct net_device *dev, int freeres) 1643 + void stop_atmel_card(struct net_device *dev) 1645 1644 { 1646 1645 struct atmel_private *priv = netdev_priv(dev); 1647 1646 ··· 1655 1654 remove_proc_entry("driver/atmel", NULL); 1656 1655 free_irq(dev->irq, dev); 1657 1656 kfree(priv->firmware); 1658 - if (freeres) { 1659 - /* PCMCIA frees this stuff, so only for PCI */ 1660 - release_region(dev->base_addr, 64); 1661 - } 1657 + release_region(dev->base_addr, 32); 1662 1658 free_netdev(dev); 1663 1659 } 1664 1660 ··· 1808 1810 } 1809 1811 if(dwrq->flags & IW_ENCODE_RESTRICTED) 1810 1812 priv->exclude_unencrypted = 1; 1811 - if(dwrq->flags & IW_ENCODE_OPEN) 1813 + if(dwrq->flags & IW_ENCODE_OPEN) 1812 1814 priv->exclude_unencrypted = 0; 1813 - 1815 + 1814 1816 return -EINPROGRESS; /* Call commit handler */ 1815 1817 } 1816 1818 ··· 1825 1827 1826 1828 if (!priv->wep_is_on) 1827 1829 dwrq->flags = IW_ENCODE_DISABLED; 1828 - else if (priv->exclude_unencrypted) 1829 - dwrq->flags = IW_ENCODE_RESTRICTED; 1830 - else 1831 - dwrq->flags = IW_ENCODE_OPEN; 1832 - 1830 + else { 1831 + if (priv->exclude_unencrypted) 1832 + dwrq->flags = IW_ENCODE_RESTRICTED; 1833 + else 1834 + dwrq->flags = IW_ENCODE_OPEN; 1835 + } 1833 1836 /* Which key do we want ? -1 -> tx index */ 1834 1837 if (index < 0 || index >= 4) 1835 1838 index = priv->default_key; ··· 2644 2645 } 2645 2646 } 2646 2647 2647 - 2648 - static void send_authentication_request(struct atmel_private *priv, u8 *challenge, int challenge_len) 2648 + 2649 + static void send_authentication_request(struct atmel_private *priv, u16 system, u8 *challenge, int challenge_len) 2649 2650 { 2650 2651 struct ieee80211_hdr_4addr header; 2651 2652 struct auth_body auth; ··· 2657 2658 memcpy(header.addr2, priv->dev->dev_addr, 6); 2658 2659 memcpy(header.addr3, priv->CurrentBSSID, 6); 2659 2660 2660 - if (priv->wep_is_on) { 2661 - auth.alg = cpu_to_le16(C80211_MGMT_AAN_SHAREDKEY); 2661 + if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1) 2662 2662 /* no WEP for authentication frames with TrSeqNo 1 */ 2663 - if (priv->CurrentAuthentTransactionSeqNum != 1) 2664 - header.frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 2665 - } else { 2666 - auth.alg = cpu_to_le16(C80211_MGMT_AAN_OPENSYSTEM); 2667 - } 2663 + header.frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 2664 + 2665 + auth.alg = cpu_to_le16(system); 2668 2666 2669 2667 auth.status = 0; 2670 2668 auth.trans_seq = cpu_to_le16(priv->CurrentAuthentTransactionSeqNum); ··· 2830 2834 struct auth_body *auth = (struct auth_body *)priv->rx_buf; 2831 2835 u16 status = le16_to_cpu(auth->status); 2832 2836 u16 trans_seq_no = le16_to_cpu(auth->trans_seq); 2837 + u16 system = le16_to_cpu(auth->alg); 2833 2838 2834 2839 if (status == C80211_MGMT_SC_Success && !priv->wep_is_on) { 2835 2840 /* no WEP */ ··· 2852 2855 2853 2856 if (trans_seq_no == 0x0002 && 2854 2857 auth->el_id == C80211_MGMT_ElementID_ChallengeText) { 2855 - send_authentication_request(priv, auth->chall_text, auth->chall_text_len); 2858 + send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); 2856 2859 return; 2857 2860 } 2858 2861 ··· 2869 2872 } 2870 2873 } 2871 2874 2872 - if (status == C80211_MGMT_SC_AuthAlgNotSupported && priv->connect_to_any_BSS) { 2873 - int bss_index; 2874 - 2875 - priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; 2876 - 2877 - if ((bss_index = retrieve_bss(priv)) != -1) { 2878 - atmel_join_bss(priv, bss_index); 2879 - return; 2875 + if (status == C80211_MGMT_SC_AuthAlgNotSupported) { 2876 + /* Do opensystem first, then try sharedkey */ 2877 + if (system == C80211_MGMT_AAN_OPENSYSTEM) { 2878 + priv->CurrentAuthentTransactionSeqNum = 0x001; 2879 + send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0); 2880 + } else if (priv->connect_to_any_BSS) { 2881 + int bss_index; 2882 + 2883 + priv->BSSinfo[(int)(priv->current_BSS)].channel |= 0x80; 2884 + 2885 + if ((bss_index = retrieve_bss(priv)) != -1) { 2886 + atmel_join_bss(priv, bss_index); 2887 + return; 2888 + } 2880 2889 } 2881 2890 } 2882 2891 ··· 3208 3205 priv->AuthenticationRequestRetryCnt++; 3209 3206 priv->CurrentAuthentTransactionSeqNum = 0x0001; 3210 3207 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); 3211 - send_authentication_request(priv, NULL, 0); 3208 + send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0); 3212 3209 } 3213 3210 3214 3211 break; ··· 3315 3312 3316 3313 mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); 3317 3314 priv->CurrentAuthentTransactionSeqNum = 0x0001; 3318 - send_authentication_request(priv, NULL, 0); 3315 + send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0); 3319 3316 } 3320 3317 return; 3321 3318 } ··· 3485 3482 printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name); 3486 3483 memcpy(dev->dev_addr, default_mac, 6); 3487 3484 } 3488 - printk(KERN_INFO "%s: MAC address %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", 3489 - dev->name, 3490 - dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], 3491 - dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] ); 3492 - 3493 3485 } 3494 3486 3495 3487 return rc;
+2 -2
drivers/net/wireless/atmel.h
··· 35 35 ATMEL_FW_TYPE_506 36 36 } AtmelFWType; 37 37 38 - struct net_device *init_atmel_card(unsigned short, int, const AtmelFWType, struct device *, 38 + struct net_device *init_atmel_card(unsigned short, unsigned long, const AtmelFWType, struct device *, 39 39 int (*present_func)(void *), void * ); 40 - void stop_atmel_card( struct net_device *, int ); 40 + void stop_atmel_card( struct net_device *); 41 41 int atmel_open( struct net_device * ); 42 42 43 43 #endif
+47 -129
drivers/net/wireless/atmel_cs.c
··· 63 63 be present but disabled -- but it can then be enabled for specific 64 64 modules at load time with a 'pc_debug=#' option to insmod. 65 65 */ 66 + 66 67 #ifdef PCMCIA_DEBUG 67 68 static int pc_debug = PCMCIA_DEBUG; 68 69 module_param(pc_debug, int, 0); ··· 286 285 return 0; 287 286 } 288 287 289 - /* list of cards we know about and their firmware requirements. 290 - Go either by Manfid or version strings. 291 - Cards not in this list will need a firmware parameter to the module 292 - in all probability. Note that the SMC 2632 V2 and V3 have the same 293 - manfids, so we ignore those and use the version1 strings. */ 294 - 295 - static struct { 296 - int manf, card; 297 - char *ver1; 298 - AtmelFWType firmware; 299 - char *name; 300 - } card_table[] = { 301 - { 0, 0, "WLAN/802.11b PC CARD", ATMEL_FW_TYPE_502D, "Actiontec 802CAT1" }, 302 - { 0, 0, "ATMEL/AT76C502AR", ATMEL_FW_TYPE_502, "NoName-RFMD" }, 303 - { 0, 0, "ATMEL/AT76C502AR_D", ATMEL_FW_TYPE_502D, "NoName-revD" }, 304 - { 0, 0, "ATMEL/AT76C502AR_E", ATMEL_FW_TYPE_502E, "NoName-revE" }, 305 - { 0, 0, "ATMEL/AT76C504", ATMEL_FW_TYPE_504, "NoName-504" }, 306 - { 0, 0, "ATMEL/AT76C504A", ATMEL_FW_TYPE_504A_2958, "NoName-504a-2958" }, 307 - { 0, 0, "ATMEL/AT76C504_R", ATMEL_FW_TYPE_504_2958, "NoName-504-2958" }, 308 - { MANFID_3COM, 0x0620, NULL, ATMEL_FW_TYPE_502_3COM, "3com 3CRWE62092B" }, 309 - { MANFID_3COM, 0x0696, NULL, ATMEL_FW_TYPE_502_3COM, "3com 3CRSHPW196" }, 310 - { 0, 0, "SMC/2632W-V2", ATMEL_FW_TYPE_502, "SMC 2632W-V2" }, 311 - { 0, 0, "SMC/2632W", ATMEL_FW_TYPE_502D, "SMC 2632W-V3" }, 312 - { 0xd601, 0x0007, NULL, ATMEL_FW_TYPE_502, "Sitecom WLAN-011" }, 313 - { 0x01bf, 0x3302, NULL, ATMEL_FW_TYPE_502E, "Belkin F5D6020-V2" }, 314 - { 0, 0, "BT/Voyager 1020 Laptop Adapter", ATMEL_FW_TYPE_502, "BT Voyager 1020" }, 315 - { 0, 0, "IEEE 802.11b/Wireless LAN PC Card", ATMEL_FW_TYPE_502, "Siemens Gigaset PC Card II" }, 316 - { 0, 0, "IEEE 802.11b/Wireless LAN Card S", ATMEL_FW_TYPE_504_2958, "Siemens Gigaset PC Card II" }, 317 - { 0, 0, "CNet/CNWLC 11Mbps Wireless PC Card V-5", ATMEL_FW_TYPE_502E, "CNet CNWLC-811ARL" }, 318 - { 0, 0, "Wireless/PC_CARD", ATMEL_FW_TYPE_502D, "Planet WL-3552" }, 319 - { 0, 0, "OEM/11Mbps Wireless LAN PC Card V-3", ATMEL_FW_TYPE_502, "OEM 11Mbps WLAN PCMCIA Card" }, 320 - { 0, 0, "11WAVE/11WP611AL-E", ATMEL_FW_TYPE_502E, "11WAVE WaveBuddy" }, 321 - { 0, 0, "LG/LW2100N", ATMEL_FW_TYPE_502E, "LG LW2100N 11Mbps WLAN PCMCIA Card" }, 322 - }; 323 - 324 288 static void atmel_config(dev_link_t *link) 325 289 { 326 290 client_handle_t handle; ··· 294 328 local_info_t *dev; 295 329 int last_fn, last_ret; 296 330 u_char buf[64]; 297 - int card_index = -1, done = 0; 298 - 331 + struct pcmcia_device_id *did; 332 + 299 333 handle = link->handle; 300 334 dev = link->priv; 335 + did = handle_to_dev(handle).driver_data; 301 336 302 337 DEBUG(0, "atmel_config(0x%p)\n", link); 303 338 ··· 307 340 tuple.TupleDataMax = sizeof(buf); 308 341 tuple.TupleOffset = 0; 309 342 310 - tuple.DesiredTuple = CISTPL_MANFID; 311 - if (pcmcia_get_first_tuple(handle, &tuple) == 0) { 312 - int i; 313 - cistpl_manfid_t *manfid; 314 - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); 315 - CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); 316 - manfid = &(parse.manfid); 317 - for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) { 318 - if (!card_table[i].ver1 && 319 - manfid->manf == card_table[i].manf && 320 - manfid->card == card_table[i].card) { 321 - card_index = i; 322 - done = 1; 323 - } 324 - } 325 - } 326 - 327 - tuple.DesiredTuple = CISTPL_VERS_1; 328 - if (!done && (pcmcia_get_first_tuple(handle, &tuple) == 0)) { 329 - int i, j, k; 330 - cistpl_vers_1_t *ver1; 331 - CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); 332 - CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); 333 - ver1 = &(parse.version_1); 334 - 335 - for (i = 0; i < sizeof(card_table)/sizeof(card_table[0]); i++) { 336 - for (j = 0; j < ver1->ns; j++) { 337 - char *p = card_table[i].ver1; 338 - char *q = &ver1->str[ver1->ofs[j]]; 339 - if (!p) 340 - goto mismatch; 341 - for (k = 0; k < j; k++) { 342 - while ((*p != '\0') && (*p != '/')) p++; 343 - if (*p == '\0') { 344 - if (*q != '\0') 345 - goto mismatch; 346 - } else { 347 - p++; 348 - } 349 - } 350 - while((*q != '\0') && (*p != '\0') && 351 - (*p != '/') && (*p == *q)) p++, q++; 352 - if (((*p != '\0') && *p != '/') || *q != '\0') 353 - goto mismatch; 354 - } 355 - card_index = i; 356 - break; /* done */ 357 - 358 - mismatch: 359 - j = 0; /* dummy stmt to shut up compiler */ 360 - } 361 - } 362 - 363 343 /* 364 344 This reads the card's CONFIG tuple to find its configuration 365 345 registers. ··· 423 509 ((local_info_t*)link->priv)->eth_dev = 424 510 init_atmel_card(link->irq.AssignedIRQ, 425 511 link->io.BasePort1, 426 - card_index == -1 ? ATMEL_FW_TYPE_NONE : card_table[card_index].firmware, 512 + did ? did->driver_info : ATMEL_FW_TYPE_NONE, 427 513 &handle_to_dev(handle), 428 514 card_present, 429 515 link); 430 516 if (!((local_info_t*)link->priv)->eth_dev) 431 - goto cs_failed; 517 + goto cs_failed; 518 + 432 519 433 520 /* 434 521 At this point, the dev_node_t structure(s) need to be ··· 438 523 strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name ); 439 524 dev->node.major = dev->node.minor = 0; 440 525 link->dev = &dev->node; 441 - 442 - /* Finally, report what we've done */ 443 - printk(KERN_INFO "%s: %s%sindex 0x%02x: Vcc %d.%d", 444 - dev->node.dev_name, 445 - card_index == -1 ? "" : card_table[card_index].name, 446 - card_index == -1 ? "" : " ", 447 - link->conf.ConfigIndex, 448 - link->conf.Vcc/10, link->conf.Vcc%10); 449 - if (link->conf.Vpp1) 450 - printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10); 451 - if (link->conf.Attributes & CONF_ENABLE_IRQ) 452 - printk(", irq %d", link->irq.AssignedIRQ); 453 - if (link->io.NumPorts1) 454 - printk(", io 0x%04x-0x%04x", link->io.BasePort1, 455 - link->io.BasePort1+link->io.NumPorts1-1); 456 - if (link->io.NumPorts2) 457 - printk(" & 0x%04x-0x%04x", link->io.BasePort2, 458 - link->io.BasePort2+link->io.NumPorts2-1); 459 - printk("\n"); 460 - 526 + 461 527 link->state &= ~DEV_CONFIG_PENDING; 462 528 return; 463 529 ··· 465 569 link->dev = NULL; 466 570 467 571 if (dev) 468 - stop_atmel_card(dev, 0); 572 + stop_atmel_card(dev); 469 573 ((local_info_t*)link->priv)->eth_dev = NULL; 470 574 471 575 /* Don't bother checking to see if these succeed or not */ ··· 533 637 } /* atmel_event */ 534 638 535 639 /*====================================================================*/ 640 + /* We use the driver_info field to store the correct firmware type for a card. */ 641 + 642 + #define PCMCIA_DEVICE_MANF_CARD_INFO(manf, card, info) { \ 643 + .match_flags = PCMCIA_DEV_ID_MATCH_MANF_ID| \ 644 + PCMCIA_DEV_ID_MATCH_CARD_ID, \ 645 + .manf_id = (manf), \ 646 + .card_id = (card), \ 647 + .driver_info = (kernel_ulong_t)(info), } 648 + 649 + #define PCMCIA_DEVICE_PROD_ID12_INFO(v1, v2, vh1, vh2, info) { \ 650 + .match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID1| \ 651 + PCMCIA_DEV_ID_MATCH_PROD_ID2, \ 652 + .prod_id = { (v1), (v2), NULL, NULL }, \ 653 + .prod_id_hash = { (vh1), (vh2), 0, 0 }, \ 654 + .driver_info = (kernel_ulong_t)(info), } 655 + 536 656 static struct pcmcia_device_id atmel_ids[] = { 537 - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0620), 538 - PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0696), 539 - PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x3302), 540 - PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0007), 541 - PCMCIA_DEVICE_PROD_ID12("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9), 542 - PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f), 543 - PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C504", 0xabda4164, 0x5040670a), 544 - PCMCIA_DEVICE_PROD_ID12("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f), 545 - PCMCIA_DEVICE_PROD_ID12("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5), 546 - PCMCIA_DEVICE_PROD_ID12("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b), 547 - PCMCIA_DEVICE_PROD_ID12("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6), 548 - PCMCIA_DEVICE_PROD_ID12("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68), 549 - PCMCIA_DEVICE_PROD_ID12("SMC", "2632W", 0xc4f8b18b, 0x30f38774), 550 - PCMCIA_DEVICE_PROD_ID12("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377), 551 - PCMCIA_DEVICE_PROD_ID12("Wireless", "PC", 0xa407ecdd, 0x556e4d7e), 552 - PCMCIA_DEVICE_PROD_ID12("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4), 657 + PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0620, ATMEL_FW_TYPE_502_3COM), 658 + PCMCIA_DEVICE_MANF_CARD_INFO(0x0101, 0x0696, ATMEL_FW_TYPE_502_3COM), 659 + PCMCIA_DEVICE_MANF_CARD_INFO(0x01bf, 0x3302, ATMEL_FW_TYPE_502E), 660 + PCMCIA_DEVICE_MANF_CARD_INFO(0xd601, 0x0007, ATMEL_FW_TYPE_502), 661 + PCMCIA_DEVICE_PROD_ID12_INFO("11WAVE", "11WP611AL-E", 0x9eb2da1f, 0xc9a0d3f9, ATMEL_FW_TYPE_502E), 662 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR", 0xabda4164, 0x41b37e1f, ATMEL_FW_TYPE_502), 663 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_D", 0xabda4164, 0x3675d704, ATMEL_FW_TYPE_502D), 664 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C502AR_E", 0xabda4164, 0x4172e792, ATMEL_FW_TYPE_502E), 665 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504_R", 0xabda4164, 0x917f3d72, ATMEL_FW_TYPE_504_2958), 666 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504", 0xabda4164, 0x5040670a, ATMEL_FW_TYPE_504), 667 + PCMCIA_DEVICE_PROD_ID12_INFO("ATMEL", "AT76C504A", 0xabda4164, 0xe15ed87f, ATMEL_FW_TYPE_504A_2958), 668 + PCMCIA_DEVICE_PROD_ID12_INFO("BT", "Voyager 1020 Laptop Adapter", 0xae49b86a, 0x1e957cd5, ATMEL_FW_TYPE_502), 669 + PCMCIA_DEVICE_PROD_ID12_INFO("CNet", "CNWLC 11Mbps Wireless PC Card V-5", 0xbc477dde, 0x502fae6b, ATMEL_FW_TYPE_502E), 670 + PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN PC Card", 0x5b878724, 0x122f1df6, ATMEL_FW_TYPE_502), 671 + PCMCIA_DEVICE_PROD_ID12_INFO("IEEE 802.11b", "Wireless LAN Card S", 0x5b878724, 0x5fba533a, ATMEL_FW_TYPE_504_2958), 672 + PCMCIA_DEVICE_PROD_ID12_INFO("OEM", "11Mbps Wireless LAN PC Card V-3", 0xfea54c90, 0x1c5b0f68, ATMEL_FW_TYPE_502), 673 + PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W", 0xc4f8b18b, 0x30f38774, ATMEL_FW_TYPE_502D), 674 + PCMCIA_DEVICE_PROD_ID12_INFO("SMC", "2632W-V2", 0xc4f8b18b, 0x172d1377, ATMEL_FW_TYPE_502), 675 + PCMCIA_DEVICE_PROD_ID12_INFO("Wireless", "PC_CARD", 0xa407ecdd, 0x119f6314, ATMEL_FW_TYPE_502D), 676 + PCMCIA_DEVICE_PROD_ID12_INFO("WLAN", "802.11b PC CARD", 0x575c516c, 0xb1f6dbc4, ATMEL_FW_TYPE_502D), 677 + PCMCIA_DEVICE_PROD_ID12_INFO("LG", "LW2100N", 0xb474d43a, 0x6b1fec94, ATMEL_FW_TYPE_502E), 553 678 PCMCIA_DEVICE_NULL 554 679 }; 680 + 555 681 MODULE_DEVICE_TABLE(pcmcia, atmel_ids); 556 682 557 683 static struct pcmcia_driver atmel_driver = {
+1 -1
drivers/net/wireless/atmel_pci.c
··· 72 72 73 73 static void __devexit atmel_pci_remove(struct pci_dev *pdev) 74 74 { 75 - stop_atmel_card(pci_get_drvdata(pdev), 1); 75 + stop_atmel_card(pci_get_drvdata(pdev)); 76 76 } 77 77 78 78 static int __init atmel_init_module(void)
+2 -2
drivers/s390/net/lcs.c
··· 8 8 * Author(s): Original Code written by 9 9 * DJ Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com) 10 10 * Rewritten by 11 - * Frank Pavlic (pavlic@de.ibm.com) and 11 + * Frank Pavlic (fpavlic@de.ibm.com) and 12 12 * Martin Schwidefsky <schwidefsky@de.ibm.com> 13 13 * 14 14 * $Revision: 1.99 $ $Date: 2005/05/11 08:10:17 $ ··· 2342 2342 module_init(lcs_init_module); 2343 2343 module_exit(lcs_cleanup_module); 2344 2344 2345 - MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>"); 2345 + MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>"); 2346 2346 MODULE_LICENSE("GPL"); 2347 2347
+59 -18
drivers/s390/net/qeth.h
··· 8 8 #include <linux/trdevice.h> 9 9 #include <linux/etherdevice.h> 10 10 #include <linux/if_vlan.h> 11 + #include <linux/ctype.h> 11 12 12 13 #include <net/ipv6.h> 13 14 #include <linux/in6.h> ··· 25 24 26 25 #include "qeth_mpc.h" 27 26 28 - #define VERSION_QETH_H "$Revision: 1.142 $" 27 + #define VERSION_QETH_H "$Revision: 1.152 $" 29 28 30 29 #ifdef CONFIG_QETH_IPV6 31 30 #define QETH_VERSION_IPV6 ":IPv6" ··· 719 718 atomic_t refcnt; 720 719 }; 721 720 722 - #define QETH_BROADCAST_WITH_ECHO 1 723 - #define QETH_BROADCAST_WITHOUT_ECHO 2 724 721 725 722 struct qeth_card_blkt { 726 723 int time_total; ··· 726 727 int inter_packet_jumbo; 727 728 }; 728 729 729 - 730 - 730 + #define QETH_BROADCAST_WITH_ECHO 0x01 731 + #define QETH_BROADCAST_WITHOUT_ECHO 0x02 732 + #define QETH_LAYER2_MAC_READ 0x01 733 + #define QETH_LAYER2_MAC_REGISTERED 0x02 731 734 struct qeth_card_info { 732 735 unsigned short unit_addr2; 733 736 unsigned short cula; ··· 737 736 __u16 func_level; 738 737 char mcl_level[QETH_MCL_LENGTH + 1]; 739 738 int guestlan; 740 - int layer2_mac_registered; 739 + int mac_bits; 741 740 int portname_required; 742 741 int portno; 743 742 char portname[9]; ··· 750 749 int unique_id; 751 750 struct qeth_card_blkt blkt; 752 751 __u32 csum_mask; 752 + enum qeth_ipa_promisc_modes promisc_mode; 753 753 }; 754 754 755 755 struct qeth_card_options { ··· 777 775 enum qeth_threads { 778 776 QETH_SET_IP_THREAD = 1, 779 777 QETH_RECOVER_THREAD = 2, 778 + QETH_SET_PROMISC_MODE_THREAD = 4, 780 779 }; 781 780 782 781 struct qeth_osn_info { ··· 1077 1074 } 1078 1075 } 1079 1076 1077 + static inline int 1078 + qeth_isdigit(char * buf) 1079 + { 1080 + while (*buf) { 1081 + if (!isdigit(*buf++)) 1082 + return 0; 1083 + } 1084 + return 1; 1085 + } 1086 + 1087 + static inline int 1088 + qeth_isxdigit(char * buf) 1089 + { 1090 + while (*buf) { 1091 + if (!isxdigit(*buf++)) 1092 + return 0; 1093 + } 1094 + return 1; 1095 + } 1096 + 1080 1097 static inline void 1081 1098 qeth_ipaddr4_to_string(const __u8 *addr, char *buf) 1082 1099 { ··· 1113 1090 int i; 1114 1091 1115 1092 start = buf; 1116 - for (i = 0; i < 3; i++) { 1117 - if (!(end = strchr(start, '.'))) 1093 + for (i = 0; i < 4; i++) { 1094 + if (i == 3) { 1095 + end = strchr(start,0xa); 1096 + if (end) 1097 + len = end - start; 1098 + else 1099 + len = strlen(start); 1100 + } 1101 + else { 1102 + end = strchr(start, '.'); 1103 + len = end - start; 1104 + } 1105 + if ((len <= 0) || (len > 3)) 1118 1106 return -EINVAL; 1119 - len = end - start; 1120 1107 memset(abuf, 0, 4); 1121 1108 strncpy(abuf, start, len); 1109 + if (!qeth_isdigit(abuf)) 1110 + return -EINVAL; 1122 1111 addr[i] = simple_strtoul(abuf, &tmp, 10); 1123 1112 start = end + 1; 1124 1113 } 1125 - memset(abuf, 0, 4); 1126 - strcpy(abuf, start); 1127 - addr[3] = simple_strtoul(abuf, &tmp, 10); 1128 1114 return 0; 1129 1115 } 1130 1116 ··· 1160 1128 1161 1129 tmp_addr = (u16 *)addr; 1162 1130 start = buf; 1163 - for (i = 0; i < 7; i++) { 1164 - if (!(end = strchr(start, ':'))) 1131 + for (i = 0; i < 8; i++) { 1132 + if (i == 7) { 1133 + end = strchr(start,0xa); 1134 + if (end) 1135 + len = end - start; 1136 + else 1137 + len = strlen(start); 1138 + } 1139 + else { 1140 + end = strchr(start, ':'); 1141 + len = end - start; 1142 + } 1143 + if ((len <= 0) || (len > 4)) 1165 1144 return -EINVAL; 1166 - len = end - start; 1167 1145 memset(abuf, 0, 5); 1168 1146 strncpy(abuf, start, len); 1147 + if (!qeth_isxdigit(abuf)) 1148 + return -EINVAL; 1169 1149 tmp_addr[i] = simple_strtoul(abuf, &tmp, 16); 1170 1150 start = end + 1; 1171 1151 } 1172 - memset(abuf, 0, 5); 1173 - strcpy(abuf, start); 1174 - tmp_addr[7] = simple_strtoul(abuf, &tmp, 16); 1175 1152 return 0; 1176 1153 } 1177 1154
+214 -47
drivers/s390/net/qeth_main.c
··· 1 1 /* 2 2 * 3 - * linux/drivers/s390/net/qeth_main.c ($Revision: 1.224 $) 3 + * linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $) 4 4 * 5 5 * Linux on zSeries OSA Express and HiperSockets support 6 6 * ··· 9 9 * Author(s): Original Code written by 10 10 * Utz Bacher (utz.bacher@de.ibm.com) 11 11 * Rewritten by 12 - * Frank Pavlic (pavlic@de.ibm.com) and 12 + * Frank Pavlic (fpavlic@de.ibm.com) and 13 13 * Thomas Spatzier <tspat@de.ibm.com> 14 14 * 15 - * $Revision: 1.224 $ $Date: 2005/05/04 20:19:18 $ 15 + * $Revision: 1.242 $ $Date: 2005/05/04 20:19:18 $ 16 16 * 17 17 * This program is free software; you can redistribute it and/or modify 18 18 * it under the terms of the GNU General Public License as published by ··· 72 72 #include "qeth_eddp.h" 73 73 #include "qeth_tso.h" 74 74 75 - #define VERSION_QETH_C "$Revision: 1.224 $" 75 + #define VERSION_QETH_C "$Revision: 1.242 $" 76 76 static const char *version = "qeth S/390 OSA-Express driver"; 77 77 78 78 /** ··· 158 158 159 159 static void 160 160 qeth_set_multicast_list(struct net_device *); 161 + 162 + static void 163 + qeth_setadp_promisc_mode(struct qeth_card *); 161 164 162 165 static void 163 166 qeth_notify_processes(void) ··· 605 602 int found = 0; 606 603 607 604 list_for_each_entry(addr, &card->ip_list, entry) { 605 + if (card->options.layer2) { 606 + if ((addr->type == todo->type) && 607 + (memcmp(&addr->mac, &todo->mac, 608 + OSA_ADDR_LEN) == 0)) { 609 + found = 1; 610 + break; 611 + } 612 + continue; 613 + } 608 614 if ((addr->proto == QETH_PROT_IPV4) && 609 615 (todo->proto == QETH_PROT_IPV4) && 610 616 (addr->type == todo->type) && 611 617 (addr->u.a4.addr == todo->u.a4.addr) && 612 - (addr->u.a4.mask == todo->u.a4.mask) ){ 618 + (addr->u.a4.mask == todo->u.a4.mask)) { 613 619 found = 1; 614 620 break; 615 621 } ··· 627 615 (addr->type == todo->type) && 628 616 (addr->u.a6.pfxlen == todo->u.a6.pfxlen) && 629 617 (memcmp(&addr->u.a6.addr, &todo->u.a6.addr, 630 - sizeof(struct in6_addr)) == 0)) { 618 + sizeof(struct in6_addr)) == 0)) { 631 619 found = 1; 632 620 break; 633 621 } 634 622 } 635 - if (found){ 623 + if (found) { 636 624 addr->users += todo->users; 637 625 if (addr->users <= 0){ 638 626 *__addr = addr; ··· 644 632 return 0; 645 633 } 646 634 } 647 - if (todo->users > 0){ 635 + if (todo->users > 0) { 648 636 /* for VIPA and RXIP limit refcount to 1 */ 649 637 if (todo->type != QETH_IP_TYPE_NORMAL) 650 638 todo->users = 1; ··· 694 682 if ((addr->type == QETH_IP_TYPE_DEL_ALL_MC) && 695 683 (tmp->type == QETH_IP_TYPE_DEL_ALL_MC)) 696 684 return 0; 685 + if (card->options.layer2) { 686 + if ((tmp->type == addr->type) && 687 + (tmp->is_multicast == addr->is_multicast) && 688 + (memcmp(&tmp->mac, &addr->mac, 689 + OSA_ADDR_LEN) == 0)) { 690 + found = 1; 691 + break; 692 + } 693 + continue; 694 + } 697 695 if ((tmp->proto == QETH_PROT_IPV4) && 698 696 (addr->proto == QETH_PROT_IPV4) && 699 697 (tmp->type == addr->type) && 700 698 (tmp->is_multicast == addr->is_multicast) && 701 699 (tmp->u.a4.addr == addr->u.a4.addr) && 702 - (tmp->u.a4.mask == addr->u.a4.mask) ){ 700 + (tmp->u.a4.mask == addr->u.a4.mask)) { 703 701 found = 1; 704 702 break; 705 703 } ··· 719 697 (tmp->is_multicast == addr->is_multicast) && 720 698 (tmp->u.a6.pfxlen == addr->u.a6.pfxlen) && 721 699 (memcmp(&tmp->u.a6.addr, &addr->u.a6.addr, 722 - sizeof(struct in6_addr)) == 0) ){ 700 + sizeof(struct in6_addr)) == 0)) { 723 701 found = 1; 724 702 break; 725 703 } ··· 729 707 tmp->users += addr->users; 730 708 else 731 709 tmp->users += add? 1:-1; 732 - if (tmp->users == 0){ 710 + if (tmp->users == 0) { 733 711 list_del(&tmp->entry); 734 712 kfree(tmp); 735 713 } ··· 760 738 unsigned long flags; 761 739 int rc = 0; 762 740 763 - QETH_DBF_TEXT(trace,4,"delip"); 764 - if (addr->proto == QETH_PROT_IPV4) 765 - QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4); 741 + QETH_DBF_TEXT(trace, 4, "delip"); 742 + 743 + if (card->options.layer2) 744 + QETH_DBF_HEX(trace, 4, &addr->mac, 6); 745 + else if (addr->proto == QETH_PROT_IPV4) 746 + QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4); 766 747 else { 767 - QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8); 768 - QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8); 748 + QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8); 749 + QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8); 769 750 } 770 751 spin_lock_irqsave(&card->ip_lock, flags); 771 752 rc = __qeth_insert_ip_todo(card, addr, 0); ··· 782 757 unsigned long flags; 783 758 int rc = 0; 784 759 785 - QETH_DBF_TEXT(trace,4,"addip"); 786 - if (addr->proto == QETH_PROT_IPV4) 787 - QETH_DBF_HEX(trace,4,&addr->u.a4.addr,4); 760 + QETH_DBF_TEXT(trace, 4, "addip"); 761 + if (card->options.layer2) 762 + QETH_DBF_HEX(trace, 4, &addr->mac, 6); 763 + else if (addr->proto == QETH_PROT_IPV4) 764 + QETH_DBF_HEX(trace, 4, &addr->u.a4.addr, 4); 788 765 else { 789 - QETH_DBF_HEX(trace,4,&addr->u.a6.addr,8); 790 - QETH_DBF_HEX(trace,4,((char *)&addr->u.a6.addr)+8,8); 766 + QETH_DBF_HEX(trace, 4, &addr->u.a6.addr, 8); 767 + QETH_DBF_HEX(trace, 4, ((char *)&addr->u.a6.addr) + 8, 8); 791 768 } 792 769 spin_lock_irqsave(&card->ip_lock, flags); 793 770 rc = __qeth_insert_ip_todo(card, addr, 1); ··· 802 775 { 803 776 struct qeth_ipaddr *addr, *tmp; 804 777 int rc; 805 - 778 + again: 806 779 list_for_each_entry_safe(addr, tmp, &card->ip_list, entry) { 807 780 if (addr->is_multicast) { 808 781 spin_unlock_irqrestore(&card->ip_lock, *flags); ··· 811 784 if (!rc) { 812 785 list_del(&addr->entry); 813 786 kfree(addr); 787 + goto again; 814 788 } 815 789 } 816 790 } ··· 879 851 880 852 static void qeth_delete_mc_addresses(struct qeth_card *); 881 853 static void qeth_add_multicast_ipv4(struct qeth_card *); 854 + static void qeth_layer2_add_multicast(struct qeth_card *); 882 855 #ifdef CONFIG_QETH_IPV6 883 856 static void qeth_add_multicast_ipv6(struct qeth_card *); 884 857 #endif ··· 968 939 return 0; 969 940 } 970 941 942 + /* 943 + * Drive the SET_PROMISC_MODE thread 944 + */ 945 + static int 946 + qeth_set_promisc_mode(void *ptr) 947 + { 948 + struct qeth_card *card = (struct qeth_card *) ptr; 949 + 950 + daemonize("qeth_setprm"); 951 + QETH_DBF_TEXT(trace,4,"setprm1"); 952 + if (!qeth_do_run_thread(card, QETH_SET_PROMISC_MODE_THREAD)) 953 + return 0; 954 + QETH_DBF_TEXT(trace,4,"setprm2"); 955 + qeth_setadp_promisc_mode(card); 956 + qeth_clear_thread_running_bit(card, QETH_SET_PROMISC_MODE_THREAD); 957 + return 0; 958 + } 959 + 971 960 static int 972 961 qeth_recover(void *ptr) 973 962 { ··· 1052 1005 1053 1006 if (qeth_do_start_thread(card, QETH_SET_IP_THREAD)) 1054 1007 kernel_thread(qeth_register_ip_addresses, (void *)card,SIGCHLD); 1008 + if (qeth_do_start_thread(card, QETH_SET_PROMISC_MODE_THREAD)) 1009 + kernel_thread(qeth_set_promisc_mode, (void *)card, SIGCHLD); 1055 1010 if (qeth_do_start_thread(card, QETH_RECOVER_THREAD)) 1056 1011 kernel_thread(qeth_recover, (void *) card, SIGCHLD); 1057 1012 } ··· 3798 3749 3799 3750 if ( (card->info.type != QETH_CARD_TYPE_OSN) && 3800 3751 (card->options.layer2) && 3801 - (!card->info.layer2_mac_registered)) { 3752 + (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) { 3802 3753 QETH_DBF_TEXT(trace,4,"nomacadr"); 3803 3754 return -EPERM; 3804 3755 } ··· 4360 4311 out: 4361 4312 if (flush_count) 4362 4313 qeth_flush_buffers(queue, 0, start_index, flush_count); 4314 + else if (!atomic_read(&queue->set_pci_flags_count)) 4315 + atomic_swap(&queue->state, QETH_OUT_Q_LOCKED_FLUSH); 4363 4316 /* 4364 4317 * queue->state will go from LOCKED -> UNLOCKED or from 4365 4318 * LOCKED_FLUSH -> LOCKED if output_handler wanted to 'notify' us ··· 5026 4975 unsigned long); 5027 4976 5028 4977 static int 4978 + qeth_default_setadapterparms_cb(struct qeth_card *card, 4979 + struct qeth_reply *reply, 4980 + unsigned long data); 4981 + static int 5029 4982 qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *, 5030 4983 __u16, long, 5031 4984 int (*reply_cb) ··· 5356 5301 struct qeth_ipaddr *addr; 5357 5302 5358 5303 QETH_DBF_TEXT(trace, 4, "frvaddr4"); 5359 - if (!card->vlangrp) 5360 - return; 5304 + 5361 5305 rcu_read_lock(); 5362 5306 in_dev = __in_dev_get_rcu(card->vlangrp->vlan_devices[vid]); 5363 5307 if (!in_dev) ··· 5384 5330 struct qeth_ipaddr *addr; 5385 5331 5386 5332 QETH_DBF_TEXT(trace, 4, "frvaddr6"); 5387 - if (!card->vlangrp) 5388 - return; 5333 + 5389 5334 in6_dev = in6_dev_get(card->vlangrp->vlan_devices[vid]); 5390 5335 if (!in6_dev) 5391 5336 return; ··· 5404 5351 } 5405 5352 5406 5353 static void 5354 + qeth_free_vlan_addresses(struct qeth_card *card, unsigned short vid) 5355 + { 5356 + if (card->options.layer2 || !card->vlangrp) 5357 + return; 5358 + qeth_free_vlan_addresses4(card, vid); 5359 + qeth_free_vlan_addresses6(card, vid); 5360 + } 5361 + 5362 + static int 5363 + qeth_layer2_send_setdelvlan_cb(struct qeth_card *card, 5364 + struct qeth_reply *reply, 5365 + unsigned long data) 5366 + { 5367 + struct qeth_ipa_cmd *cmd; 5368 + 5369 + QETH_DBF_TEXT(trace, 2, "L2sdvcb"); 5370 + cmd = (struct qeth_ipa_cmd *) data; 5371 + if (cmd->hdr.return_code) { 5372 + PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. " 5373 + "Continuing\n",cmd->data.setdelvlan.vlan_id, 5374 + QETH_CARD_IFNAME(card), cmd->hdr.return_code); 5375 + QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command); 5376 + QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card)); 5377 + QETH_DBF_TEXT_(trace, 2, "err%d", cmd->hdr.return_code); 5378 + } 5379 + return 0; 5380 + } 5381 + 5382 + static int 5407 5383 qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i, 5408 5384 enum qeth_ipa_cmds ipacmd) 5409 5385 { 5410 - int rc; 5411 5386 struct qeth_ipa_cmd *cmd; 5412 5387 struct qeth_cmd_buffer *iob; 5413 5388 ··· 5443 5362 iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); 5444 5363 cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); 5445 5364 cmd->data.setdelvlan.vlan_id = i; 5446 - 5447 - rc = qeth_send_ipa_cmd(card, iob, NULL, NULL); 5448 - if (rc) { 5449 - PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. " 5450 - "Continuing\n",i, QETH_CARD_IFNAME(card), rc); 5451 - QETH_DBF_TEXT_(trace, 2, "L2VL%4x", ipacmd); 5452 - QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card)); 5453 - QETH_DBF_TEXT_(trace, 2, "err%d", rc); 5454 - } 5365 + return qeth_send_ipa_cmd(card, iob, 5366 + qeth_layer2_send_setdelvlan_cb, NULL); 5455 5367 } 5456 5368 5457 5369 static void ··· 5494 5420 qeth_free_vlan_skbs(card, vid); 5495 5421 spin_lock_irqsave(&card->vlanlock, flags); 5496 5422 /* unregister IP addresses of vlan device */ 5497 - qeth_free_vlan_addresses4(card, vid); 5498 - qeth_free_vlan_addresses6(card, vid); 5423 + qeth_free_vlan_addresses(card, vid); 5499 5424 if (card->vlangrp) 5500 5425 card->vlangrp->vlan_devices[vid] = NULL; 5501 5426 spin_unlock_irqrestore(&card->vlanlock, flags); ··· 5503 5430 qeth_set_multicast_list(card->dev); 5504 5431 } 5505 5432 #endif 5433 + /** 5434 + * Examine hardware response to SET_PROMISC_MODE 5435 + */ 5436 + static int 5437 + qeth_setadp_promisc_mode_cb(struct qeth_card *card, 5438 + struct qeth_reply *reply, 5439 + unsigned long data) 5440 + { 5441 + struct qeth_ipa_cmd *cmd; 5442 + struct qeth_ipacmd_setadpparms *setparms; 5443 + 5444 + QETH_DBF_TEXT(trace,4,"prmadpcb"); 5445 + 5446 + cmd = (struct qeth_ipa_cmd *) data; 5447 + setparms = &(cmd->data.setadapterparms); 5448 + 5449 + qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); 5450 + if (cmd->hdr.return_code) { 5451 + QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code); 5452 + setparms->data.mode = SET_PROMISC_MODE_OFF; 5453 + } 5454 + card->info.promisc_mode = setparms->data.mode; 5455 + return 0; 5456 + } 5457 + /* 5458 + * Set promiscuous mode (on or off) (SET_PROMISC_MODE command) 5459 + */ 5460 + static void 5461 + qeth_setadp_promisc_mode(struct qeth_card *card) 5462 + { 5463 + enum qeth_ipa_promisc_modes mode; 5464 + struct net_device *dev = card->dev; 5465 + struct qeth_cmd_buffer *iob; 5466 + struct qeth_ipa_cmd *cmd; 5467 + 5468 + QETH_DBF_TEXT(trace, 4, "setprom"); 5469 + 5470 + if (((dev->flags & IFF_PROMISC) && 5471 + (card->info.promisc_mode == SET_PROMISC_MODE_ON)) || 5472 + (!(dev->flags & IFF_PROMISC) && 5473 + (card->info.promisc_mode == SET_PROMISC_MODE_OFF))) 5474 + return; 5475 + mode = SET_PROMISC_MODE_OFF; 5476 + if (dev->flags & IFF_PROMISC) 5477 + mode = SET_PROMISC_MODE_ON; 5478 + QETH_DBF_TEXT_(trace, 4, "mode:%x", mode); 5479 + 5480 + iob = qeth_get_adapter_cmd(card, IPA_SETADP_SET_PROMISC_MODE, 5481 + sizeof(struct qeth_ipacmd_setadpparms)); 5482 + cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE); 5483 + cmd->data.setadapterparms.data.mode = mode; 5484 + qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL); 5485 + } 5506 5486 5507 5487 /** 5508 5488 * set multicast address on card ··· 5570 5444 5571 5445 QETH_DBF_TEXT(trace,3,"setmulti"); 5572 5446 qeth_delete_mc_addresses(card); 5447 + if (card->options.layer2) { 5448 + qeth_layer2_add_multicast(card); 5449 + goto out; 5450 + } 5573 5451 qeth_add_multicast_ipv4(card); 5574 5452 #ifdef CONFIG_QETH_IPV6 5575 5453 qeth_add_multicast_ipv6(card); 5576 5454 #endif 5455 + out: 5577 5456 if (qeth_set_thread_start_bit(card, QETH_SET_IP_THREAD) == 0) 5578 5457 schedule_work(&card->kernel_thread_starter); 5458 + if (!qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) 5459 + return; 5460 + if (qeth_set_thread_start_bit(card, QETH_SET_PROMISC_MODE_THREAD)==0) 5461 + schedule_work(&card->kernel_thread_starter); 5462 + 5579 5463 } 5580 5464 5581 5465 static int ··· 5793 5657 in_dev_put(in4_dev); 5794 5658 } 5795 5659 5660 + static void 5661 + qeth_layer2_add_multicast(struct qeth_card *card) 5662 + { 5663 + struct qeth_ipaddr *ipm; 5664 + struct dev_mc_list *dm; 5665 + 5666 + QETH_DBF_TEXT(trace,4,"L2addmc"); 5667 + for (dm = card->dev->mc_list; dm; dm = dm->next) { 5668 + ipm = qeth_get_addr_buffer(QETH_PROT_IPV4); 5669 + if (!ipm) 5670 + continue; 5671 + memcpy(ipm->mac,dm->dmi_addr,MAX_ADDR_LEN); 5672 + ipm->is_multicast = 1; 5673 + if (!qeth_add_ip(card, ipm)) 5674 + kfree(ipm); 5675 + } 5676 + } 5677 + 5796 5678 #ifdef CONFIG_QETH_IPV6 5797 5679 static inline void 5798 5680 qeth_add_mc6(struct qeth_card *card, struct inet6_dev *in6_dev) ··· 5979 5825 PRINT_WARN("Error in registering MAC address on " \ 5980 5826 "device %s: x%x\n", CARD_BUS_ID(card), 5981 5827 cmd->hdr.return_code); 5982 - card->info.layer2_mac_registered = 0; 5828 + card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 5983 5829 cmd->hdr.return_code = -EIO; 5984 5830 } else { 5985 - card->info.layer2_mac_registered = 1; 5831 + card->info.mac_bits |= QETH_LAYER2_MAC_REGISTERED; 5986 5832 memcpy(card->dev->dev_addr,cmd->data.setdelmac.mac, 5987 5833 OSA_ADDR_LEN); 5988 5834 PRINT_INFO("MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x " ··· 6020 5866 cmd->hdr.return_code = -EIO; 6021 5867 return 0; 6022 5868 } 6023 - card->info.layer2_mac_registered = 0; 5869 + card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED; 6024 5870 6025 5871 return 0; 6026 5872 } ··· 6028 5874 qeth_layer2_send_delmac(struct qeth_card *card, __u8 *mac) 6029 5875 { 6030 5876 QETH_DBF_TEXT(trace, 2, "L2Delmac"); 6031 - if (!card->info.layer2_mac_registered) 5877 + if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED)) 6032 5878 return 0; 6033 5879 return qeth_layer2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, 6034 5880 qeth_layer2_send_delmac_cb); ··· 6050 5896 card = (struct qeth_card *) dev->priv; 6051 5897 6052 5898 if (!card->options.layer2) { 6053 - PRINT_WARN("Setting MAC address on %s is not supported" 5899 + PRINT_WARN("Setting MAC address on %s is not supported " 6054 5900 "in Layer 3 mode.\n", dev->name); 6055 5901 QETH_DBF_TEXT(trace, 3, "setmcLY3"); 6056 5902 return -EOPNOTSUPP; ··· 6595 6441 return 0; 6596 6442 } 6597 6443 6444 + 6445 + 6598 6446 static int 6599 6447 qeth_query_setadapterparms_cb(struct qeth_card *card, struct qeth_reply *reply, 6600 6448 unsigned long data) ··· 6637 6481 QETH_DBF_TEXT(trace,4,"chgmaccb"); 6638 6482 6639 6483 cmd = (struct qeth_ipa_cmd *) data; 6640 - memcpy(card->dev->dev_addr, 6641 - &cmd->data.setadapterparms.data.change_addr.addr,OSA_ADDR_LEN); 6484 + if (!card->options.layer2 || card->info.guestlan || 6485 + !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) { 6486 + memcpy(card->dev->dev_addr, 6487 + &cmd->data.setadapterparms.data.change_addr.addr, 6488 + OSA_ADDR_LEN); 6489 + card->info.mac_bits |= QETH_LAYER2_MAC_READ; 6490 + } 6642 6491 qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd); 6643 6492 return 0; 6644 6493 } ··· 6762 6601 6763 6602 QETH_DBF_TEXT(setup, 2, "doL2init"); 6764 6603 QETH_DBF_TEXT_(setup, 2, "doL2%s", CARD_BUS_ID(card)); 6604 + 6605 + rc = qeth_query_setadapterparms(card); 6606 + if (rc) { 6607 + PRINT_WARN("could not query adapter parameters on device %s: " 6608 + "x%x\n", CARD_BUS_ID(card), rc); 6609 + } 6765 6610 6766 6611 rc = qeth_setadpparms_change_macaddr(card); 6767 6612 if (rc) { ··· 8715 8548 EXPORT_SYMBOL(qeth_osn_assist); 8716 8549 module_init(qeth_init); 8717 8550 module_exit(qeth_exit); 8718 - MODULE_AUTHOR("Frank Pavlic <pavlic@de.ibm.com>"); 8551 + MODULE_AUTHOR("Frank Pavlic <fpavlic@de.ibm.com>"); 8719 8552 MODULE_DESCRIPTION("Linux on zSeries OSA Express and HiperSockets support\n" \ 8720 8553 "Copyright 2000,2003 IBM Corporation\n"); 8721 8554
+1 -1
drivers/s390/net/qeth_mpc.c
··· 4 4 * Linux on zSeries OSA Express and HiperSockets support 5 5 * 6 6 * Copyright 2000,2003 IBM Corporation 7 - * Author(s): Frank Pavlic <pavlic@de.ibm.com> 7 + * Author(s): Frank Pavlic <fpavlic@de.ibm.com> 8 8 * Thomas Spatzier <tspat@de.ibm.com> 9 9 * 10 10 */
+8 -5
drivers/s390/net/qeth_mpc.h
··· 6 6 * Copyright 2000,2003 IBM Corporation 7 7 * Author(s): Utz Bacher <utz.bacher@de.ibm.com> 8 8 * Thomas Spatzier <tspat@de.ibm.com> 9 - * Frank Pavlic <pavlic@de.ibm.com> 9 + * Frank Pavlic <fpavlic@de.ibm.com> 10 10 * 11 11 */ 12 12 #ifndef __QETH_MPC_H__ ··· 14 14 15 15 #include <asm/qeth.h> 16 16 17 - #define VERSION_QETH_MPC_H "$Revision: 1.43 $" 17 + #define VERSION_QETH_MPC_H "$Revision: 1.44 $" 18 18 19 19 extern const char *VERSION_QETH_MPC_C; 20 20 ··· 217 217 IPA_SETADP_SEND_OSA_MESSAGE = 0x0100, 218 218 IPA_SETADP_SET_SNMP_CONTROL = 0x0200, 219 219 IPA_SETADP_READ_SNMP_PARMS = 0x0400, 220 - IPA_SETADP_WRITE_SNMP_PARMS = 0x0800, 220 + IPA_SETADP_SET_PROMISC_MODE = 0x0800, 221 221 IPA_SETADP_QUERY_CARD_INFO = 0x1000, 222 222 }; 223 223 enum qeth_ipa_mac_ops { ··· 232 232 CHANGE_ADDR_ADD_ADDR = 1, 233 233 CHANGE_ADDR_DEL_ADDR = 2, 234 234 CHANGE_ADDR_FLUSH_ADDR_TABLE = 4, 235 - 236 - 237 235 }; 236 + enum qeth_ipa_promisc_modes { 237 + SET_PROMISC_MODE_OFF = 0, 238 + SET_PROMISC_MODE_ON = 1, 239 + }; 240 + 238 241 /* (SET)DELIP(M) IPA stuff ***************************************************/ 239 242 struct qeth_ipacmd_setdelip4 { 240 243 __u8 ip_addr[4];
+4 -4
drivers/s390/net/qeth_sys.c
··· 1 1 /* 2 2 * 3 - * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.55 $) 3 + * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.58 $) 4 4 * 5 5 * Linux on zSeries OSA Express and HiperSockets support 6 6 * This file contains code related to sysfs. ··· 8 8 * Copyright 2000,2003 IBM Corporation 9 9 * 10 10 * Author(s): Thomas Spatzier <tspat@de.ibm.com> 11 - * Frank Pavlic <pavlic@de.ibm.com> 11 + * Frank Pavlic <fpavlic@de.ibm.com> 12 12 * 13 13 */ 14 14 #include <linux/list.h> ··· 20 20 #include "qeth_mpc.h" 21 21 #include "qeth_fs.h" 22 22 23 - const char *VERSION_QETH_SYS_C = "$Revision: 1.55 $"; 23 + const char *VERSION_QETH_SYS_C = "$Revision: 1.58 $"; 24 24 25 25 /*****************************************************************************/ 26 26 /* */ ··· 1117 1117 start = buf; 1118 1118 /* get address string */ 1119 1119 end = strchr(start, '/'); 1120 - if (!end){ 1120 + if (!end || (end-start >= 49)){ 1121 1121 PRINT_WARN("Invalid format for ipato_addx/delx. " 1122 1122 "Use <ip addr>/<mask bits>\n"); 1123 1123 return -EINVAL;
+1 -1
drivers/s390/net/qeth_tso.h
··· 5 5 * 6 6 * Copyright 2004 IBM Corporation 7 7 * 8 - * Author(s): Frank Pavlic <pavlic@de.ibm.com> 8 + * Author(s): Frank Pavlic <fpavlic@de.ibm.com> 9 9 * 10 10 * $Revision: 1.7 $ $Date: 2005/05/04 20:19:18 $ 11 11 *