diff options
71 files changed, 1356 insertions, 719 deletions
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index bc537440ca02..f822cd3025ff 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -1027,8 +1027,7 @@ static void cp_reset_hw (struct cp_private *cp) | |||
1027 | if (!(cpr8(Cmd) & CmdReset)) | 1027 | if (!(cpr8(Cmd) & CmdReset)) |
1028 | return; | 1028 | return; |
1029 | 1029 | ||
1030 | set_current_state(TASK_UNINTERRUPTIBLE); | 1030 | schedule_timeout_uninterruptible(10); |
1031 | schedule_timeout(10); | ||
1032 | } | 1031 | } |
1033 | 1032 | ||
1034 | printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name); | 1033 | printk(KERN_ERR "%s: hardware reset timeout\n", cp->dev->name); |
@@ -1575,6 +1574,7 @@ static struct ethtool_ops cp_ethtool_ops = { | |||
1575 | .set_wol = cp_set_wol, | 1574 | .set_wol = cp_set_wol, |
1576 | .get_strings = cp_get_strings, | 1575 | .get_strings = cp_get_strings, |
1577 | .get_ethtool_stats = cp_get_ethtool_stats, | 1576 | .get_ethtool_stats = cp_get_ethtool_stats, |
1577 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1578 | }; | 1578 | }; |
1579 | 1579 | ||
1580 | static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) | 1580 | static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) |
@@ -1773,6 +1773,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1773 | for (i = 0; i < 3; i++) | 1773 | for (i = 0; i < 3; i++) |
1774 | ((u16 *) (dev->dev_addr))[i] = | 1774 | ((u16 *) (dev->dev_addr))[i] = |
1775 | le16_to_cpu (read_eeprom (regs, i + 7, addr_len)); | 1775 | le16_to_cpu (read_eeprom (regs, i + 7, addr_len)); |
1776 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
1776 | 1777 | ||
1777 | dev->open = cp_open; | 1778 | dev->open = cp_open; |
1778 | dev->stop = cp_close; | 1779 | dev->stop = cp_close; |
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index 4c2cf7bbd252..76ef6efd5950 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c | |||
@@ -970,6 +970,7 @@ static int __devinit rtl8139_init_one (struct pci_dev *pdev, | |||
970 | for (i = 0; i < 3; i++) | 970 | for (i = 0; i < 3; i++) |
971 | ((u16 *) (dev->dev_addr))[i] = | 971 | ((u16 *) (dev->dev_addr))[i] = |
972 | le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len)); | 972 | le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len)); |
973 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
973 | 974 | ||
974 | /* The Rtl8139-specific entries in the device structure. */ | 975 | /* The Rtl8139-specific entries in the device structure. */ |
975 | dev->open = rtl8139_open; | 976 | dev->open = rtl8139_open; |
@@ -2465,6 +2466,7 @@ static struct ethtool_ops rtl8139_ethtool_ops = { | |||
2465 | .get_strings = rtl8139_get_strings, | 2466 | .get_strings = rtl8139_get_strings, |
2466 | .get_stats_count = rtl8139_get_stats_count, | 2467 | .get_stats_count = rtl8139_get_stats_count, |
2467 | .get_ethtool_stats = rtl8139_get_ethtool_stats, | 2468 | .get_ethtool_stats = rtl8139_get_ethtool_stats, |
2469 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
2468 | }; | 2470 | }; |
2469 | 2471 | ||
2470 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 2472 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 96f14ab1c1f5..ff3fccd7513b 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2235,6 +2235,20 @@ config ISERIES_VETH | |||
2235 | tristate "iSeries Virtual Ethernet driver support" | 2235 | tristate "iSeries Virtual Ethernet driver support" |
2236 | depends on PPC_ISERIES | 2236 | depends on PPC_ISERIES |
2237 | 2237 | ||
2238 | config RIONET | ||
2239 | tristate "RapidIO Ethernet over messaging driver support" | ||
2240 | depends on NETDEVICES && RAPIDIO | ||
2241 | |||
2242 | config RIONET_TX_SIZE | ||
2243 | int "Number of outbound queue entries" | ||
2244 | depends on RIONET | ||
2245 | default "128" | ||
2246 | |||
2247 | config RIONET_RX_SIZE | ||
2248 | int "Number of inbound queue entries" | ||
2249 | depends on RIONET | ||
2250 | default "128" | ||
2251 | |||
2238 | config FDDI | 2252 | config FDDI |
2239 | bool "FDDI driver support" | 2253 | bool "FDDI driver support" |
2240 | depends on (PCI || EISA) | 2254 | depends on (PCI || EISA) |
diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 8645c843cf4d..e6acba68923a 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile | |||
@@ -63,6 +63,7 @@ obj-$(CONFIG_SKFP) += skfp/ | |||
63 | obj-$(CONFIG_VIA_RHINE) += via-rhine.o | 63 | obj-$(CONFIG_VIA_RHINE) += via-rhine.o |
64 | obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o | 64 | obj-$(CONFIG_VIA_VELOCITY) += via-velocity.o |
65 | obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o | 65 | obj-$(CONFIG_ADAPTEC_STARFIRE) += starfire.o |
66 | obj-$(CONFIG_RIONET) += rionet.o | ||
66 | 67 | ||
67 | # | 68 | # |
68 | # end link order section | 69 | # end link order section |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index 94939f570f78..d27e870e59ab 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
@@ -1676,6 +1676,7 @@ static struct ethtool_ops b44_ethtool_ops = { | |||
1676 | .set_pauseparam = b44_set_pauseparam, | 1676 | .set_pauseparam = b44_set_pauseparam, |
1677 | .get_msglevel = b44_get_msglevel, | 1677 | .get_msglevel = b44_get_msglevel, |
1678 | .set_msglevel = b44_set_msglevel, | 1678 | .set_msglevel = b44_set_msglevel, |
1679 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1679 | }; | 1680 | }; |
1680 | 1681 | ||
1681 | static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 1682 | static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
@@ -1718,6 +1719,7 @@ static int __devinit b44_get_invariants(struct b44 *bp) | |||
1718 | bp->dev->dev_addr[3] = eeprom[80]; | 1719 | bp->dev->dev_addr[3] = eeprom[80]; |
1719 | bp->dev->dev_addr[4] = eeprom[83]; | 1720 | bp->dev->dev_addr[4] = eeprom[83]; |
1720 | bp->dev->dev_addr[5] = eeprom[82]; | 1721 | bp->dev->dev_addr[5] = eeprom[82]; |
1722 | memcpy(bp->dev->perm_addr, bp->dev->dev_addr, bp->dev->addr_len); | ||
1721 | 1723 | ||
1722 | bp->phy_addr = eeprom[90] & 0x1f; | 1724 | bp->phy_addr = eeprom[90] & 0x1f; |
1723 | 1725 | ||
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index fbf1c06ec5c1..c15406d46418 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2389,6 +2389,7 @@ static struct ethtool_ops e100_ethtool_ops = { | |||
2389 | .phys_id = e100_phys_id, | 2389 | .phys_id = e100_phys_id, |
2390 | .get_stats_count = e100_get_stats_count, | 2390 | .get_stats_count = e100_get_stats_count, |
2391 | .get_ethtool_stats = e100_get_ethtool_stats, | 2391 | .get_ethtool_stats = e100_get_ethtool_stats, |
2392 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
2392 | }; | 2393 | }; |
2393 | 2394 | ||
2394 | static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) | 2395 | static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) |
@@ -2539,7 +2540,8 @@ static int __devinit e100_probe(struct pci_dev *pdev, | |||
2539 | e100_phy_init(nic); | 2540 | e100_phy_init(nic); |
2540 | 2541 | ||
2541 | memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN); | 2542 | memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN); |
2542 | if(!is_valid_ether_addr(netdev->dev_addr)) { | 2543 | memcpy(netdev->perm_addr, nic->eeprom, ETH_ALEN); |
2544 | if(!is_valid_ether_addr(netdev->perm_addr)) { | ||
2543 | DPRINTK(PROBE, ERR, "Invalid MAC address from " | 2545 | DPRINTK(PROBE, ERR, "Invalid MAC address from " |
2544 | "EEPROM, aborting.\n"); | 2546 | "EEPROM, aborting.\n"); |
2545 | err = -EAGAIN; | 2547 | err = -EAGAIN; |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index f133ff0b0b94..8f3a13420278 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -1739,6 +1739,7 @@ struct ethtool_ops e1000_ethtool_ops = { | |||
1739 | .phys_id = e1000_phys_id, | 1739 | .phys_id = e1000_phys_id, |
1740 | .get_stats_count = e1000_get_stats_count, | 1740 | .get_stats_count = e1000_get_stats_count, |
1741 | .get_ethtool_stats = e1000_get_ethtool_stats, | 1741 | .get_ethtool_stats = e1000_get_ethtool_stats, |
1742 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1742 | }; | 1743 | }; |
1743 | 1744 | ||
1744 | void e1000_set_ethtool_ops(struct net_device *netdev) | 1745 | void e1000_set_ethtool_ops(struct net_device *netdev) |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index ee687c902a20..c062b0ad8262 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -614,8 +614,9 @@ e1000_probe(struct pci_dev *pdev, | |||
614 | if(e1000_read_mac_addr(&adapter->hw)) | 614 | if(e1000_read_mac_addr(&adapter->hw)) |
615 | DPRINTK(PROBE, ERR, "EEPROM Read Error\n"); | 615 | DPRINTK(PROBE, ERR, "EEPROM Read Error\n"); |
616 | memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len); | 616 | memcpy(netdev->dev_addr, adapter->hw.mac_addr, netdev->addr_len); |
617 | memcpy(netdev->perm_addr, adapter->hw.mac_addr, netdev->addr_len); | ||
617 | 618 | ||
618 | if(!is_valid_ether_addr(netdev->dev_addr)) { | 619 | if(!is_valid_ether_addr(netdev->perm_addr)) { |
619 | DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); | 620 | DPRINTK(PROBE, ERR, "Invalid MAC Address\n"); |
620 | err = -EIO; | 621 | err = -EIO; |
621 | goto err_eeprom; | 622 | goto err_eeprom; |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index d6eefdb71c17..6e042ecf6965 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -2065,6 +2065,7 @@ static struct ethtool_ops ops = { | |||
2065 | .get_regs_len = nv_get_regs_len, | 2065 | .get_regs_len = nv_get_regs_len, |
2066 | .get_regs = nv_get_regs, | 2066 | .get_regs = nv_get_regs, |
2067 | .nway_reset = nv_nway_reset, | 2067 | .nway_reset = nv_nway_reset, |
2068 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
2068 | }; | 2069 | }; |
2069 | 2070 | ||
2070 | static int nv_open(struct net_device *dev) | 2071 | static int nv_open(struct net_device *dev) |
@@ -2377,8 +2378,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
2377 | dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff; | 2378 | dev->dev_addr[3] = (np->orig_mac[0] >> 16) & 0xff; |
2378 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; | 2379 | dev->dev_addr[4] = (np->orig_mac[0] >> 8) & 0xff; |
2379 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; | 2380 | dev->dev_addr[5] = (np->orig_mac[0] >> 0) & 0xff; |
2381 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
2380 | 2382 | ||
2381 | if (!is_valid_ether_addr(dev->dev_addr)) { | 2383 | if (!is_valid_ether_addr(dev->perm_addr)) { |
2382 | /* | 2384 | /* |
2383 | * Bad mac address. At least one bios sets the mac address | 2385 | * Bad mac address. At least one bios sets the mac address |
2384 | * to 01:23:45:67:89:ab | 2386 | * to 01:23:45:67:89:ab |
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index cf0ac6fda1a1..b71fab6e34f4 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c | |||
@@ -2517,10 +2517,8 @@ static int hp100_down_vg_link(struct net_device *dev) | |||
2517 | do { | 2517 | do { |
2518 | if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) | 2518 | if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) |
2519 | break; | 2519 | break; |
2520 | if (!in_interrupt()) { | 2520 | if (!in_interrupt()) |
2521 | set_current_state(TASK_INTERRUPTIBLE); | 2521 | schedule_timeout_interruptible(1); |
2522 | schedule_timeout(1); | ||
2523 | } | ||
2524 | } while (time_after(time, jiffies)); | 2522 | } while (time_after(time, jiffies)); |
2525 | 2523 | ||
2526 | if (time_after_eq(jiffies, time)) /* no signal->no logout */ | 2524 | if (time_after_eq(jiffies, time)) /* no signal->no logout */ |
@@ -2536,10 +2534,8 @@ static int hp100_down_vg_link(struct net_device *dev) | |||
2536 | do { | 2534 | do { |
2537 | if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST)) | 2535 | if (!(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST)) |
2538 | break; | 2536 | break; |
2539 | if (!in_interrupt()) { | 2537 | if (!in_interrupt()) |
2540 | set_current_state(TASK_INTERRUPTIBLE); | 2538 | schedule_timeout_interruptible(1); |
2541 | schedule_timeout(1); | ||
2542 | } | ||
2543 | } while (time_after(time, jiffies)); | 2539 | } while (time_after(time, jiffies)); |
2544 | 2540 | ||
2545 | #ifdef HP100_DEBUG | 2541 | #ifdef HP100_DEBUG |
@@ -2577,10 +2573,8 @@ static int hp100_down_vg_link(struct net_device *dev) | |||
2577 | do { | 2573 | do { |
2578 | if (!(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST)) | 2574 | if (!(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST)) |
2579 | break; | 2575 | break; |
2580 | if (!in_interrupt()) { | 2576 | if (!in_interrupt()) |
2581 | set_current_state(TASK_INTERRUPTIBLE); | 2577 | schedule_timeout_interruptible(1); |
2582 | schedule_timeout(1); | ||
2583 | } | ||
2584 | } while (time_after(time, jiffies)); | 2578 | } while (time_after(time, jiffies)); |
2585 | 2579 | ||
2586 | hp100_orb(HP100_AUTO_MODE, MAC_CFG_3); /* Autosel back on */ | 2580 | hp100_orb(HP100_AUTO_MODE, MAC_CFG_3); /* Autosel back on */ |
@@ -2591,10 +2585,8 @@ static int hp100_down_vg_link(struct net_device *dev) | |||
2591 | do { | 2585 | do { |
2592 | if ((hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) == 0) | 2586 | if ((hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) == 0) |
2593 | break; | 2587 | break; |
2594 | if (!in_interrupt()) { | 2588 | if (!in_interrupt()) |
2595 | set_current_state(TASK_INTERRUPTIBLE); | 2589 | schedule_timeout_interruptible(1); |
2596 | schedule_timeout(1); | ||
2597 | } | ||
2598 | } while (time_after(time, jiffies)); | 2590 | } while (time_after(time, jiffies)); |
2599 | 2591 | ||
2600 | if (time_before_eq(time, jiffies)) { | 2592 | if (time_before_eq(time, jiffies)) { |
@@ -2606,10 +2598,8 @@ static int hp100_down_vg_link(struct net_device *dev) | |||
2606 | 2598 | ||
2607 | time = jiffies + (2 * HZ); /* This seems to take a while.... */ | 2599 | time = jiffies + (2 * HZ); /* This seems to take a while.... */ |
2608 | do { | 2600 | do { |
2609 | if (!in_interrupt()) { | 2601 | if (!in_interrupt()) |
2610 | set_current_state(TASK_INTERRUPTIBLE); | 2602 | schedule_timeout_interruptible(1); |
2611 | schedule_timeout(1); | ||
2612 | } | ||
2613 | } while (time_after(time, jiffies)); | 2603 | } while (time_after(time, jiffies)); |
2614 | 2604 | ||
2615 | return 0; | 2605 | return 0; |
@@ -2659,10 +2649,8 @@ static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin) | |||
2659 | do { | 2649 | do { |
2660 | if (~(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST)) | 2650 | if (~(hp100_inb(VG_LAN_CFG_1) & HP100_LINK_UP_ST)) |
2661 | break; | 2651 | break; |
2662 | if (!in_interrupt()) { | 2652 | if (!in_interrupt()) |
2663 | set_current_state(TASK_INTERRUPTIBLE); | 2653 | schedule_timeout_interruptible(1); |
2664 | schedule_timeout(1); | ||
2665 | } | ||
2666 | } while (time_after(time, jiffies)); | 2654 | } while (time_after(time, jiffies)); |
2667 | 2655 | ||
2668 | /* Start an addressed training and optionally request promiscuous port */ | 2656 | /* Start an addressed training and optionally request promiscuous port */ |
@@ -2697,10 +2685,8 @@ static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin) | |||
2697 | do { | 2685 | do { |
2698 | if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) | 2686 | if (hp100_inb(VG_LAN_CFG_1) & HP100_LINK_CABLE_ST) |
2699 | break; | 2687 | break; |
2700 | if (!in_interrupt()) { | 2688 | if (!in_interrupt()) |
2701 | set_current_state(TASK_INTERRUPTIBLE); | 2689 | schedule_timeout_interruptible(1); |
2702 | schedule_timeout(1); | ||
2703 | } | ||
2704 | } while (time_before(jiffies, time)); | 2690 | } while (time_before(jiffies, time)); |
2705 | 2691 | ||
2706 | if (time_after_eq(jiffies, time)) { | 2692 | if (time_after_eq(jiffies, time)) { |
@@ -2723,10 +2709,8 @@ static int hp100_login_to_vg_hub(struct net_device *dev, u_short force_relogin) | |||
2723 | #endif | 2709 | #endif |
2724 | break; | 2710 | break; |
2725 | } | 2711 | } |
2726 | if (!in_interrupt()) { | 2712 | if (!in_interrupt()) |
2727 | set_current_state(TASK_INTERRUPTIBLE); | 2713 | schedule_timeout_interruptible(1); |
2728 | schedule_timeout(1); | ||
2729 | } | ||
2730 | } while (time_after(time, jiffies)); | 2714 | } while (time_after(time, jiffies)); |
2731 | } | 2715 | } |
2732 | 2716 | ||
diff --git a/drivers/net/irda/stir4200.c b/drivers/net/irda/stir4200.c index 15f207323d97..3961a754e920 100644 --- a/drivers/net/irda/stir4200.c +++ b/drivers/net/irda/stir4200.c | |||
@@ -678,10 +678,9 @@ static void turnaround_delay(const struct stir_cb *stir, long us) | |||
678 | return; | 678 | return; |
679 | 679 | ||
680 | ticks = us / (1000000 / HZ); | 680 | ticks = us / (1000000 / HZ); |
681 | if (ticks > 0) { | 681 | if (ticks > 0) |
682 | current->state = TASK_INTERRUPTIBLE; | 682 | schedule_timeout_interruptible(1 + ticks); |
683 | schedule_timeout(1 + ticks); | 683 | else |
684 | } else | ||
685 | udelay(us); | 684 | udelay(us); |
686 | } | 685 | } |
687 | 686 | ||
diff --git a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c index 9d026ed77ddd..04e47189d830 100644 --- a/drivers/net/ixgb/ixgb_ethtool.c +++ b/drivers/net/ixgb/ixgb_ethtool.c | |||
@@ -645,11 +645,10 @@ ixgb_phys_id(struct net_device *netdev, uint32_t data) | |||
645 | 645 | ||
646 | mod_timer(&adapter->blink_timer, jiffies); | 646 | mod_timer(&adapter->blink_timer, jiffies); |
647 | 647 | ||
648 | set_current_state(TASK_INTERRUPTIBLE); | 648 | if (data) |
649 | if(data) | 649 | schedule_timeout_interruptible(data * HZ); |
650 | schedule_timeout(data * HZ); | ||
651 | else | 650 | else |
652 | schedule_timeout(MAX_SCHEDULE_TIMEOUT); | 651 | schedule_timeout_interruptible(MAX_SCHEDULE_TIMEOUT); |
653 | 652 | ||
654 | del_timer_sync(&adapter->blink_timer); | 653 | del_timer_sync(&adapter->blink_timer); |
655 | ixgb_led_off(&adapter->hw); | 654 | ixgb_led_off(&adapter->hw); |
@@ -723,6 +722,7 @@ struct ethtool_ops ixgb_ethtool_ops = { | |||
723 | .phys_id = ixgb_phys_id, | 722 | .phys_id = ixgb_phys_id, |
724 | .get_stats_count = ixgb_get_stats_count, | 723 | .get_stats_count = ixgb_get_stats_count, |
725 | .get_ethtool_stats = ixgb_get_ethtool_stats, | 724 | .get_ethtool_stats = ixgb_get_ethtool_stats, |
725 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
726 | }; | 726 | }; |
727 | 727 | ||
728 | void ixgb_set_ethtool_ops(struct net_device *netdev) | 728 | void ixgb_set_ethtool_ops(struct net_device *netdev) |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 89d6d69be382..176680cb153e 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
@@ -460,8 +460,9 @@ ixgb_probe(struct pci_dev *pdev, | |||
460 | } | 460 | } |
461 | 461 | ||
462 | ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr); | 462 | ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr); |
463 | memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len); | ||
463 | 464 | ||
464 | if(!is_valid_ether_addr(netdev->dev_addr)) { | 465 | if(!is_valid_ether_addr(netdev->perm_addr)) { |
465 | err = -EIO; | 466 | err = -EIO; |
466 | goto err_eeprom; | 467 | goto err_eeprom; |
467 | } | 468 | } |
diff --git a/drivers/net/lne390.c b/drivers/net/lne390.c index 27f0d8ac4c40..309d254842cf 100644 --- a/drivers/net/lne390.c +++ b/drivers/net/lne390.c | |||
@@ -298,7 +298,7 @@ static int __init lne390_probe1(struct net_device *dev, int ioaddr) | |||
298 | return 0; | 298 | return 0; |
299 | unmap: | 299 | unmap: |
300 | if (ei_status.reg0) | 300 | if (ei_status.reg0) |
301 | iounmap((void *)dev->mem_start); | 301 | iounmap(ei_status.mem); |
302 | cleanup: | 302 | cleanup: |
303 | free_irq(dev->irq, dev); | 303 | free_irq(dev->irq, dev); |
304 | return ret; | 304 | return ret; |
diff --git a/drivers/net/mii.c b/drivers/net/mii.c index c33cb3dc942b..e42aa797f08b 100644 --- a/drivers/net/mii.c +++ b/drivers/net/mii.c | |||
@@ -207,6 +207,20 @@ int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd) | |||
207 | return 0; | 207 | return 0; |
208 | } | 208 | } |
209 | 209 | ||
210 | int mii_check_gmii_support(struct mii_if_info *mii) | ||
211 | { | ||
212 | int reg; | ||
213 | |||
214 | reg = mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR); | ||
215 | if (reg & BMSR_ESTATEN) { | ||
216 | reg = mii->mdio_read(mii->dev, mii->phy_id, MII_ESTATUS); | ||
217 | if (reg & (ESTATUS_1000_TFULL | ESTATUS_1000_THALF)) | ||
218 | return 1; | ||
219 | } | ||
220 | |||
221 | return 0; | ||
222 | } | ||
223 | |||
210 | int mii_link_ok (struct mii_if_info *mii) | 224 | int mii_link_ok (struct mii_if_info *mii) |
211 | { | 225 | { |
212 | /* first, a dummy read, needed to latch some MII phys */ | 226 | /* first, a dummy read, needed to latch some MII phys */ |
@@ -394,5 +408,6 @@ EXPORT_SYMBOL(mii_ethtool_gset); | |||
394 | EXPORT_SYMBOL(mii_ethtool_sset); | 408 | EXPORT_SYMBOL(mii_ethtool_sset); |
395 | EXPORT_SYMBOL(mii_check_link); | 409 | EXPORT_SYMBOL(mii_check_link); |
396 | EXPORT_SYMBOL(mii_check_media); | 410 | EXPORT_SYMBOL(mii_check_media); |
411 | EXPORT_SYMBOL(mii_check_gmii_support); | ||
397 | EXPORT_SYMBOL(generic_mii_ioctl); | 412 | EXPORT_SYMBOL(generic_mii_ioctl); |
398 | 413 | ||
diff --git a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c index f1c01ac29102..e531a4eedfee 100644 --- a/drivers/net/ne2k-pci.c +++ b/drivers/net/ne2k-pci.c | |||
@@ -372,6 +372,7 @@ static int __devinit ne2k_pci_init_one (struct pci_dev *pdev, | |||
372 | printk("%2.2X%s", SA_prom[i], i == 5 ? ".\n": ":"); | 372 | printk("%2.2X%s", SA_prom[i], i == 5 ? ".\n": ":"); |
373 | dev->dev_addr[i] = SA_prom[i]; | 373 | dev->dev_addr[i] = SA_prom[i]; |
374 | } | 374 | } |
375 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
375 | 376 | ||
376 | return 0; | 377 | return 0; |
377 | 378 | ||
@@ -637,6 +638,7 @@ static struct ethtool_ops ne2k_pci_ethtool_ops = { | |||
637 | .get_drvinfo = ne2k_pci_get_drvinfo, | 638 | .get_drvinfo = ne2k_pci_get_drvinfo, |
638 | .get_tx_csum = ethtool_op_get_tx_csum, | 639 | .get_tx_csum = ethtool_op_get_tx_csum, |
639 | .get_sg = ethtool_op_get_sg, | 640 | .get_sg = ethtool_op_get_sg, |
641 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
640 | }; | 642 | }; |
641 | 643 | ||
642 | static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev) | 644 | static void __devexit ne2k_pci_remove_one (struct pci_dev *pdev) |
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index e64df4d0800b..ed72a23c85dd 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
@@ -1632,8 +1632,7 @@ static void ns83820_run_bist(struct net_device *ndev, const char *name, u32 enab | |||
1632 | timed_out = 1; | 1632 | timed_out = 1; |
1633 | break; | 1633 | break; |
1634 | } | 1634 | } |
1635 | set_current_state(TASK_UNINTERRUPTIBLE); | 1635 | schedule_timeout_uninterruptible(1); |
1636 | schedule_timeout(1); | ||
1637 | } | 1636 | } |
1638 | 1637 | ||
1639 | if (status & fail) | 1638 | if (status & fail) |
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index 113b68099216..70fe81a89df9 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -22,8 +22,8 @@ | |||
22 | *************************************************************************/ | 22 | *************************************************************************/ |
23 | 23 | ||
24 | #define DRV_NAME "pcnet32" | 24 | #define DRV_NAME "pcnet32" |
25 | #define DRV_VERSION "1.30j" | 25 | #define DRV_VERSION "1.31a" |
26 | #define DRV_RELDATE "29.04.2005" | 26 | #define DRV_RELDATE "12.Sep.2005" |
27 | #define PFX DRV_NAME ": " | 27 | #define PFX DRV_NAME ": " |
28 | 28 | ||
29 | static const char *version = | 29 | static const char *version = |
@@ -257,6 +257,9 @@ static int homepna[MAX_UNITS]; | |||
257 | * v1.30h 24 Jun 2004 Don Fry correctly select auto, speed, duplex in bcr32. | 257 | * v1.30h 24 Jun 2004 Don Fry correctly select auto, speed, duplex in bcr32. |
258 | * v1.30i 28 Jun 2004 Don Fry change to use module_param. | 258 | * v1.30i 28 Jun 2004 Don Fry change to use module_param. |
259 | * v1.30j 29 Apr 2005 Don Fry fix skb/map leak with loopback test. | 259 | * v1.30j 29 Apr 2005 Don Fry fix skb/map leak with loopback test. |
260 | * v1.31 02 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> added set_ringparam(). | ||
261 | * v1.31a 12 Sep 2005 Hubert WS Lin <wslin@tw.ibm.c0m> set min ring size to 4 | ||
262 | * to allow loopback test to work unchanged. | ||
260 | */ | 263 | */ |
261 | 264 | ||
262 | 265 | ||
@@ -266,17 +269,17 @@ static int homepna[MAX_UNITS]; | |||
266 | * That translates to 2 (4 == 2^^2) and 4 (16 == 2^^4). | 269 | * That translates to 2 (4 == 2^^2) and 4 (16 == 2^^4). |
267 | */ | 270 | */ |
268 | #ifndef PCNET32_LOG_TX_BUFFERS | 271 | #ifndef PCNET32_LOG_TX_BUFFERS |
269 | #define PCNET32_LOG_TX_BUFFERS 4 | 272 | #define PCNET32_LOG_TX_BUFFERS 4 |
270 | #define PCNET32_LOG_RX_BUFFERS 5 | 273 | #define PCNET32_LOG_RX_BUFFERS 5 |
274 | #define PCNET32_LOG_MAX_TX_BUFFERS 9 /* 2^9 == 512 */ | ||
275 | #define PCNET32_LOG_MAX_RX_BUFFERS 9 | ||
271 | #endif | 276 | #endif |
272 | 277 | ||
273 | #define TX_RING_SIZE (1 << (PCNET32_LOG_TX_BUFFERS)) | 278 | #define TX_RING_SIZE (1 << (PCNET32_LOG_TX_BUFFERS)) |
274 | #define TX_RING_MOD_MASK (TX_RING_SIZE - 1) | 279 | #define TX_MAX_RING_SIZE (1 << (PCNET32_LOG_MAX_TX_BUFFERS)) |
275 | #define TX_RING_LEN_BITS ((PCNET32_LOG_TX_BUFFERS) << 12) | ||
276 | 280 | ||
277 | #define RX_RING_SIZE (1 << (PCNET32_LOG_RX_BUFFERS)) | 281 | #define RX_RING_SIZE (1 << (PCNET32_LOG_RX_BUFFERS)) |
278 | #define RX_RING_MOD_MASK (RX_RING_SIZE - 1) | 282 | #define RX_MAX_RING_SIZE (1 << (PCNET32_LOG_MAX_RX_BUFFERS)) |
279 | #define RX_RING_LEN_BITS ((PCNET32_LOG_RX_BUFFERS) << 4) | ||
280 | 283 | ||
281 | #define PKT_BUF_SZ 1544 | 284 | #define PKT_BUF_SZ 1544 |
282 | 285 | ||
@@ -334,14 +337,14 @@ struct pcnet32_access { | |||
334 | }; | 337 | }; |
335 | 338 | ||
336 | /* | 339 | /* |
337 | * The first three fields of pcnet32_private are read by the ethernet device | 340 | * The first field of pcnet32_private is read by the ethernet device |
338 | * so we allocate the structure should be allocated by pci_alloc_consistent(). | 341 | * so the structure should be allocated using pci_alloc_consistent(). |
339 | */ | 342 | */ |
340 | struct pcnet32_private { | 343 | struct pcnet32_private { |
341 | /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */ | ||
342 | struct pcnet32_rx_head rx_ring[RX_RING_SIZE]; | ||
343 | struct pcnet32_tx_head tx_ring[TX_RING_SIZE]; | ||
344 | struct pcnet32_init_block init_block; | 344 | struct pcnet32_init_block init_block; |
345 | /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */ | ||
346 | struct pcnet32_rx_head *rx_ring; | ||
347 | struct pcnet32_tx_head *tx_ring; | ||
345 | dma_addr_t dma_addr; /* DMA address of beginning of this | 348 | dma_addr_t dma_addr; /* DMA address of beginning of this |
346 | object, returned by | 349 | object, returned by |
347 | pci_alloc_consistent */ | 350 | pci_alloc_consistent */ |
@@ -349,13 +352,21 @@ struct pcnet32_private { | |||
349 | structure */ | 352 | structure */ |
350 | const char *name; | 353 | const char *name; |
351 | /* The saved address of a sent-in-place packet/buffer, for skfree(). */ | 354 | /* The saved address of a sent-in-place packet/buffer, for skfree(). */ |
352 | struct sk_buff *tx_skbuff[TX_RING_SIZE]; | 355 | struct sk_buff **tx_skbuff; |
353 | struct sk_buff *rx_skbuff[RX_RING_SIZE]; | 356 | struct sk_buff **rx_skbuff; |
354 | dma_addr_t tx_dma_addr[TX_RING_SIZE]; | 357 | dma_addr_t *tx_dma_addr; |
355 | dma_addr_t rx_dma_addr[RX_RING_SIZE]; | 358 | dma_addr_t *rx_dma_addr; |
356 | struct pcnet32_access a; | 359 | struct pcnet32_access a; |
357 | spinlock_t lock; /* Guard lock */ | 360 | spinlock_t lock; /* Guard lock */ |
358 | unsigned int cur_rx, cur_tx; /* The next free ring entry */ | 361 | unsigned int cur_rx, cur_tx; /* The next free ring entry */ |
362 | unsigned int rx_ring_size; /* current rx ring size */ | ||
363 | unsigned int tx_ring_size; /* current tx ring size */ | ||
364 | unsigned int rx_mod_mask; /* rx ring modular mask */ | ||
365 | unsigned int tx_mod_mask; /* tx ring modular mask */ | ||
366 | unsigned short rx_len_bits; | ||
367 | unsigned short tx_len_bits; | ||
368 | dma_addr_t rx_ring_dma_addr; | ||
369 | dma_addr_t tx_ring_dma_addr; | ||
359 | unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ | 370 | unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ |
360 | struct net_device_stats stats; | 371 | struct net_device_stats stats; |
361 | char tx_full; | 372 | char tx_full; |
@@ -397,6 +408,9 @@ static int pcnet32_get_regs_len(struct net_device *dev); | |||
397 | static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, | 408 | static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, |
398 | void *ptr); | 409 | void *ptr); |
399 | static void pcnet32_purge_tx_ring(struct net_device *dev); | 410 | static void pcnet32_purge_tx_ring(struct net_device *dev); |
411 | static int pcnet32_alloc_ring(struct net_device *dev); | ||
412 | static void pcnet32_free_ring(struct net_device *dev); | ||
413 | |||
400 | 414 | ||
401 | enum pci_flags_bit { | 415 | enum pci_flags_bit { |
402 | PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, | 416 | PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4, |
@@ -613,10 +627,62 @@ static void pcnet32_get_ringparam(struct net_device *dev, struct ethtool_ringpar | |||
613 | { | 627 | { |
614 | struct pcnet32_private *lp = dev->priv; | 628 | struct pcnet32_private *lp = dev->priv; |
615 | 629 | ||
616 | ering->tx_max_pending = TX_RING_SIZE - 1; | 630 | ering->tx_max_pending = TX_MAX_RING_SIZE - 1; |
617 | ering->tx_pending = lp->cur_tx - lp->dirty_tx; | 631 | ering->tx_pending = lp->tx_ring_size - 1; |
618 | ering->rx_max_pending = RX_RING_SIZE - 1; | 632 | ering->rx_max_pending = RX_MAX_RING_SIZE - 1; |
619 | ering->rx_pending = lp->cur_rx & RX_RING_MOD_MASK; | 633 | ering->rx_pending = lp->rx_ring_size - 1; |
634 | } | ||
635 | |||
636 | static int pcnet32_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) | ||
637 | { | ||
638 | struct pcnet32_private *lp = dev->priv; | ||
639 | unsigned long flags; | ||
640 | int i; | ||
641 | |||
642 | if (ering->rx_mini_pending || ering->rx_jumbo_pending) | ||
643 | return -EINVAL; | ||
644 | |||
645 | if (netif_running(dev)) | ||
646 | pcnet32_close(dev); | ||
647 | |||
648 | spin_lock_irqsave(&lp->lock, flags); | ||
649 | pcnet32_free_ring(dev); | ||
650 | lp->tx_ring_size = min(ering->tx_pending, (unsigned int) TX_MAX_RING_SIZE); | ||
651 | lp->rx_ring_size = min(ering->rx_pending, (unsigned int) RX_MAX_RING_SIZE); | ||
652 | |||
653 | /* set the minimum ring size to 4, to allow the loopback test to work | ||
654 | * unchanged. | ||
655 | */ | ||
656 | for (i = 2; i <= PCNET32_LOG_MAX_TX_BUFFERS; i++) { | ||
657 | if (lp->tx_ring_size <= (1 << i)) | ||
658 | break; | ||
659 | } | ||
660 | lp->tx_ring_size = (1 << i); | ||
661 | lp->tx_mod_mask = lp->tx_ring_size - 1; | ||
662 | lp->tx_len_bits = (i << 12); | ||
663 | |||
664 | for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { | ||
665 | if (lp->rx_ring_size <= (1 << i)) | ||
666 | break; | ||
667 | } | ||
668 | lp->rx_ring_size = (1 << i); | ||
669 | lp->rx_mod_mask = lp->rx_ring_size - 1; | ||
670 | lp->rx_len_bits = (i << 4); | ||
671 | |||
672 | if (pcnet32_alloc_ring(dev)) { | ||
673 | pcnet32_free_ring(dev); | ||
674 | return -ENOMEM; | ||
675 | } | ||
676 | |||
677 | spin_unlock_irqrestore(&lp->lock, flags); | ||
678 | |||
679 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
680 | printk(KERN_INFO PFX "Ring Param Settings: RX: %d, TX: %d\n", lp->rx_ring_size, lp->tx_ring_size); | ||
681 | |||
682 | if (netif_running(dev)) | ||
683 | pcnet32_open(dev); | ||
684 | |||
685 | return 0; | ||
620 | } | 686 | } |
621 | 687 | ||
622 | static void pcnet32_get_strings(struct net_device *dev, u32 stringset, u8 *data) | 688 | static void pcnet32_get_strings(struct net_device *dev, u32 stringset, u8 *data) |
@@ -948,6 +1014,7 @@ static struct ethtool_ops pcnet32_ethtool_ops = { | |||
948 | .nway_reset = pcnet32_nway_reset, | 1014 | .nway_reset = pcnet32_nway_reset, |
949 | .get_link = pcnet32_get_link, | 1015 | .get_link = pcnet32_get_link, |
950 | .get_ringparam = pcnet32_get_ringparam, | 1016 | .get_ringparam = pcnet32_get_ringparam, |
1017 | .set_ringparam = pcnet32_set_ringparam, | ||
951 | .get_tx_csum = ethtool_op_get_tx_csum, | 1018 | .get_tx_csum = ethtool_op_get_tx_csum, |
952 | .get_sg = ethtool_op_get_sg, | 1019 | .get_sg = ethtool_op_get_sg, |
953 | .get_tso = ethtool_op_get_tso, | 1020 | .get_tso = ethtool_op_get_tso, |
@@ -957,6 +1024,7 @@ static struct ethtool_ops pcnet32_ethtool_ops = { | |||
957 | .phys_id = pcnet32_phys_id, | 1024 | .phys_id = pcnet32_phys_id, |
958 | .get_regs_len = pcnet32_get_regs_len, | 1025 | .get_regs_len = pcnet32_get_regs_len, |
959 | .get_regs = pcnet32_get_regs, | 1026 | .get_regs = pcnet32_get_regs, |
1027 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
960 | }; | 1028 | }; |
961 | 1029 | ||
962 | /* only probes for non-PCI devices, the rest are handled by | 1030 | /* only probes for non-PCI devices, the rest are handled by |
@@ -1185,9 +1253,10 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1185 | memcpy(dev->dev_addr, promaddr, 6); | 1253 | memcpy(dev->dev_addr, promaddr, 6); |
1186 | } | 1254 | } |
1187 | } | 1255 | } |
1256 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
1188 | 1257 | ||
1189 | /* if the ethernet address is not valid, force to 00:00:00:00:00:00 */ | 1258 | /* if the ethernet address is not valid, force to 00:00:00:00:00:00 */ |
1190 | if (!is_valid_ether_addr(dev->dev_addr)) | 1259 | if (!is_valid_ether_addr(dev->perm_addr)) |
1191 | memset(dev->dev_addr, 0, sizeof(dev->dev_addr)); | 1260 | memset(dev->dev_addr, 0, sizeof(dev->dev_addr)); |
1192 | 1261 | ||
1193 | if (pcnet32_debug & NETIF_MSG_PROBE) { | 1262 | if (pcnet32_debug & NETIF_MSG_PROBE) { |
@@ -1239,6 +1308,12 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1239 | dev->priv = lp; | 1308 | dev->priv = lp; |
1240 | lp->name = chipname; | 1309 | lp->name = chipname; |
1241 | lp->shared_irq = shared; | 1310 | lp->shared_irq = shared; |
1311 | lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ | ||
1312 | lp->rx_ring_size = RX_RING_SIZE; /* default rx ring size */ | ||
1313 | lp->tx_mod_mask = lp->tx_ring_size - 1; | ||
1314 | lp->rx_mod_mask = lp->rx_ring_size - 1; | ||
1315 | lp->tx_len_bits = (PCNET32_LOG_TX_BUFFERS << 12); | ||
1316 | lp->rx_len_bits = (PCNET32_LOG_RX_BUFFERS << 4); | ||
1242 | lp->mii_if.full_duplex = fdx; | 1317 | lp->mii_if.full_duplex = fdx; |
1243 | lp->mii_if.phy_id_mask = 0x1f; | 1318 | lp->mii_if.phy_id_mask = 0x1f; |
1244 | lp->mii_if.reg_num_mask = 0x1f; | 1319 | lp->mii_if.reg_num_mask = 0x1f; |
@@ -1265,21 +1340,23 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1265 | } | 1340 | } |
1266 | lp->a = *a; | 1341 | lp->a = *a; |
1267 | 1342 | ||
1343 | if (pcnet32_alloc_ring(dev)) { | ||
1344 | ret = -ENOMEM; | ||
1345 | goto err_free_ring; | ||
1346 | } | ||
1268 | /* detect special T1/E1 WAN card by checking for MAC address */ | 1347 | /* detect special T1/E1 WAN card by checking for MAC address */ |
1269 | if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 | 1348 | if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 |
1270 | && dev->dev_addr[2] == 0x75) | 1349 | && dev->dev_addr[2] == 0x75) |
1271 | lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; | 1350 | lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; |
1272 | 1351 | ||
1273 | lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */ | 1352 | lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */ |
1274 | lp->init_block.tlen_rlen = le16_to_cpu(TX_RING_LEN_BITS | RX_RING_LEN_BITS); | 1353 | lp->init_block.tlen_rlen = le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); |
1275 | for (i = 0; i < 6; i++) | 1354 | for (i = 0; i < 6; i++) |
1276 | lp->init_block.phys_addr[i] = dev->dev_addr[i]; | 1355 | lp->init_block.phys_addr[i] = dev->dev_addr[i]; |
1277 | lp->init_block.filter[0] = 0x00000000; | 1356 | lp->init_block.filter[0] = 0x00000000; |
1278 | lp->init_block.filter[1] = 0x00000000; | 1357 | lp->init_block.filter[1] = 0x00000000; |
1279 | lp->init_block.rx_ring = (u32)le32_to_cpu(lp->dma_addr + | 1358 | lp->init_block.rx_ring = (u32)le32_to_cpu(lp->rx_ring_dma_addr); |
1280 | offsetof(struct pcnet32_private, rx_ring)); | 1359 | lp->init_block.tx_ring = (u32)le32_to_cpu(lp->tx_ring_dma_addr); |
1281 | lp->init_block.tx_ring = (u32)le32_to_cpu(lp->dma_addr + | ||
1282 | offsetof(struct pcnet32_private, tx_ring)); | ||
1283 | 1360 | ||
1284 | /* switch pcnet32 to 32bit mode */ | 1361 | /* switch pcnet32 to 32bit mode */ |
1285 | a->write_bcr(ioaddr, 20, 2); | 1362 | a->write_bcr(ioaddr, 20, 2); |
@@ -1310,7 +1387,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1310 | if (pcnet32_debug & NETIF_MSG_PROBE) | 1387 | if (pcnet32_debug & NETIF_MSG_PROBE) |
1311 | printk(", failed to detect IRQ line.\n"); | 1388 | printk(", failed to detect IRQ line.\n"); |
1312 | ret = -ENODEV; | 1389 | ret = -ENODEV; |
1313 | goto err_free_consistent; | 1390 | goto err_free_ring; |
1314 | } | 1391 | } |
1315 | if (pcnet32_debug & NETIF_MSG_PROBE) | 1392 | if (pcnet32_debug & NETIF_MSG_PROBE) |
1316 | printk(", probed IRQ %d.\n", dev->irq); | 1393 | printk(", probed IRQ %d.\n", dev->irq); |
@@ -1341,7 +1418,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1341 | 1418 | ||
1342 | /* Fill in the generic fields of the device structure. */ | 1419 | /* Fill in the generic fields of the device structure. */ |
1343 | if (register_netdev(dev)) | 1420 | if (register_netdev(dev)) |
1344 | goto err_free_consistent; | 1421 | goto err_free_ring; |
1345 | 1422 | ||
1346 | if (pdev) { | 1423 | if (pdev) { |
1347 | pci_set_drvdata(pdev, dev); | 1424 | pci_set_drvdata(pdev, dev); |
@@ -1359,6 +1436,8 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1359 | 1436 | ||
1360 | return 0; | 1437 | return 0; |
1361 | 1438 | ||
1439 | err_free_ring: | ||
1440 | pcnet32_free_ring(dev); | ||
1362 | err_free_consistent: | 1441 | err_free_consistent: |
1363 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); | 1442 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); |
1364 | err_free_netdev: | 1443 | err_free_netdev: |
@@ -1369,6 +1448,86 @@ err_release_region: | |||
1369 | } | 1448 | } |
1370 | 1449 | ||
1371 | 1450 | ||
1451 | static int pcnet32_alloc_ring(struct net_device *dev) | ||
1452 | { | ||
1453 | struct pcnet32_private *lp = dev->priv; | ||
1454 | |||
1455 | if ((lp->tx_ring = pci_alloc_consistent(lp->pci_dev, sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, | ||
1456 | &lp->tx_ring_dma_addr)) == NULL) { | ||
1457 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1458 | printk(KERN_ERR PFX "Consistent memory allocation failed.\n"); | ||
1459 | return -ENOMEM; | ||
1460 | } | ||
1461 | |||
1462 | if ((lp->rx_ring = pci_alloc_consistent(lp->pci_dev, sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, | ||
1463 | &lp->rx_ring_dma_addr)) == NULL) { | ||
1464 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1465 | printk(KERN_ERR PFX "Consistent memory allocation failed.\n"); | ||
1466 | return -ENOMEM; | ||
1467 | } | ||
1468 | |||
1469 | if (!(lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, GFP_ATOMIC))) { | ||
1470 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1471 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | ||
1472 | return -ENOMEM; | ||
1473 | } | ||
1474 | memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); | ||
1475 | |||
1476 | if (!(lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, GFP_ATOMIC))) { | ||
1477 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1478 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | ||
1479 | return -ENOMEM; | ||
1480 | } | ||
1481 | memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); | ||
1482 | |||
1483 | if (!(lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, GFP_ATOMIC))) { | ||
1484 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1485 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | ||
1486 | return -ENOMEM; | ||
1487 | } | ||
1488 | memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); | ||
1489 | |||
1490 | if (!(lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, GFP_ATOMIC))) { | ||
1491 | if (pcnet32_debug & NETIF_MSG_DRV) | ||
1492 | printk(KERN_ERR PFX "Memory allocation failed.\n"); | ||
1493 | return -ENOMEM; | ||
1494 | } | ||
1495 | memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); | ||
1496 | |||
1497 | return 0; | ||
1498 | } | ||
1499 | |||
1500 | |||
1501 | static void pcnet32_free_ring(struct net_device *dev) | ||
1502 | { | ||
1503 | struct pcnet32_private *lp = dev->priv; | ||
1504 | |||
1505 | kfree(lp->tx_skbuff); | ||
1506 | lp->tx_skbuff = NULL; | ||
1507 | |||
1508 | kfree(lp->rx_skbuff); | ||
1509 | lp->rx_skbuff = NULL; | ||
1510 | |||
1511 | kfree(lp->tx_dma_addr); | ||
1512 | lp->tx_dma_addr = NULL; | ||
1513 | |||
1514 | kfree(lp->rx_dma_addr); | ||
1515 | lp->rx_dma_addr = NULL; | ||
1516 | |||
1517 | if (lp->tx_ring) { | ||
1518 | pci_free_consistent(lp->pci_dev, sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, | ||
1519 | lp->tx_ring, lp->tx_ring_dma_addr); | ||
1520 | lp->tx_ring = NULL; | ||
1521 | } | ||
1522 | |||
1523 | if (lp->rx_ring) { | ||
1524 | pci_free_consistent(lp->pci_dev, sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, | ||
1525 | lp->rx_ring, lp->rx_ring_dma_addr); | ||
1526 | lp->rx_ring = NULL; | ||
1527 | } | ||
1528 | } | ||
1529 | |||
1530 | |||
1372 | static int | 1531 | static int |
1373 | pcnet32_open(struct net_device *dev) | 1532 | pcnet32_open(struct net_device *dev) |
1374 | { | 1533 | { |
@@ -1400,8 +1559,8 @@ pcnet32_open(struct net_device *dev) | |||
1400 | if (netif_msg_ifup(lp)) | 1559 | if (netif_msg_ifup(lp)) |
1401 | printk(KERN_DEBUG "%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n", | 1560 | printk(KERN_DEBUG "%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n", |
1402 | dev->name, dev->irq, | 1561 | dev->name, dev->irq, |
1403 | (u32) (lp->dma_addr + offsetof(struct pcnet32_private, tx_ring)), | 1562 | (u32) (lp->tx_ring_dma_addr), |
1404 | (u32) (lp->dma_addr + offsetof(struct pcnet32_private, rx_ring)), | 1563 | (u32) (lp->rx_ring_dma_addr), |
1405 | (u32) (lp->dma_addr + offsetof(struct pcnet32_private, init_block))); | 1564 | (u32) (lp->dma_addr + offsetof(struct pcnet32_private, init_block))); |
1406 | 1565 | ||
1407 | /* set/reset autoselect bit */ | 1566 | /* set/reset autoselect bit */ |
@@ -1521,7 +1680,7 @@ pcnet32_open(struct net_device *dev) | |||
1521 | 1680 | ||
1522 | err_free_ring: | 1681 | err_free_ring: |
1523 | /* free any allocated skbuffs */ | 1682 | /* free any allocated skbuffs */ |
1524 | for (i = 0; i < RX_RING_SIZE; i++) { | 1683 | for (i = 0; i < lp->rx_ring_size; i++) { |
1525 | lp->rx_ring[i].status = 0; | 1684 | lp->rx_ring[i].status = 0; |
1526 | if (lp->rx_skbuff[i]) { | 1685 | if (lp->rx_skbuff[i]) { |
1527 | pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], PKT_BUF_SZ-2, | 1686 | pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], PKT_BUF_SZ-2, |
@@ -1531,6 +1690,9 @@ err_free_ring: | |||
1531 | lp->rx_skbuff[i] = NULL; | 1690 | lp->rx_skbuff[i] = NULL; |
1532 | lp->rx_dma_addr[i] = 0; | 1691 | lp->rx_dma_addr[i] = 0; |
1533 | } | 1692 | } |
1693 | |||
1694 | pcnet32_free_ring(dev); | ||
1695 | |||
1534 | /* | 1696 | /* |
1535 | * Switch back to 16bit mode to avoid problems with dumb | 1697 | * Switch back to 16bit mode to avoid problems with dumb |
1536 | * DOS packet driver after a warm reboot | 1698 | * DOS packet driver after a warm reboot |
@@ -1562,7 +1724,7 @@ pcnet32_purge_tx_ring(struct net_device *dev) | |||
1562 | struct pcnet32_private *lp = dev->priv; | 1724 | struct pcnet32_private *lp = dev->priv; |
1563 | int i; | 1725 | int i; |
1564 | 1726 | ||
1565 | for (i = 0; i < TX_RING_SIZE; i++) { | 1727 | for (i = 0; i < lp->tx_ring_size; i++) { |
1566 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ | 1728 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ |
1567 | wmb(); /* Make sure adapter sees owner change */ | 1729 | wmb(); /* Make sure adapter sees owner change */ |
1568 | if (lp->tx_skbuff[i]) { | 1730 | if (lp->tx_skbuff[i]) { |
@@ -1587,7 +1749,7 @@ pcnet32_init_ring(struct net_device *dev) | |||
1587 | lp->cur_rx = lp->cur_tx = 0; | 1749 | lp->cur_rx = lp->cur_tx = 0; |
1588 | lp->dirty_rx = lp->dirty_tx = 0; | 1750 | lp->dirty_rx = lp->dirty_tx = 0; |
1589 | 1751 | ||
1590 | for (i = 0; i < RX_RING_SIZE; i++) { | 1752 | for (i = 0; i < lp->rx_ring_size; i++) { |
1591 | struct sk_buff *rx_skbuff = lp->rx_skbuff[i]; | 1753 | struct sk_buff *rx_skbuff = lp->rx_skbuff[i]; |
1592 | if (rx_skbuff == NULL) { | 1754 | if (rx_skbuff == NULL) { |
1593 | if (!(rx_skbuff = lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) { | 1755 | if (!(rx_skbuff = lp->rx_skbuff[i] = dev_alloc_skb (PKT_BUF_SZ))) { |
@@ -1611,20 +1773,18 @@ pcnet32_init_ring(struct net_device *dev) | |||
1611 | } | 1773 | } |
1612 | /* The Tx buffer address is filled in as needed, but we do need to clear | 1774 | /* The Tx buffer address is filled in as needed, but we do need to clear |
1613 | * the upper ownership bit. */ | 1775 | * the upper ownership bit. */ |
1614 | for (i = 0; i < TX_RING_SIZE; i++) { | 1776 | for (i = 0; i < lp->tx_ring_size; i++) { |
1615 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ | 1777 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ |
1616 | wmb(); /* Make sure adapter sees owner change */ | 1778 | wmb(); /* Make sure adapter sees owner change */ |
1617 | lp->tx_ring[i].base = 0; | 1779 | lp->tx_ring[i].base = 0; |
1618 | lp->tx_dma_addr[i] = 0; | 1780 | lp->tx_dma_addr[i] = 0; |
1619 | } | 1781 | } |
1620 | 1782 | ||
1621 | lp->init_block.tlen_rlen = le16_to_cpu(TX_RING_LEN_BITS | RX_RING_LEN_BITS); | 1783 | lp->init_block.tlen_rlen = le16_to_cpu(lp->tx_len_bits | lp->rx_len_bits); |
1622 | for (i = 0; i < 6; i++) | 1784 | for (i = 0; i < 6; i++) |
1623 | lp->init_block.phys_addr[i] = dev->dev_addr[i]; | 1785 | lp->init_block.phys_addr[i] = dev->dev_addr[i]; |
1624 | lp->init_block.rx_ring = (u32)le32_to_cpu(lp->dma_addr + | 1786 | lp->init_block.rx_ring = (u32)le32_to_cpu(lp->rx_ring_dma_addr); |
1625 | offsetof(struct pcnet32_private, rx_ring)); | 1787 | lp->init_block.tx_ring = (u32)le32_to_cpu(lp->tx_ring_dma_addr); |
1626 | lp->init_block.tx_ring = (u32)le32_to_cpu(lp->dma_addr + | ||
1627 | offsetof(struct pcnet32_private, tx_ring)); | ||
1628 | wmb(); /* Make sure all changes are visible */ | 1788 | wmb(); /* Make sure all changes are visible */ |
1629 | return 0; | 1789 | return 0; |
1630 | } | 1790 | } |
@@ -1682,13 +1842,13 @@ pcnet32_tx_timeout (struct net_device *dev) | |||
1682 | printk(KERN_DEBUG " Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.", | 1842 | printk(KERN_DEBUG " Ring data dump: dirty_tx %d cur_tx %d%s cur_rx %d.", |
1683 | lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "", | 1843 | lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "", |
1684 | lp->cur_rx); | 1844 | lp->cur_rx); |
1685 | for (i = 0 ; i < RX_RING_SIZE; i++) | 1845 | for (i = 0 ; i < lp->rx_ring_size; i++) |
1686 | printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", | 1846 | printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", |
1687 | le32_to_cpu(lp->rx_ring[i].base), | 1847 | le32_to_cpu(lp->rx_ring[i].base), |
1688 | (-le16_to_cpu(lp->rx_ring[i].buf_length)) & 0xffff, | 1848 | (-le16_to_cpu(lp->rx_ring[i].buf_length)) & 0xffff, |
1689 | le32_to_cpu(lp->rx_ring[i].msg_length), | 1849 | le32_to_cpu(lp->rx_ring[i].msg_length), |
1690 | le16_to_cpu(lp->rx_ring[i].status)); | 1850 | le16_to_cpu(lp->rx_ring[i].status)); |
1691 | for (i = 0 ; i < TX_RING_SIZE; i++) | 1851 | for (i = 0 ; i < lp->tx_ring_size; i++) |
1692 | printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", | 1852 | printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", |
1693 | le32_to_cpu(lp->tx_ring[i].base), | 1853 | le32_to_cpu(lp->tx_ring[i].base), |
1694 | (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, | 1854 | (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, |
@@ -1729,7 +1889,7 @@ pcnet32_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1729 | /* Fill in a Tx ring entry */ | 1889 | /* Fill in a Tx ring entry */ |
1730 | 1890 | ||
1731 | /* Mask to ring buffer boundary. */ | 1891 | /* Mask to ring buffer boundary. */ |
1732 | entry = lp->cur_tx & TX_RING_MOD_MASK; | 1892 | entry = lp->cur_tx & lp->tx_mod_mask; |
1733 | 1893 | ||
1734 | /* Caution: the write order is important here, set the status | 1894 | /* Caution: the write order is important here, set the status |
1735 | * with the "ownership" bits last. */ | 1895 | * with the "ownership" bits last. */ |
@@ -1753,7 +1913,7 @@ pcnet32_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1753 | 1913 | ||
1754 | dev->trans_start = jiffies; | 1914 | dev->trans_start = jiffies; |
1755 | 1915 | ||
1756 | if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base != 0) { | 1916 | if (lp->tx_ring[(entry+1) & lp->tx_mod_mask].base != 0) { |
1757 | lp->tx_full = 1; | 1917 | lp->tx_full = 1; |
1758 | netif_stop_queue(dev); | 1918 | netif_stop_queue(dev); |
1759 | } | 1919 | } |
@@ -1806,7 +1966,7 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs) | |||
1806 | int delta; | 1966 | int delta; |
1807 | 1967 | ||
1808 | while (dirty_tx != lp->cur_tx) { | 1968 | while (dirty_tx != lp->cur_tx) { |
1809 | int entry = dirty_tx & TX_RING_MOD_MASK; | 1969 | int entry = dirty_tx & lp->tx_mod_mask; |
1810 | int status = (short)le16_to_cpu(lp->tx_ring[entry].status); | 1970 | int status = (short)le16_to_cpu(lp->tx_ring[entry].status); |
1811 | 1971 | ||
1812 | if (status < 0) | 1972 | if (status < 0) |
@@ -1864,18 +2024,18 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs) | |||
1864 | dirty_tx++; | 2024 | dirty_tx++; |
1865 | } | 2025 | } |
1866 | 2026 | ||
1867 | delta = (lp->cur_tx - dirty_tx) & (TX_RING_MOD_MASK + TX_RING_SIZE); | 2027 | delta = (lp->cur_tx - dirty_tx) & (lp->tx_mod_mask + lp->tx_ring_size); |
1868 | if (delta > TX_RING_SIZE) { | 2028 | if (delta > lp->tx_ring_size) { |
1869 | if (netif_msg_drv(lp)) | 2029 | if (netif_msg_drv(lp)) |
1870 | printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", | 2030 | printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", |
1871 | dev->name, dirty_tx, lp->cur_tx, lp->tx_full); | 2031 | dev->name, dirty_tx, lp->cur_tx, lp->tx_full); |
1872 | dirty_tx += TX_RING_SIZE; | 2032 | dirty_tx += lp->tx_ring_size; |
1873 | delta -= TX_RING_SIZE; | 2033 | delta -= lp->tx_ring_size; |
1874 | } | 2034 | } |
1875 | 2035 | ||
1876 | if (lp->tx_full && | 2036 | if (lp->tx_full && |
1877 | netif_queue_stopped(dev) && | 2037 | netif_queue_stopped(dev) && |
1878 | delta < TX_RING_SIZE - 2) { | 2038 | delta < lp->tx_ring_size - 2) { |
1879 | /* The ring is no longer full, clear tbusy. */ | 2039 | /* The ring is no longer full, clear tbusy. */ |
1880 | lp->tx_full = 0; | 2040 | lp->tx_full = 0; |
1881 | netif_wake_queue (dev); | 2041 | netif_wake_queue (dev); |
@@ -1932,8 +2092,8 @@ static int | |||
1932 | pcnet32_rx(struct net_device *dev) | 2092 | pcnet32_rx(struct net_device *dev) |
1933 | { | 2093 | { |
1934 | struct pcnet32_private *lp = dev->priv; | 2094 | struct pcnet32_private *lp = dev->priv; |
1935 | int entry = lp->cur_rx & RX_RING_MOD_MASK; | 2095 | int entry = lp->cur_rx & lp->rx_mod_mask; |
1936 | int boguscnt = RX_RING_SIZE / 2; | 2096 | int boguscnt = lp->rx_ring_size / 2; |
1937 | 2097 | ||
1938 | /* If we own the next entry, it's a new packet. Send it up. */ | 2098 | /* If we own the next entry, it's a new packet. Send it up. */ |
1939 | while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { | 2099 | while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { |
@@ -1998,12 +2158,12 @@ pcnet32_rx(struct net_device *dev) | |||
1998 | if (netif_msg_drv(lp)) | 2158 | if (netif_msg_drv(lp)) |
1999 | printk(KERN_ERR "%s: Memory squeeze, deferring packet.\n", | 2159 | printk(KERN_ERR "%s: Memory squeeze, deferring packet.\n", |
2000 | dev->name); | 2160 | dev->name); |
2001 | for (i = 0; i < RX_RING_SIZE; i++) | 2161 | for (i = 0; i < lp->rx_ring_size; i++) |
2002 | if ((short)le16_to_cpu(lp->rx_ring[(entry+i) | 2162 | if ((short)le16_to_cpu(lp->rx_ring[(entry+i) |
2003 | & RX_RING_MOD_MASK].status) < 0) | 2163 | & lp->rx_mod_mask].status) < 0) |
2004 | break; | 2164 | break; |
2005 | 2165 | ||
2006 | if (i > RX_RING_SIZE -2) { | 2166 | if (i > lp->rx_ring_size -2) { |
2007 | lp->stats.rx_dropped++; | 2167 | lp->stats.rx_dropped++; |
2008 | lp->rx_ring[entry].status |= le16_to_cpu(0x8000); | 2168 | lp->rx_ring[entry].status |= le16_to_cpu(0x8000); |
2009 | wmb(); /* Make sure adapter sees owner change */ | 2169 | wmb(); /* Make sure adapter sees owner change */ |
@@ -2041,7 +2201,7 @@ pcnet32_rx(struct net_device *dev) | |||
2041 | lp->rx_ring[entry].buf_length = le16_to_cpu(2-PKT_BUF_SZ); | 2201 | lp->rx_ring[entry].buf_length = le16_to_cpu(2-PKT_BUF_SZ); |
2042 | wmb(); /* Make sure owner changes after all others are visible */ | 2202 | wmb(); /* Make sure owner changes after all others are visible */ |
2043 | lp->rx_ring[entry].status |= le16_to_cpu(0x8000); | 2203 | lp->rx_ring[entry].status |= le16_to_cpu(0x8000); |
2044 | entry = (++lp->cur_rx) & RX_RING_MOD_MASK; | 2204 | entry = (++lp->cur_rx) & lp->rx_mod_mask; |
2045 | if (--boguscnt <= 0) break; /* don't stay in loop forever */ | 2205 | if (--boguscnt <= 0) break; /* don't stay in loop forever */ |
2046 | } | 2206 | } |
2047 | 2207 | ||
@@ -2084,7 +2244,7 @@ pcnet32_close(struct net_device *dev) | |||
2084 | spin_lock_irqsave(&lp->lock, flags); | 2244 | spin_lock_irqsave(&lp->lock, flags); |
2085 | 2245 | ||
2086 | /* free all allocated skbuffs */ | 2246 | /* free all allocated skbuffs */ |
2087 | for (i = 0; i < RX_RING_SIZE; i++) { | 2247 | for (i = 0; i < lp->rx_ring_size; i++) { |
2088 | lp->rx_ring[i].status = 0; | 2248 | lp->rx_ring[i].status = 0; |
2089 | wmb(); /* Make sure adapter sees owner change */ | 2249 | wmb(); /* Make sure adapter sees owner change */ |
2090 | if (lp->rx_skbuff[i]) { | 2250 | if (lp->rx_skbuff[i]) { |
@@ -2096,7 +2256,7 @@ pcnet32_close(struct net_device *dev) | |||
2096 | lp->rx_dma_addr[i] = 0; | 2256 | lp->rx_dma_addr[i] = 0; |
2097 | } | 2257 | } |
2098 | 2258 | ||
2099 | for (i = 0; i < TX_RING_SIZE; i++) { | 2259 | for (i = 0; i < lp->tx_ring_size; i++) { |
2100 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ | 2260 | lp->tx_ring[i].status = 0; /* CPU owns buffer */ |
2101 | wmb(); /* Make sure adapter sees owner change */ | 2261 | wmb(); /* Make sure adapter sees owner change */ |
2102 | if (lp->tx_skbuff[i]) { | 2262 | if (lp->tx_skbuff[i]) { |
@@ -2265,6 +2425,7 @@ static void __devexit pcnet32_remove_one(struct pci_dev *pdev) | |||
2265 | struct pcnet32_private *lp = dev->priv; | 2425 | struct pcnet32_private *lp = dev->priv; |
2266 | 2426 | ||
2267 | unregister_netdev(dev); | 2427 | unregister_netdev(dev); |
2428 | pcnet32_free_ring(dev); | ||
2268 | release_region(dev->base_addr, PCNET32_TOTAL_SIZE); | 2429 | release_region(dev->base_addr, PCNET32_TOTAL_SIZE); |
2269 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); | 2430 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); |
2270 | free_netdev(dev); | 2431 | free_netdev(dev); |
@@ -2340,6 +2501,7 @@ static void __exit pcnet32_cleanup_module(void) | |||
2340 | struct pcnet32_private *lp = pcnet32_dev->priv; | 2501 | struct pcnet32_private *lp = pcnet32_dev->priv; |
2341 | next_dev = lp->next; | 2502 | next_dev = lp->next; |
2342 | unregister_netdev(pcnet32_dev); | 2503 | unregister_netdev(pcnet32_dev); |
2504 | pcnet32_free_ring(pcnet32_dev); | ||
2343 | release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); | 2505 | release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); |
2344 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); | 2506 | pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr); |
2345 | free_netdev(pcnet32_dev); | 2507 | free_netdev(pcnet32_dev); |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index f0471d102e3c..cbc60ce365cb 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -1028,6 +1028,7 @@ static struct ethtool_ops rtl8169_ethtool_ops = { | |||
1028 | .get_strings = rtl8169_get_strings, | 1028 | .get_strings = rtl8169_get_strings, |
1029 | .get_stats_count = rtl8169_get_stats_count, | 1029 | .get_stats_count = rtl8169_get_stats_count, |
1030 | .get_ethtool_stats = rtl8169_get_ethtool_stats, | 1030 | .get_ethtool_stats = rtl8169_get_ethtool_stats, |
1031 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1031 | }; | 1032 | }; |
1032 | 1033 | ||
1033 | static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum, | 1034 | static void rtl8169_write_gmii_reg_bit(void __iomem *ioaddr, int reg, int bitnum, |
@@ -1512,6 +1513,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1512 | /* Get MAC address. FIXME: read EEPROM */ | 1513 | /* Get MAC address. FIXME: read EEPROM */ |
1513 | for (i = 0; i < MAC_ADDR_LEN; i++) | 1514 | for (i = 0; i < MAC_ADDR_LEN; i++) |
1514 | dev->dev_addr[i] = RTL_R8(MAC0 + i); | 1515 | dev->dev_addr[i] = RTL_R8(MAC0 + i); |
1516 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
1515 | 1517 | ||
1516 | dev->open = rtl8169_open; | 1518 | dev->open = rtl8169_open; |
1517 | dev->hard_start_xmit = rtl8169_start_xmit; | 1519 | dev->hard_start_xmit = rtl8169_start_xmit; |
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c new file mode 100644 index 000000000000..12cde0604580 --- /dev/null +++ b/drivers/net/rionet.c | |||
@@ -0,0 +1,574 @@ | |||
1 | /* | ||
2 | * rionet - Ethernet driver over RapidIO messaging services | ||
3 | * | ||
4 | * Copyright 2005 MontaVista Software, Inc. | ||
5 | * Matt Porter <mporter@kernel.crashing.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/dma-mapping.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/rio.h> | ||
18 | #include <linux/rio_drv.h> | ||
19 | #include <linux/rio_ids.h> | ||
20 | |||
21 | #include <linux/netdevice.h> | ||
22 | #include <linux/etherdevice.h> | ||
23 | #include <linux/skbuff.h> | ||
24 | #include <linux/crc32.h> | ||
25 | #include <linux/ethtool.h> | ||
26 | |||
27 | #define DRV_NAME "rionet" | ||
28 | #define DRV_VERSION "0.2" | ||
29 | #define DRV_AUTHOR "Matt Porter <mporter@kernel.crashing.org>" | ||
30 | #define DRV_DESC "Ethernet over RapidIO" | ||
31 | |||
32 | MODULE_AUTHOR(DRV_AUTHOR); | ||
33 | MODULE_DESCRIPTION(DRV_DESC); | ||
34 | MODULE_LICENSE("GPL"); | ||
35 | |||
36 | #define RIONET_DEFAULT_MSGLEVEL \ | ||
37 | (NETIF_MSG_DRV | \ | ||
38 | NETIF_MSG_LINK | \ | ||
39 | NETIF_MSG_RX_ERR | \ | ||
40 | NETIF_MSG_TX_ERR) | ||
41 | |||
42 | #define RIONET_DOORBELL_JOIN 0x1000 | ||
43 | #define RIONET_DOORBELL_LEAVE 0x1001 | ||
44 | |||
45 | #define RIONET_MAILBOX 0 | ||
46 | |||
47 | #define RIONET_TX_RING_SIZE CONFIG_RIONET_TX_SIZE | ||
48 | #define RIONET_RX_RING_SIZE CONFIG_RIONET_RX_SIZE | ||
49 | |||
50 | static LIST_HEAD(rionet_peers); | ||
51 | |||
52 | struct rionet_private { | ||
53 | struct rio_mport *mport; | ||
54 | struct sk_buff *rx_skb[RIONET_RX_RING_SIZE]; | ||
55 | struct sk_buff *tx_skb[RIONET_TX_RING_SIZE]; | ||
56 | struct net_device_stats stats; | ||
57 | int rx_slot; | ||
58 | int tx_slot; | ||
59 | int tx_cnt; | ||
60 | int ack_slot; | ||
61 | spinlock_t lock; | ||
62 | spinlock_t tx_lock; | ||
63 | u32 msg_enable; | ||
64 | }; | ||
65 | |||
66 | struct rionet_peer { | ||
67 | struct list_head node; | ||
68 | struct rio_dev *rdev; | ||
69 | struct resource *res; | ||
70 | }; | ||
71 | |||
72 | static int rionet_check = 0; | ||
73 | static int rionet_capable = 1; | ||
74 | |||
75 | /* | ||
76 | * This is a fast lookup table for for translating TX | ||
77 | * Ethernet packets into a destination RIO device. It | ||
78 | * could be made into a hash table to save memory depending | ||
79 | * on system trade-offs. | ||
80 | */ | ||
81 | static struct rio_dev *rionet_active[RIO_MAX_ROUTE_ENTRIES]; | ||
82 | |||
83 | #define is_rionet_capable(pef, src_ops, dst_ops) \ | ||
84 | ((pef & RIO_PEF_INB_MBOX) && \ | ||
85 | (pef & RIO_PEF_INB_DOORBELL) && \ | ||
86 | (src_ops & RIO_SRC_OPS_DOORBELL) && \ | ||
87 | (dst_ops & RIO_DST_OPS_DOORBELL)) | ||
88 | #define dev_rionet_capable(dev) \ | ||
89 | is_rionet_capable(dev->pef, dev->src_ops, dev->dst_ops) | ||
90 | |||
91 | #define RIONET_MAC_MATCH(x) (*(u32 *)x == 0x00010001) | ||
92 | #define RIONET_GET_DESTID(x) (*(u16 *)(x + 4)) | ||
93 | |||
94 | static struct net_device_stats *rionet_stats(struct net_device *ndev) | ||
95 | { | ||
96 | struct rionet_private *rnet = ndev->priv; | ||
97 | return &rnet->stats; | ||
98 | } | ||
99 | |||
100 | static int rionet_rx_clean(struct net_device *ndev) | ||
101 | { | ||
102 | int i; | ||
103 | int error = 0; | ||
104 | struct rionet_private *rnet = ndev->priv; | ||
105 | void *data; | ||
106 | |||
107 | i = rnet->rx_slot; | ||
108 | |||
109 | do { | ||
110 | if (!rnet->rx_skb[i]) | ||
111 | continue; | ||
112 | |||
113 | if (!(data = rio_get_inb_message(rnet->mport, RIONET_MAILBOX))) | ||
114 | break; | ||
115 | |||
116 | rnet->rx_skb[i]->data = data; | ||
117 | skb_put(rnet->rx_skb[i], RIO_MAX_MSG_SIZE); | ||
118 | rnet->rx_skb[i]->dev = ndev; | ||
119 | rnet->rx_skb[i]->protocol = | ||
120 | eth_type_trans(rnet->rx_skb[i], ndev); | ||
121 | error = netif_rx(rnet->rx_skb[i]); | ||
122 | |||
123 | if (error == NET_RX_DROP) { | ||
124 | rnet->stats.rx_dropped++; | ||
125 | } else if (error == NET_RX_BAD) { | ||
126 | if (netif_msg_rx_err(rnet)) | ||
127 | printk(KERN_WARNING "%s: bad rx packet\n", | ||
128 | DRV_NAME); | ||
129 | rnet->stats.rx_errors++; | ||
130 | } else { | ||
131 | rnet->stats.rx_packets++; | ||
132 | rnet->stats.rx_bytes += RIO_MAX_MSG_SIZE; | ||
133 | } | ||
134 | |||
135 | } while ((i = (i + 1) % RIONET_RX_RING_SIZE) != rnet->rx_slot); | ||
136 | |||
137 | return i; | ||
138 | } | ||
139 | |||
140 | static void rionet_rx_fill(struct net_device *ndev, int end) | ||
141 | { | ||
142 | int i; | ||
143 | struct rionet_private *rnet = ndev->priv; | ||
144 | |||
145 | i = rnet->rx_slot; | ||
146 | do { | ||
147 | rnet->rx_skb[i] = dev_alloc_skb(RIO_MAX_MSG_SIZE); | ||
148 | |||
149 | if (!rnet->rx_skb[i]) | ||
150 | break; | ||
151 | |||
152 | rio_add_inb_buffer(rnet->mport, RIONET_MAILBOX, | ||
153 | rnet->rx_skb[i]->data); | ||
154 | } while ((i = (i + 1) % RIONET_RX_RING_SIZE) != end); | ||
155 | |||
156 | rnet->rx_slot = i; | ||
157 | } | ||
158 | |||
159 | static int rionet_queue_tx_msg(struct sk_buff *skb, struct net_device *ndev, | ||
160 | struct rio_dev *rdev) | ||
161 | { | ||
162 | struct rionet_private *rnet = ndev->priv; | ||
163 | |||
164 | rio_add_outb_message(rnet->mport, rdev, 0, skb->data, skb->len); | ||
165 | rnet->tx_skb[rnet->tx_slot] = skb; | ||
166 | |||
167 | rnet->stats.tx_packets++; | ||
168 | rnet->stats.tx_bytes += skb->len; | ||
169 | |||
170 | if (++rnet->tx_cnt == RIONET_TX_RING_SIZE) | ||
171 | netif_stop_queue(ndev); | ||
172 | |||
173 | ++rnet->tx_slot; | ||
174 | rnet->tx_slot &= (RIONET_TX_RING_SIZE - 1); | ||
175 | |||
176 | if (netif_msg_tx_queued(rnet)) | ||
177 | printk(KERN_INFO "%s: queued skb %8.8x len %8.8x\n", DRV_NAME, | ||
178 | (u32) skb, skb->len); | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
184 | { | ||
185 | int i; | ||
186 | struct rionet_private *rnet = ndev->priv; | ||
187 | struct ethhdr *eth = (struct ethhdr *)skb->data; | ||
188 | u16 destid; | ||
189 | unsigned long flags; | ||
190 | |||
191 | local_irq_save(flags); | ||
192 | if (!spin_trylock(&rnet->tx_lock)) { | ||
193 | local_irq_restore(flags); | ||
194 | return NETDEV_TX_LOCKED; | ||
195 | } | ||
196 | |||
197 | if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) { | ||
198 | netif_stop_queue(ndev); | ||
199 | spin_unlock_irqrestore(&rnet->tx_lock, flags); | ||
200 | printk(KERN_ERR "%s: BUG! Tx Ring full when queue awake!\n", | ||
201 | ndev->name); | ||
202 | return NETDEV_TX_BUSY; | ||
203 | } | ||
204 | |||
205 | if (eth->h_dest[0] & 0x01) { | ||
206 | for (i = 0; i < RIO_MAX_ROUTE_ENTRIES; i++) | ||
207 | if (rionet_active[i]) | ||
208 | rionet_queue_tx_msg(skb, ndev, | ||
209 | rionet_active[i]); | ||
210 | } else if (RIONET_MAC_MATCH(eth->h_dest)) { | ||
211 | destid = RIONET_GET_DESTID(eth->h_dest); | ||
212 | if (rionet_active[destid]) | ||
213 | rionet_queue_tx_msg(skb, ndev, rionet_active[destid]); | ||
214 | } | ||
215 | |||
216 | spin_unlock_irqrestore(&rnet->tx_lock, flags); | ||
217 | |||
218 | return 0; | ||
219 | } | ||
220 | |||
221 | static void rionet_dbell_event(struct rio_mport *mport, void *dev_id, u16 sid, u16 tid, | ||
222 | u16 info) | ||
223 | { | ||
224 | struct net_device *ndev = dev_id; | ||
225 | struct rionet_private *rnet = ndev->priv; | ||
226 | struct rionet_peer *peer; | ||
227 | |||
228 | if (netif_msg_intr(rnet)) | ||
229 | printk(KERN_INFO "%s: doorbell sid %4.4x tid %4.4x info %4.4x", | ||
230 | DRV_NAME, sid, tid, info); | ||
231 | if (info == RIONET_DOORBELL_JOIN) { | ||
232 | if (!rionet_active[sid]) { | ||
233 | list_for_each_entry(peer, &rionet_peers, node) { | ||
234 | if (peer->rdev->destid == sid) | ||
235 | rionet_active[sid] = peer->rdev; | ||
236 | } | ||
237 | rio_mport_send_doorbell(mport, sid, | ||
238 | RIONET_DOORBELL_JOIN); | ||
239 | } | ||
240 | } else if (info == RIONET_DOORBELL_LEAVE) { | ||
241 | rionet_active[sid] = NULL; | ||
242 | } else { | ||
243 | if (netif_msg_intr(rnet)) | ||
244 | printk(KERN_WARNING "%s: unhandled doorbell\n", | ||
245 | DRV_NAME); | ||
246 | } | ||
247 | } | ||
248 | |||
249 | static void rionet_inb_msg_event(struct rio_mport *mport, void *dev_id, int mbox, int slot) | ||
250 | { | ||
251 | int n; | ||
252 | struct net_device *ndev = dev_id; | ||
253 | struct rionet_private *rnet = (struct rionet_private *)ndev->priv; | ||
254 | |||
255 | if (netif_msg_intr(rnet)) | ||
256 | printk(KERN_INFO "%s: inbound message event, mbox %d slot %d\n", | ||
257 | DRV_NAME, mbox, slot); | ||
258 | |||
259 | spin_lock(&rnet->lock); | ||
260 | if ((n = rionet_rx_clean(ndev)) != rnet->rx_slot) | ||
261 | rionet_rx_fill(ndev, n); | ||
262 | spin_unlock(&rnet->lock); | ||
263 | } | ||
264 | |||
265 | static void rionet_outb_msg_event(struct rio_mport *mport, void *dev_id, int mbox, int slot) | ||
266 | { | ||
267 | struct net_device *ndev = dev_id; | ||
268 | struct rionet_private *rnet = ndev->priv; | ||
269 | |||
270 | spin_lock(&rnet->lock); | ||
271 | |||
272 | if (netif_msg_intr(rnet)) | ||
273 | printk(KERN_INFO | ||
274 | "%s: outbound message event, mbox %d slot %d\n", | ||
275 | DRV_NAME, mbox, slot); | ||
276 | |||
277 | while (rnet->tx_cnt && (rnet->ack_slot != slot)) { | ||
278 | /* dma unmap single */ | ||
279 | dev_kfree_skb_irq(rnet->tx_skb[rnet->ack_slot]); | ||
280 | rnet->tx_skb[rnet->ack_slot] = NULL; | ||
281 | ++rnet->ack_slot; | ||
282 | rnet->ack_slot &= (RIONET_TX_RING_SIZE - 1); | ||
283 | rnet->tx_cnt--; | ||
284 | } | ||
285 | |||
286 | if (rnet->tx_cnt < RIONET_TX_RING_SIZE) | ||
287 | netif_wake_queue(ndev); | ||
288 | |||
289 | spin_unlock(&rnet->lock); | ||
290 | } | ||
291 | |||
292 | static int rionet_open(struct net_device *ndev) | ||
293 | { | ||
294 | int i, rc = 0; | ||
295 | struct rionet_peer *peer, *tmp; | ||
296 | u32 pwdcsr; | ||
297 | struct rionet_private *rnet = ndev->priv; | ||
298 | |||
299 | if (netif_msg_ifup(rnet)) | ||
300 | printk(KERN_INFO "%s: open\n", DRV_NAME); | ||
301 | |||
302 | if ((rc = rio_request_inb_dbell(rnet->mport, | ||
303 | (void *)ndev, | ||
304 | RIONET_DOORBELL_JOIN, | ||
305 | RIONET_DOORBELL_LEAVE, | ||
306 | rionet_dbell_event)) < 0) | ||
307 | goto out; | ||
308 | |||
309 | if ((rc = rio_request_inb_mbox(rnet->mport, | ||
310 | (void *)ndev, | ||
311 | RIONET_MAILBOX, | ||
312 | RIONET_RX_RING_SIZE, | ||
313 | rionet_inb_msg_event)) < 0) | ||
314 | goto out; | ||
315 | |||
316 | if ((rc = rio_request_outb_mbox(rnet->mport, | ||
317 | (void *)ndev, | ||
318 | RIONET_MAILBOX, | ||
319 | RIONET_TX_RING_SIZE, | ||
320 | rionet_outb_msg_event)) < 0) | ||
321 | goto out; | ||
322 | |||
323 | /* Initialize inbound message ring */ | ||
324 | for (i = 0; i < RIONET_RX_RING_SIZE; i++) | ||
325 | rnet->rx_skb[i] = NULL; | ||
326 | rnet->rx_slot = 0; | ||
327 | rionet_rx_fill(ndev, 0); | ||
328 | |||
329 | rnet->tx_slot = 0; | ||
330 | rnet->tx_cnt = 0; | ||
331 | rnet->ack_slot = 0; | ||
332 | |||
333 | netif_carrier_on(ndev); | ||
334 | netif_start_queue(ndev); | ||
335 | |||
336 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { | ||
337 | if (!(peer->res = rio_request_outb_dbell(peer->rdev, | ||
338 | RIONET_DOORBELL_JOIN, | ||
339 | RIONET_DOORBELL_LEAVE))) | ||
340 | { | ||
341 | printk(KERN_ERR "%s: error requesting doorbells\n", | ||
342 | DRV_NAME); | ||
343 | continue; | ||
344 | } | ||
345 | |||
346 | /* | ||
347 | * If device has initialized inbound doorbells, | ||
348 | * send a join message | ||
349 | */ | ||
350 | rio_read_config_32(peer->rdev, RIO_WRITE_PORT_CSR, &pwdcsr); | ||
351 | if (pwdcsr & RIO_DOORBELL_AVAIL) | ||
352 | rio_send_doorbell(peer->rdev, RIONET_DOORBELL_JOIN); | ||
353 | } | ||
354 | |||
355 | out: | ||
356 | return rc; | ||
357 | } | ||
358 | |||
359 | static int rionet_close(struct net_device *ndev) | ||
360 | { | ||
361 | struct rionet_private *rnet = (struct rionet_private *)ndev->priv; | ||
362 | struct rionet_peer *peer, *tmp; | ||
363 | int i; | ||
364 | |||
365 | if (netif_msg_ifup(rnet)) | ||
366 | printk(KERN_INFO "%s: close\n", DRV_NAME); | ||
367 | |||
368 | netif_stop_queue(ndev); | ||
369 | netif_carrier_off(ndev); | ||
370 | |||
371 | for (i = 0; i < RIONET_RX_RING_SIZE; i++) | ||
372 | if (rnet->rx_skb[i]) | ||
373 | kfree_skb(rnet->rx_skb[i]); | ||
374 | |||
375 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { | ||
376 | if (rionet_active[peer->rdev->destid]) { | ||
377 | rio_send_doorbell(peer->rdev, RIONET_DOORBELL_LEAVE); | ||
378 | rionet_active[peer->rdev->destid] = NULL; | ||
379 | } | ||
380 | rio_release_outb_dbell(peer->rdev, peer->res); | ||
381 | } | ||
382 | |||
383 | rio_release_inb_dbell(rnet->mport, RIONET_DOORBELL_JOIN, | ||
384 | RIONET_DOORBELL_LEAVE); | ||
385 | rio_release_inb_mbox(rnet->mport, RIONET_MAILBOX); | ||
386 | rio_release_outb_mbox(rnet->mport, RIONET_MAILBOX); | ||
387 | |||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | static void rionet_remove(struct rio_dev *rdev) | ||
392 | { | ||
393 | struct net_device *ndev = NULL; | ||
394 | struct rionet_peer *peer, *tmp; | ||
395 | |||
396 | unregister_netdev(ndev); | ||
397 | kfree(ndev); | ||
398 | |||
399 | list_for_each_entry_safe(peer, tmp, &rionet_peers, node) { | ||
400 | list_del(&peer->node); | ||
401 | kfree(peer); | ||
402 | } | ||
403 | } | ||
404 | |||
405 | static void rionet_get_drvinfo(struct net_device *ndev, | ||
406 | struct ethtool_drvinfo *info) | ||
407 | { | ||
408 | struct rionet_private *rnet = ndev->priv; | ||
409 | |||
410 | strcpy(info->driver, DRV_NAME); | ||
411 | strcpy(info->version, DRV_VERSION); | ||
412 | strcpy(info->fw_version, "n/a"); | ||
413 | strcpy(info->bus_info, rnet->mport->name); | ||
414 | } | ||
415 | |||
416 | static u32 rionet_get_msglevel(struct net_device *ndev) | ||
417 | { | ||
418 | struct rionet_private *rnet = ndev->priv; | ||
419 | |||
420 | return rnet->msg_enable; | ||
421 | } | ||
422 | |||
423 | static void rionet_set_msglevel(struct net_device *ndev, u32 value) | ||
424 | { | ||
425 | struct rionet_private *rnet = ndev->priv; | ||
426 | |||
427 | rnet->msg_enable = value; | ||
428 | } | ||
429 | |||
430 | static struct ethtool_ops rionet_ethtool_ops = { | ||
431 | .get_drvinfo = rionet_get_drvinfo, | ||
432 | .get_msglevel = rionet_get_msglevel, | ||
433 | .set_msglevel = rionet_set_msglevel, | ||
434 | .get_link = ethtool_op_get_link, | ||
435 | }; | ||
436 | |||
437 | static int rionet_setup_netdev(struct rio_mport *mport) | ||
438 | { | ||
439 | int rc = 0; | ||
440 | struct net_device *ndev = NULL; | ||
441 | struct rionet_private *rnet; | ||
442 | u16 device_id; | ||
443 | |||
444 | /* Allocate our net_device structure */ | ||
445 | ndev = alloc_etherdev(sizeof(struct rionet_private)); | ||
446 | if (ndev == NULL) { | ||
447 | printk(KERN_INFO "%s: could not allocate ethernet device.\n", | ||
448 | DRV_NAME); | ||
449 | rc = -ENOMEM; | ||
450 | goto out; | ||
451 | } | ||
452 | |||
453 | /* Set up private area */ | ||
454 | rnet = (struct rionet_private *)ndev->priv; | ||
455 | rnet->mport = mport; | ||
456 | |||
457 | /* Set the default MAC address */ | ||
458 | device_id = rio_local_get_device_id(mport); | ||
459 | ndev->dev_addr[0] = 0x00; | ||
460 | ndev->dev_addr[1] = 0x01; | ||
461 | ndev->dev_addr[2] = 0x00; | ||
462 | ndev->dev_addr[3] = 0x01; | ||
463 | ndev->dev_addr[4] = device_id >> 8; | ||
464 | ndev->dev_addr[5] = device_id & 0xff; | ||
465 | |||
466 | /* Fill in the driver function table */ | ||
467 | ndev->open = &rionet_open; | ||
468 | ndev->hard_start_xmit = &rionet_start_xmit; | ||
469 | ndev->stop = &rionet_close; | ||
470 | ndev->get_stats = &rionet_stats; | ||
471 | ndev->mtu = RIO_MAX_MSG_SIZE - 14; | ||
472 | ndev->features = NETIF_F_LLTX; | ||
473 | SET_ETHTOOL_OPS(ndev, &rionet_ethtool_ops); | ||
474 | |||
475 | SET_MODULE_OWNER(ndev); | ||
476 | |||
477 | spin_lock_init(&rnet->lock); | ||
478 | spin_lock_init(&rnet->tx_lock); | ||
479 | |||
480 | rnet->msg_enable = RIONET_DEFAULT_MSGLEVEL; | ||
481 | |||
482 | rc = register_netdev(ndev); | ||
483 | if (rc != 0) | ||
484 | goto out; | ||
485 | |||
486 | printk("%s: %s %s Version %s, MAC %02x:%02x:%02x:%02x:%02x:%02x\n", | ||
487 | ndev->name, | ||
488 | DRV_NAME, | ||
489 | DRV_DESC, | ||
490 | DRV_VERSION, | ||
491 | ndev->dev_addr[0], ndev->dev_addr[1], ndev->dev_addr[2], | ||
492 | ndev->dev_addr[3], ndev->dev_addr[4], ndev->dev_addr[5]); | ||
493 | |||
494 | out: | ||
495 | return rc; | ||
496 | } | ||
497 | |||
498 | /* | ||
499 | * XXX Make multi-net safe | ||
500 | */ | ||
501 | static int rionet_probe(struct rio_dev *rdev, const struct rio_device_id *id) | ||
502 | { | ||
503 | int rc = -ENODEV; | ||
504 | u32 lpef, lsrc_ops, ldst_ops; | ||
505 | struct rionet_peer *peer; | ||
506 | |||
507 | /* If local device is not rionet capable, give up quickly */ | ||
508 | if (!rionet_capable) | ||
509 | goto out; | ||
510 | |||
511 | /* | ||
512 | * First time through, make sure local device is rionet | ||
513 | * capable, setup netdev, and set flags so this is skipped | ||
514 | * on later probes | ||
515 | */ | ||
516 | if (!rionet_check) { | ||
517 | rio_local_read_config_32(rdev->net->hport, RIO_PEF_CAR, &lpef); | ||
518 | rio_local_read_config_32(rdev->net->hport, RIO_SRC_OPS_CAR, | ||
519 | &lsrc_ops); | ||
520 | rio_local_read_config_32(rdev->net->hport, RIO_DST_OPS_CAR, | ||
521 | &ldst_ops); | ||
522 | if (!is_rionet_capable(lpef, lsrc_ops, ldst_ops)) { | ||
523 | printk(KERN_ERR | ||
524 | "%s: local device is not network capable\n", | ||
525 | DRV_NAME); | ||
526 | rionet_check = 1; | ||
527 | rionet_capable = 0; | ||
528 | goto out; | ||
529 | } | ||
530 | |||
531 | rc = rionet_setup_netdev(rdev->net->hport); | ||
532 | rionet_check = 1; | ||
533 | } | ||
534 | |||
535 | /* | ||
536 | * If the remote device has mailbox/doorbell capabilities, | ||
537 | * add it to the peer list. | ||
538 | */ | ||
539 | if (dev_rionet_capable(rdev)) { | ||
540 | if (!(peer = kmalloc(sizeof(struct rionet_peer), GFP_KERNEL))) { | ||
541 | rc = -ENOMEM; | ||
542 | goto out; | ||
543 | } | ||
544 | peer->rdev = rdev; | ||
545 | list_add_tail(&peer->node, &rionet_peers); | ||
546 | } | ||
547 | |||
548 | out: | ||
549 | return rc; | ||
550 | } | ||
551 | |||
552 | static struct rio_device_id rionet_id_table[] = { | ||
553 | {RIO_DEVICE(RIO_ANY_ID, RIO_ANY_ID)} | ||
554 | }; | ||
555 | |||
556 | static struct rio_driver rionet_driver = { | ||
557 | .name = "rionet", | ||
558 | .id_table = rionet_id_table, | ||
559 | .probe = rionet_probe, | ||
560 | .remove = rionet_remove, | ||
561 | }; | ||
562 | |||
563 | static int __init rionet_init(void) | ||
564 | { | ||
565 | return rio_register_driver(&rionet_driver); | ||
566 | } | ||
567 | |||
568 | static void __exit rionet_exit(void) | ||
569 | { | ||
570 | rio_unregister_driver(&rionet_driver); | ||
571 | } | ||
572 | |||
573 | module_init(rionet_init); | ||
574 | module_exit(rionet_exit); | ||
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 0208258e7826..7ce734ec6ba8 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -743,6 +743,7 @@ static struct ethtool_ops skge_ethtool_ops = { | |||
743 | .phys_id = skge_phys_id, | 743 | .phys_id = skge_phys_id, |
744 | .get_stats_count = skge_get_stats_count, | 744 | .get_stats_count = skge_get_stats_count, |
745 | .get_ethtool_stats = skge_get_ethtool_stats, | 745 | .get_ethtool_stats = skge_get_ethtool_stats, |
746 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
746 | }; | 747 | }; |
747 | 748 | ||
748 | /* | 749 | /* |
@@ -3082,6 +3083,7 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, | |||
3082 | 3083 | ||
3083 | /* read the mac address */ | 3084 | /* read the mac address */ |
3084 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); | 3085 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port*8, ETH_ALEN); |
3086 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
3085 | 3087 | ||
3086 | /* device is off until link detection */ | 3088 | /* device is off until link detection */ |
3087 | netif_carrier_off(dev); | 3089 | netif_carrier_off(dev); |
diff --git a/drivers/net/sundance.c b/drivers/net/sundance.c index d500a5771dbc..e148a7212073 100644 --- a/drivers/net/sundance.c +++ b/drivers/net/sundance.c | |||
@@ -549,6 +549,7 @@ static int __devinit sundance_probe1 (struct pci_dev *pdev, | |||
549 | for (i = 0; i < 3; i++) | 549 | for (i = 0; i < 3; i++) |
550 | ((u16 *)dev->dev_addr)[i] = | 550 | ((u16 *)dev->dev_addr)[i] = |
551 | le16_to_cpu(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); | 551 | le16_to_cpu(eeprom_read(ioaddr, i + EEPROM_SA_OFFSET)); |
552 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
552 | 553 | ||
553 | dev->base_addr = (unsigned long)ioaddr; | 554 | dev->base_addr = (unsigned long)ioaddr; |
554 | dev->irq = irq; | 555 | dev->irq = irq; |
@@ -1619,6 +1620,7 @@ static struct ethtool_ops ethtool_ops = { | |||
1619 | .get_link = get_link, | 1620 | .get_link = get_link, |
1620 | .get_msglevel = get_msglevel, | 1621 | .get_msglevel = get_msglevel, |
1621 | .set_msglevel = set_msglevel, | 1622 | .set_msglevel = set_msglevel, |
1623 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1622 | }; | 1624 | }; |
1623 | 1625 | ||
1624 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 1626 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index e7b001017b9a..8154bbbb7792 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c | |||
@@ -318,7 +318,7 @@ static void ibmtr_cleanup_card(struct net_device *dev) | |||
318 | if (dev->base_addr) { | 318 | if (dev->base_addr) { |
319 | outb(0,dev->base_addr+ADAPTRESET); | 319 | outb(0,dev->base_addr+ADAPTRESET); |
320 | 320 | ||
321 | schedule_timeout(TR_RST_TIME); /* wait 50ms */ | 321 | schedule_timeout_uninterruptible(TR_RST_TIME); /* wait 50ms */ |
322 | 322 | ||
323 | outb(0,dev->base_addr+ADAPTRESETREL); | 323 | outb(0,dev->base_addr+ADAPTRESETREL); |
324 | } | 324 | } |
@@ -859,8 +859,7 @@ static int tok_init_card(struct net_device *dev) | |||
859 | writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); | 859 | writeb(~INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN); |
860 | outb(0, PIOaddr + ADAPTRESET); | 860 | outb(0, PIOaddr + ADAPTRESET); |
861 | 861 | ||
862 | current->state=TASK_UNINTERRUPTIBLE; | 862 | schedule_timeout_uninterruptible(TR_RST_TIME); /* wait 50ms */ |
863 | schedule_timeout(TR_RST_TIME); /* wait 50ms */ | ||
864 | 863 | ||
865 | outb(0, PIOaddr + ADAPTRESETREL); | 864 | outb(0, PIOaddr + ADAPTRESETREL); |
866 | #ifdef ENABLE_PAGING | 865 | #ifdef ENABLE_PAGING |
@@ -908,8 +907,8 @@ static int tok_open(struct net_device *dev) | |||
908 | DPRINTK("Adapter is up and running\n"); | 907 | DPRINTK("Adapter is up and running\n"); |
909 | return 0; | 908 | return 0; |
910 | } | 909 | } |
911 | current->state=TASK_INTERRUPTIBLE; | 910 | i=schedule_timeout_interruptible(TR_RETRY_INTERVAL); |
912 | i=schedule_timeout(TR_RETRY_INTERVAL); /* wait 30 seconds */ | 911 | /* wait 30 seconds */ |
913 | if(i!=0) break; /*prob. a signal, like the i>24*HZ case above */ | 912 | if(i!=0) break; /*prob. a signal, like the i>24*HZ case above */ |
914 | } | 913 | } |
915 | outb(0, dev->base_addr + ADAPTRESET);/* kill pending interrupts*/ | 914 | outb(0, dev->base_addr + ADAPTRESET);/* kill pending interrupts*/ |
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c index 9e7923192a49..05477d24fd49 100644 --- a/drivers/net/tokenring/olympic.c +++ b/drivers/net/tokenring/olympic.c | |||
@@ -1101,7 +1101,7 @@ static int olympic_close(struct net_device *dev) | |||
1101 | 1101 | ||
1102 | while(olympic_priv->srb_queued) { | 1102 | while(olympic_priv->srb_queued) { |
1103 | 1103 | ||
1104 | t = schedule_timeout(60*HZ); | 1104 | t = schedule_timeout_interruptible(60*HZ); |
1105 | 1105 | ||
1106 | if(signal_pending(current)) { | 1106 | if(signal_pending(current)) { |
1107 | printk(KERN_WARNING "%s: SRB timed out.\n",dev->name); | 1107 | printk(KERN_WARNING "%s: SRB timed out.\n",dev->name); |
diff --git a/drivers/net/tokenring/tms380tr.c b/drivers/net/tokenring/tms380tr.c index 2e39bf1f7462..c1925590a0e1 100644 --- a/drivers/net/tokenring/tms380tr.c +++ b/drivers/net/tokenring/tms380tr.c | |||
@@ -1243,8 +1243,7 @@ void tms380tr_wait(unsigned long time) | |||
1243 | 1243 | ||
1244 | tmp = jiffies + time/(1000000/HZ); | 1244 | tmp = jiffies + time/(1000000/HZ); |
1245 | do { | 1245 | do { |
1246 | current->state = TASK_INTERRUPTIBLE; | 1246 | tmp = schedule_timeout_interruptible(tmp); |
1247 | tmp = schedule_timeout(tmp); | ||
1248 | } while(time_after(tmp, jiffies)); | 1247 | } while(time_after(tmp, jiffies)); |
1249 | #else | 1248 | #else |
1250 | udelay(time); | 1249 | udelay(time); |
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index ecfa6f8805ce..4c76cb794bfb 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
@@ -419,10 +419,9 @@ typhoon_reset(void __iomem *ioaddr, int wait_type) | |||
419 | TYPHOON_STATUS_WAITING_FOR_HOST) | 419 | TYPHOON_STATUS_WAITING_FOR_HOST) |
420 | goto out; | 420 | goto out; |
421 | 421 | ||
422 | if(wait_type == WaitSleep) { | 422 | if(wait_type == WaitSleep) |
423 | set_current_state(TASK_UNINTERRUPTIBLE); | 423 | schedule_timeout_uninterruptible(1); |
424 | schedule_timeout(1); | 424 | else |
425 | } else | ||
426 | udelay(TYPHOON_UDELAY); | 425 | udelay(TYPHOON_UDELAY); |
427 | } | 426 | } |
428 | 427 | ||
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index fc7738ffbfff..e7b4bc3820e3 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
@@ -814,8 +814,9 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, | |||
814 | 814 | ||
815 | for (i = 0; i < 6; i++) | 815 | for (i = 0; i < 6; i++) |
816 | dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i); | 816 | dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i); |
817 | memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); | ||
817 | 818 | ||
818 | if (!is_valid_ether_addr(dev->dev_addr)) { | 819 | if (!is_valid_ether_addr(dev->perm_addr)) { |
819 | rc = -EIO; | 820 | rc = -EIO; |
820 | printk(KERN_ERR "Invalid MAC address\n"); | 821 | printk(KERN_ERR "Invalid MAC address\n"); |
821 | goto err_out_unmap; | 822 | goto err_out_unmap; |
@@ -1829,6 +1830,7 @@ static struct ethtool_ops netdev_ethtool_ops = { | |||
1829 | .set_wol = rhine_set_wol, | 1830 | .set_wol = rhine_set_wol, |
1830 | .get_sg = ethtool_op_get_sg, | 1831 | .get_sg = ethtool_op_get_sg, |
1831 | .get_tx_csum = ethtool_op_get_tx_csum, | 1832 | .get_tx_csum = ethtool_op_get_tx_csum, |
1833 | .get_perm_addr = ethtool_op_get_perm_addr, | ||
1832 | }; | 1834 | }; |
1833 | 1835 | ||
1834 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 1836 | static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 7ff814fd65d0..ae9e897c255e 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
@@ -1617,8 +1617,7 @@ static int get_wait_data(struct cosa_data *cosa) | |||
1617 | return r; | 1617 | return r; |
1618 | } | 1618 | } |
1619 | /* sleep if not ready to read */ | 1619 | /* sleep if not ready to read */ |
1620 | set_current_state(TASK_INTERRUPTIBLE); | 1620 | schedule_timeout_interruptible(1); |
1621 | schedule_timeout(1); | ||
1622 | } | 1621 | } |
1623 | printk(KERN_INFO "cosa: timeout in get_wait_data (status 0x%x)\n", | 1622 | printk(KERN_INFO "cosa: timeout in get_wait_data (status 0x%x)\n", |
1624 | cosa_getstatus(cosa)); | 1623 | cosa_getstatus(cosa)); |
@@ -1644,8 +1643,7 @@ static int put_wait_data(struct cosa_data *cosa, int data) | |||
1644 | } | 1643 | } |
1645 | #if 0 | 1644 | #if 0 |
1646 | /* sleep if not ready to read */ | 1645 | /* sleep if not ready to read */ |
1647 | current->state = TASK_INTERRUPTIBLE; | 1646 | schedule_timeout_interruptible(1); |
1648 | schedule_timeout(1); | ||
1649 | #endif | 1647 | #endif |
1650 | } | 1648 | } |
1651 | printk(KERN_INFO "cosa%d: timeout in put_wait_data (status 0x%x)\n", | 1649 | printk(KERN_INFO "cosa%d: timeout in put_wait_data (status 0x%x)\n", |
diff --git a/drivers/net/wan/cycx_drv.c b/drivers/net/wan/cycx_drv.c index 9e56fc346ba4..e6d005726aad 100644 --- a/drivers/net/wan/cycx_drv.c +++ b/drivers/net/wan/cycx_drv.c | |||
@@ -109,7 +109,7 @@ static long cycx_2x_irq_options[] = { 7, 3, 5, 9, 10, 11, 12, 15 }; | |||
109 | * < 0 error. | 109 | * < 0 error. |
110 | * Context: process */ | 110 | * Context: process */ |
111 | 111 | ||
112 | int __init cycx_drv_init(void) | 112 | static int __init cycx_drv_init(void) |
113 | { | 113 | { |
114 | printk(KERN_INFO "%s v%u.%u %s\n", fullname, MOD_VERSION, MOD_RELEASE, | 114 | printk(KERN_INFO "%s v%u.%u %s\n", fullname, MOD_VERSION, MOD_RELEASE, |
115 | copyright); | 115 | copyright); |
@@ -119,7 +119,7 @@ int __init cycx_drv_init(void) | |||
119 | 119 | ||
120 | /* Module 'remove' entry point. | 120 | /* Module 'remove' entry point. |
121 | * o release all remaining system resources */ | 121 | * o release all remaining system resources */ |
122 | void cycx_drv_cleanup(void) | 122 | static void cycx_drv_cleanup(void) |
123 | { | 123 | { |
124 | } | 124 | } |
125 | 125 | ||
@@ -184,8 +184,7 @@ int cycx_down(struct cycx_hw *hw) | |||
184 | } | 184 | } |
185 | 185 | ||
186 | /* Enable interrupt generation. */ | 186 | /* Enable interrupt generation. */ |
187 | EXPORT_SYMBOL(cycx_inten); | 187 | static void cycx_inten(struct cycx_hw *hw) |
188 | void cycx_inten(struct cycx_hw *hw) | ||
189 | { | 188 | { |
190 | writeb(0, hw->dpmbase); | 189 | writeb(0, hw->dpmbase); |
191 | } | 190 | } |
diff --git a/drivers/net/wan/cycx_main.c b/drivers/net/wan/cycx_main.c index 7b48064364dc..430b1f630fb4 100644 --- a/drivers/net/wan/cycx_main.c +++ b/drivers/net/wan/cycx_main.c | |||
@@ -103,7 +103,7 @@ static struct cycx_device *cycx_card_array; /* adapter data space */ | |||
103 | * < 0 error. | 103 | * < 0 error. |
104 | * Context: process | 104 | * Context: process |
105 | */ | 105 | */ |
106 | int __init cycx_init(void) | 106 | static int __init cycx_init(void) |
107 | { | 107 | { |
108 | int cnt, err = -ENOMEM; | 108 | int cnt, err = -ENOMEM; |
109 | 109 | ||
diff --git a/drivers/net/wan/cycx_x25.c b/drivers/net/wan/cycx_x25.c index 02d57c0b4243..a631d1c2fa14 100644 --- a/drivers/net/wan/cycx_x25.c +++ b/drivers/net/wan/cycx_x25.c | |||
@@ -78,6 +78,7 @@ | |||
78 | 78 | ||
79 | #define CYCLOMX_X25_DEBUG 1 | 79 | #define CYCLOMX_X25_DEBUG 1 |
80 | 80 | ||
81 | #include <linux/ctype.h> /* isdigit() */ | ||
81 | #include <linux/errno.h> /* return codes */ | 82 | #include <linux/errno.h> /* return codes */ |
82 | #include <linux/if_arp.h> /* ARPHRD_HWX25 */ | 83 | #include <linux/if_arp.h> /* ARPHRD_HWX25 */ |
83 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | 84 | #include <linux/kernel.h> /* printk(), and other useful stuff */ |
@@ -418,7 +419,7 @@ static int cycx_wan_new_if(struct wan_device *wandev, struct net_device *dev, | |||
418 | 419 | ||
419 | /* Set channel timeouts (default if not specified) */ | 420 | /* Set channel timeouts (default if not specified) */ |
420 | chan->idle_tmout = conf->idle_timeout ? conf->idle_timeout : 90; | 421 | chan->idle_tmout = conf->idle_timeout ? conf->idle_timeout : 90; |
421 | } else if (is_digit(conf->addr[0])) { /* PVC */ | 422 | } else if (isdigit(conf->addr[0])) { /* PVC */ |
422 | s16 lcn = dec_to_uint(conf->addr, 0); | 423 | s16 lcn = dec_to_uint(conf->addr, 0); |
423 | 424 | ||
424 | if (lcn >= card->u.x.lo_pvc && lcn <= card->u.x.hi_pvc) | 425 | if (lcn >= card->u.x.lo_pvc && lcn <= card->u.x.hi_pvc) |
@@ -1531,7 +1532,7 @@ static unsigned dec_to_uint(u8 *str, int len) | |||
1531 | if (!len) | 1532 | if (!len) |
1532 | len = strlen(str); | 1533 | len = strlen(str); |
1533 | 1534 | ||
1534 | for (; len && is_digit(*str); ++str, --len) | 1535 | for (; len && isdigit(*str); ++str, --len) |
1535 | val = (val * 10) + (*str - (unsigned) '0'); | 1536 | val = (val * 10) + (*str - (unsigned) '0'); |
1536 | 1537 | ||
1537 | return val; | 1538 | return val; |
diff --git a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c index 520a77a798e2..2f61a47b4716 100644 --- a/drivers/net/wan/dscc4.c +++ b/drivers/net/wan/dscc4.c | |||
@@ -446,8 +446,8 @@ static inline unsigned int dscc4_tx_quiescent(struct dscc4_dev_priv *dpriv, | |||
446 | return readl(dpriv->base_addr + CH0FTDA + dpriv->dev_id*4) == dpriv->ltda; | 446 | return readl(dpriv->base_addr + CH0FTDA + dpriv->dev_id*4) == dpriv->ltda; |
447 | } | 447 | } |
448 | 448 | ||
449 | int state_check(u32 state, struct dscc4_dev_priv *dpriv, struct net_device *dev, | 449 | static int state_check(u32 state, struct dscc4_dev_priv *dpriv, |
450 | const char *msg) | 450 | struct net_device *dev, const char *msg) |
451 | { | 451 | { |
452 | int ret = 0; | 452 | int ret = 0; |
453 | 453 | ||
@@ -466,8 +466,9 @@ int state_check(u32 state, struct dscc4_dev_priv *dpriv, struct net_device *dev, | |||
466 | return ret; | 466 | return ret; |
467 | } | 467 | } |
468 | 468 | ||
469 | void dscc4_tx_print(struct net_device *dev, struct dscc4_dev_priv *dpriv, | 469 | static void dscc4_tx_print(struct net_device *dev, |
470 | char *msg) | 470 | struct dscc4_dev_priv *dpriv, |
471 | char *msg) | ||
471 | { | 472 | { |
472 | printk(KERN_DEBUG "%s: tx_current=%02d tx_dirty=%02d (%s)\n", | 473 | printk(KERN_DEBUG "%s: tx_current=%02d tx_dirty=%02d (%s)\n", |
473 | dev->name, dpriv->tx_current, dpriv->tx_dirty, msg); | 474 | dev->name, dpriv->tx_current, dpriv->tx_dirty, msg); |
@@ -507,7 +508,8 @@ static void dscc4_release_ring(struct dscc4_dev_priv *dpriv) | |||
507 | } | 508 | } |
508 | } | 509 | } |
509 | 510 | ||
510 | inline int try_get_rx_skb(struct dscc4_dev_priv *dpriv, struct net_device *dev) | 511 | static inline int try_get_rx_skb(struct dscc4_dev_priv *dpriv, |
512 | struct net_device *dev) | ||
511 | { | 513 | { |
512 | unsigned int dirty = dpriv->rx_dirty%RX_RING_SIZE; | 514 | unsigned int dirty = dpriv->rx_dirty%RX_RING_SIZE; |
513 | struct RxFD *rx_fd = dpriv->rx_fd + dirty; | 515 | struct RxFD *rx_fd = dpriv->rx_fd + dirty; |
@@ -542,8 +544,7 @@ static int dscc4_wait_ack_cec(struct dscc4_dev_priv *dpriv, | |||
542 | msg, i); | 544 | msg, i); |
543 | goto done; | 545 | goto done; |
544 | } | 546 | } |
545 | set_current_state(TASK_UNINTERRUPTIBLE); | 547 | schedule_timeout_uninterruptible(10); |
546 | schedule_timeout(10); | ||
547 | rmb(); | 548 | rmb(); |
548 | } while (++i > 0); | 549 | } while (++i > 0); |
549 | printk(KERN_ERR "%s: %s timeout\n", dev->name, msg); | 550 | printk(KERN_ERR "%s: %s timeout\n", dev->name, msg); |
@@ -588,8 +589,7 @@ static inline int dscc4_xpr_ack(struct dscc4_dev_priv *dpriv) | |||
588 | (dpriv->iqtx[cur] & Xpr)) | 589 | (dpriv->iqtx[cur] & Xpr)) |
589 | break; | 590 | break; |
590 | smp_rmb(); | 591 | smp_rmb(); |
591 | set_current_state(TASK_UNINTERRUPTIBLE); | 592 | schedule_timeout_uninterruptible(10); |
592 | schedule_timeout(10); | ||
593 | } while (++i > 0); | 593 | } while (++i > 0); |
594 | 594 | ||
595 | return (i >= 0 ) ? i : -EAGAIN; | 595 | return (i >= 0 ) ? i : -EAGAIN; |
@@ -1035,8 +1035,7 @@ static void dscc4_pci_reset(struct pci_dev *pdev, void __iomem *ioaddr) | |||
1035 | /* Flush posted writes */ | 1035 | /* Flush posted writes */ |
1036 | readl(ioaddr + GSTAR); | 1036 | readl(ioaddr + GSTAR); |
1037 | 1037 | ||
1038 | set_current_state(TASK_UNINTERRUPTIBLE); | 1038 | schedule_timeout_uninterruptible(10); |
1039 | schedule_timeout(10); | ||
1040 | 1039 | ||
1041 | for (i = 0; i < 16; i++) | 1040 | for (i = 0; i < 16; i++) |
1042 | pci_write_config_dword(pdev, i << 2, dscc4_pci_config_store[i]); | 1041 | pci_write_config_dword(pdev, i << 2, dscc4_pci_config_store[i]); |
@@ -1894,7 +1893,7 @@ try: | |||
1894 | * It failed and locked solid. Thus the introduction of a dummy skb. | 1893 | * It failed and locked solid. Thus the introduction of a dummy skb. |
1895 | * Problem is acknowledged in errata sheet DS5. Joy :o/ | 1894 | * Problem is acknowledged in errata sheet DS5. Joy :o/ |
1896 | */ | 1895 | */ |
1897 | struct sk_buff *dscc4_init_dummy_skb(struct dscc4_dev_priv *dpriv) | 1896 | static struct sk_buff *dscc4_init_dummy_skb(struct dscc4_dev_priv *dpriv) |
1898 | { | 1897 | { |
1899 | struct sk_buff *skb; | 1898 | struct sk_buff *skb; |
1900 | 1899 | ||
diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c index 2c83cca34b86..7981a2c7906e 100644 --- a/drivers/net/wan/farsync.c +++ b/drivers/net/wan/farsync.c | |||
@@ -74,11 +74,11 @@ MODULE_LICENSE("GPL"); | |||
74 | /* | 74 | /* |
75 | * Modules parameters and associated varaibles | 75 | * Modules parameters and associated varaibles |
76 | */ | 76 | */ |
77 | int fst_txq_low = FST_LOW_WATER_MARK; | 77 | static int fst_txq_low = FST_LOW_WATER_MARK; |
78 | int fst_txq_high = FST_HIGH_WATER_MARK; | 78 | static int fst_txq_high = FST_HIGH_WATER_MARK; |
79 | int fst_max_reads = 7; | 79 | static int fst_max_reads = 7; |
80 | int fst_excluded_cards = 0; | 80 | static int fst_excluded_cards = 0; |
81 | int fst_excluded_list[FST_MAX_CARDS]; | 81 | static int fst_excluded_list[FST_MAX_CARDS]; |
82 | 82 | ||
83 | module_param(fst_txq_low, int, 0); | 83 | module_param(fst_txq_low, int, 0); |
84 | module_param(fst_txq_high, int, 0); | 84 | module_param(fst_txq_high, int, 0); |
@@ -572,13 +572,13 @@ static void do_bottom_half_rx(struct fst_card_info *card); | |||
572 | static void fst_process_tx_work_q(unsigned long work_q); | 572 | static void fst_process_tx_work_q(unsigned long work_q); |
573 | static void fst_process_int_work_q(unsigned long work_q); | 573 | static void fst_process_int_work_q(unsigned long work_q); |
574 | 574 | ||
575 | DECLARE_TASKLET(fst_tx_task, fst_process_tx_work_q, 0); | 575 | static DECLARE_TASKLET(fst_tx_task, fst_process_tx_work_q, 0); |
576 | DECLARE_TASKLET(fst_int_task, fst_process_int_work_q, 0); | 576 | static DECLARE_TASKLET(fst_int_task, fst_process_int_work_q, 0); |
577 | 577 | ||
578 | struct fst_card_info *fst_card_array[FST_MAX_CARDS]; | 578 | static struct fst_card_info *fst_card_array[FST_MAX_CARDS]; |
579 | spinlock_t fst_work_q_lock; | 579 | static spinlock_t fst_work_q_lock; |
580 | u64 fst_work_txq; | 580 | static u64 fst_work_txq; |
581 | u64 fst_work_intq; | 581 | static u64 fst_work_intq; |
582 | 582 | ||
583 | static void | 583 | static void |
584 | fst_q_work_item(u64 * queue, int card_index) | 584 | fst_q_work_item(u64 * queue, int card_index) |
@@ -980,8 +980,7 @@ fst_issue_cmd(struct fst_port_info *port, unsigned short cmd) | |||
980 | /* Wait for any previous command to complete */ | 980 | /* Wait for any previous command to complete */ |
981 | while (mbval > NAK) { | 981 | while (mbval > NAK) { |
982 | spin_unlock_irqrestore(&card->card_lock, flags); | 982 | spin_unlock_irqrestore(&card->card_lock, flags); |
983 | set_current_state(TASK_UNINTERRUPTIBLE); | 983 | schedule_timeout_uninterruptible(1); |
984 | schedule_timeout(1); | ||
985 | spin_lock_irqsave(&card->card_lock, flags); | 984 | spin_lock_irqsave(&card->card_lock, flags); |
986 | 985 | ||
987 | if (++safety > 2000) { | 986 | if (++safety > 2000) { |
@@ -1498,7 +1497,7 @@ do_bottom_half_rx(struct fst_card_info *card) | |||
1498 | * The interrupt service routine | 1497 | * The interrupt service routine |
1499 | * Dev_id is our fst_card_info pointer | 1498 | * Dev_id is our fst_card_info pointer |
1500 | */ | 1499 | */ |
1501 | irqreturn_t | 1500 | static irqreturn_t |
1502 | fst_intr(int irq, void *dev_id, struct pt_regs *regs) | 1501 | fst_intr(int irq, void *dev_id, struct pt_regs *regs) |
1503 | { | 1502 | { |
1504 | struct fst_card_info *card; | 1503 | struct fst_card_info *card; |
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index a5d6891c9d4c..e1601d35dced 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
@@ -330,7 +330,7 @@ static int pvc_close(struct net_device *dev) | |||
330 | 330 | ||
331 | 331 | ||
332 | 332 | ||
333 | int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 333 | static int pvc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
334 | { | 334 | { |
335 | pvc_device *pvc = dev_to_pvc(dev); | 335 | pvc_device *pvc = dev_to_pvc(dev); |
336 | fr_proto_pvc_info info; | 336 | fr_proto_pvc_info info; |
diff --git a/drivers/net/wan/lmc/lmc_debug.c b/drivers/net/wan/lmc/lmc_debug.c index 9dccd9546a17..3b94352b0d03 100644 --- a/drivers/net/wan/lmc/lmc_debug.c +++ b/drivers/net/wan/lmc/lmc_debug.c | |||
@@ -8,10 +8,10 @@ | |||
8 | /* | 8 | /* |
9 | * Prints out len, max to 80 octets using printk, 20 per line | 9 | * Prints out len, max to 80 octets using printk, 20 per line |
10 | */ | 10 | */ |
11 | void lmcConsoleLog(char *type, unsigned char *ucData, int iLen) | ||
12 | { | ||
13 | #ifdef DEBUG | 11 | #ifdef DEBUG |
14 | #ifdef LMC_PACKET_LOG | 12 | #ifdef LMC_PACKET_LOG |
13 | void lmcConsoleLog(char *type, unsigned char *ucData, int iLen) | ||
14 | { | ||
15 | int iNewLine = 1; | 15 | int iNewLine = 1; |
16 | char str[80], *pstr; | 16 | char str[80], *pstr; |
17 | 17 | ||
@@ -43,26 +43,24 @@ void lmcConsoleLog(char *type, unsigned char *ucData, int iLen) | |||
43 | } | 43 | } |
44 | sprintf(pstr, "\n"); | 44 | sprintf(pstr, "\n"); |
45 | printk(str); | 45 | printk(str); |
46 | } | ||
46 | #endif | 47 | #endif |
47 | #endif | 48 | #endif |
48 | } | ||
49 | 49 | ||
50 | #ifdef DEBUG | 50 | #ifdef DEBUG |
51 | u_int32_t lmcEventLogIndex = 0; | 51 | u_int32_t lmcEventLogIndex = 0; |
52 | u_int32_t lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS]; | 52 | u_int32_t lmcEventLogBuf[LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS]; |
53 | #endif | ||
54 | 53 | ||
55 | void lmcEventLog (u_int32_t EventNum, u_int32_t arg2, u_int32_t arg3) | 54 | void lmcEventLog (u_int32_t EventNum, u_int32_t arg2, u_int32_t arg3) |
56 | { | 55 | { |
57 | #ifdef DEBUG | ||
58 | lmcEventLogBuf[lmcEventLogIndex++] = EventNum; | 56 | lmcEventLogBuf[lmcEventLogIndex++] = EventNum; |
59 | lmcEventLogBuf[lmcEventLogIndex++] = arg2; | 57 | lmcEventLogBuf[lmcEventLogIndex++] = arg2; |
60 | lmcEventLogBuf[lmcEventLogIndex++] = arg3; | 58 | lmcEventLogBuf[lmcEventLogIndex++] = arg3; |
61 | lmcEventLogBuf[lmcEventLogIndex++] = jiffies; | 59 | lmcEventLogBuf[lmcEventLogIndex++] = jiffies; |
62 | 60 | ||
63 | lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1; | 61 | lmcEventLogIndex &= (LMC_EVENTLOGSIZE * LMC_EVENTLOGARGS) - 1; |
64 | #endif | ||
65 | } | 62 | } |
63 | #endif /* DEBUG */ | ||
66 | 64 | ||
67 | void lmc_trace(struct net_device *dev, char *msg){ | 65 | void lmc_trace(struct net_device *dev, char *msg){ |
68 | #ifdef LMC_TRACE | 66 | #ifdef LMC_TRACE |
diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c index f55ce76b00ed..af8b55fdd9d9 100644 --- a/drivers/net/wan/lmc/lmc_media.c +++ b/drivers/net/wan/lmc/lmc_media.c | |||
@@ -48,14 +48,6 @@ | |||
48 | */ | 48 | */ |
49 | 49 | ||
50 | /* | 50 | /* |
51 | * For lack of a better place, put the SSI cable stuff here. | ||
52 | */ | ||
53 | char *lmc_t1_cables[] = { | ||
54 | "V.10/RS423", "EIA530A", "reserved", "X.21", "V.35", | ||
55 | "EIA449/EIA530/V.36", "V.28/EIA232", "none", NULL | ||
56 | }; | ||
57 | |||
58 | /* | ||
59 | * protocol independent method. | 51 | * protocol independent method. |
60 | */ | 52 | */ |
61 | static void lmc_set_protocol (lmc_softc_t * const, lmc_ctl_t *); | 53 | static void lmc_set_protocol (lmc_softc_t * const, lmc_ctl_t *); |
diff --git a/drivers/net/wan/pc300.h b/drivers/net/wan/pc300.h index 73401b0f0151..2024b26b99e6 100644 --- a/drivers/net/wan/pc300.h +++ b/drivers/net/wan/pc300.h | |||
@@ -472,24 +472,8 @@ enum pc300_loopback_cmds { | |||
472 | 472 | ||
473 | #ifdef __KERNEL__ | 473 | #ifdef __KERNEL__ |
474 | /* Function Prototypes */ | 474 | /* Function Prototypes */ |
475 | int dma_buf_write(pc300_t *, int, ucchar *, int); | ||
476 | int dma_buf_read(pc300_t *, int, struct sk_buff *); | ||
477 | void tx_dma_start(pc300_t *, int); | 475 | void tx_dma_start(pc300_t *, int); |
478 | void rx_dma_start(pc300_t *, int); | ||
479 | void tx_dma_stop(pc300_t *, int); | ||
480 | void rx_dma_stop(pc300_t *, int); | ||
481 | int cpc_queue_xmit(struct sk_buff *, struct net_device *); | ||
482 | void cpc_net_rx(struct net_device *); | ||
483 | void cpc_sca_status(pc300_t *, int); | ||
484 | int cpc_change_mtu(struct net_device *, int); | ||
485 | int cpc_ioctl(struct net_device *, struct ifreq *, int); | ||
486 | int ch_config(pc300dev_t *); | ||
487 | int rx_config(pc300dev_t *); | ||
488 | int tx_config(pc300dev_t *); | ||
489 | void cpc_opench(pc300dev_t *); | ||
490 | void cpc_closech(pc300dev_t *); | ||
491 | int cpc_open(struct net_device *dev); | 476 | int cpc_open(struct net_device *dev); |
492 | int cpc_close(struct net_device *dev); | ||
493 | int cpc_set_media(hdlc_device *, int); | 477 | int cpc_set_media(hdlc_device *, int); |
494 | #endif /* __KERNEL__ */ | 478 | #endif /* __KERNEL__ */ |
495 | 479 | ||
diff --git a/drivers/net/wan/pc300_drv.c b/drivers/net/wan/pc300_drv.c index 3e7753b10717..a3e65d1bc19b 100644 --- a/drivers/net/wan/pc300_drv.c +++ b/drivers/net/wan/pc300_drv.c | |||
@@ -291,6 +291,7 @@ static uclong detect_ram(pc300_t *); | |||
291 | static void plx_init(pc300_t *); | 291 | static void plx_init(pc300_t *); |
292 | static void cpc_trace(struct net_device *, struct sk_buff *, char); | 292 | static void cpc_trace(struct net_device *, struct sk_buff *, char); |
293 | static int cpc_attach(struct net_device *, unsigned short, unsigned short); | 293 | static int cpc_attach(struct net_device *, unsigned short, unsigned short); |
294 | static int cpc_close(struct net_device *dev); | ||
294 | 295 | ||
295 | #ifdef CONFIG_PC300_MLPPP | 296 | #ifdef CONFIG_PC300_MLPPP |
296 | void cpc_tty_init(pc300dev_t * dev); | 297 | void cpc_tty_init(pc300dev_t * dev); |
@@ -437,7 +438,7 @@ static void rx_dma_buf_check(pc300_t * card, int ch) | |||
437 | printk("\n"); | 438 | printk("\n"); |
438 | } | 439 | } |
439 | 440 | ||
440 | int dma_get_rx_frame_size(pc300_t * card, int ch) | 441 | static int dma_get_rx_frame_size(pc300_t * card, int ch) |
441 | { | 442 | { |
442 | volatile pcsca_bd_t __iomem *ptdescr; | 443 | volatile pcsca_bd_t __iomem *ptdescr; |
443 | ucshort first_bd = card->chan[ch].rx_first_bd; | 444 | ucshort first_bd = card->chan[ch].rx_first_bd; |
@@ -462,7 +463,7 @@ int dma_get_rx_frame_size(pc300_t * card, int ch) | |||
462 | * dma_buf_write: writes a frame to the Tx DMA buffers | 463 | * dma_buf_write: writes a frame to the Tx DMA buffers |
463 | * NOTE: this function writes one frame at a time. | 464 | * NOTE: this function writes one frame at a time. |
464 | */ | 465 | */ |
465 | int dma_buf_write(pc300_t * card, int ch, ucchar * ptdata, int len) | 466 | static int dma_buf_write(pc300_t * card, int ch, ucchar * ptdata, int len) |
466 | { | 467 | { |
467 | int i, nchar; | 468 | int i, nchar; |
468 | volatile pcsca_bd_t __iomem *ptdescr; | 469 | volatile pcsca_bd_t __iomem *ptdescr; |
@@ -503,7 +504,7 @@ int dma_buf_write(pc300_t * card, int ch, ucchar * ptdata, int len) | |||
503 | * dma_buf_read: reads a frame from the Rx DMA buffers | 504 | * dma_buf_read: reads a frame from the Rx DMA buffers |
504 | * NOTE: this function reads one frame at a time. | 505 | * NOTE: this function reads one frame at a time. |
505 | */ | 506 | */ |
506 | int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb) | 507 | static int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb) |
507 | { | 508 | { |
508 | int nchar; | 509 | int nchar; |
509 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 510 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
@@ -560,7 +561,7 @@ int dma_buf_read(pc300_t * card, int ch, struct sk_buff *skb) | |||
560 | return (rcvd); | 561 | return (rcvd); |
561 | } | 562 | } |
562 | 563 | ||
563 | void tx_dma_stop(pc300_t * card, int ch) | 564 | static void tx_dma_stop(pc300_t * card, int ch) |
564 | { | 565 | { |
565 | void __iomem *scabase = card->hw.scabase; | 566 | void __iomem *scabase = card->hw.scabase; |
566 | ucchar drr_ena_bit = 1 << (5 + 2 * ch); | 567 | ucchar drr_ena_bit = 1 << (5 + 2 * ch); |
@@ -571,7 +572,7 @@ void tx_dma_stop(pc300_t * card, int ch) | |||
571 | cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); | 572 | cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); |
572 | } | 573 | } |
573 | 574 | ||
574 | void rx_dma_stop(pc300_t * card, int ch) | 575 | static void rx_dma_stop(pc300_t * card, int ch) |
575 | { | 576 | { |
576 | void __iomem *scabase = card->hw.scabase; | 577 | void __iomem *scabase = card->hw.scabase; |
577 | ucchar drr_ena_bit = 1 << (4 + 2 * ch); | 578 | ucchar drr_ena_bit = 1 << (4 + 2 * ch); |
@@ -582,7 +583,7 @@ void rx_dma_stop(pc300_t * card, int ch) | |||
582 | cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); | 583 | cpc_writeb(scabase + DRR, drr_rst_bit & ~drr_ena_bit); |
583 | } | 584 | } |
584 | 585 | ||
585 | void rx_dma_start(pc300_t * card, int ch) | 586 | static void rx_dma_start(pc300_t * card, int ch) |
586 | { | 587 | { |
587 | void __iomem *scabase = card->hw.scabase; | 588 | void __iomem *scabase = card->hw.scabase; |
588 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 589 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
@@ -607,7 +608,7 @@ void rx_dma_start(pc300_t * card, int ch) | |||
607 | /*************************/ | 608 | /*************************/ |
608 | /*** FALC Routines ***/ | 609 | /*** FALC Routines ***/ |
609 | /*************************/ | 610 | /*************************/ |
610 | void falc_issue_cmd(pc300_t * card, int ch, ucchar cmd) | 611 | static void falc_issue_cmd(pc300_t * card, int ch, ucchar cmd) |
611 | { | 612 | { |
612 | void __iomem *falcbase = card->hw.falcbase; | 613 | void __iomem *falcbase = card->hw.falcbase; |
613 | unsigned long i = 0; | 614 | unsigned long i = 0; |
@@ -622,7 +623,7 @@ void falc_issue_cmd(pc300_t * card, int ch, ucchar cmd) | |||
622 | cpc_writeb(falcbase + F_REG(CMDR, ch), cmd); | 623 | cpc_writeb(falcbase + F_REG(CMDR, ch), cmd); |
623 | } | 624 | } |
624 | 625 | ||
625 | void falc_intr_enable(pc300_t * card, int ch) | 626 | static void falc_intr_enable(pc300_t * card, int ch) |
626 | { | 627 | { |
627 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 628 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
628 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 629 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -672,7 +673,7 @@ void falc_intr_enable(pc300_t * card, int ch) | |||
672 | } | 673 | } |
673 | } | 674 | } |
674 | 675 | ||
675 | void falc_open_timeslot(pc300_t * card, int ch, int timeslot) | 676 | static void falc_open_timeslot(pc300_t * card, int ch, int timeslot) |
676 | { | 677 | { |
677 | void __iomem *falcbase = card->hw.falcbase; | 678 | void __iomem *falcbase = card->hw.falcbase; |
678 | ucchar tshf = card->chan[ch].falc.offset; | 679 | ucchar tshf = card->chan[ch].falc.offset; |
@@ -688,7 +689,7 @@ void falc_open_timeslot(pc300_t * card, int ch, int timeslot) | |||
688 | (0x80 >> (timeslot & 0x07))); | 689 | (0x80 >> (timeslot & 0x07))); |
689 | } | 690 | } |
690 | 691 | ||
691 | void falc_close_timeslot(pc300_t * card, int ch, int timeslot) | 692 | static void falc_close_timeslot(pc300_t * card, int ch, int timeslot) |
692 | { | 693 | { |
693 | void __iomem *falcbase = card->hw.falcbase; | 694 | void __iomem *falcbase = card->hw.falcbase; |
694 | ucchar tshf = card->chan[ch].falc.offset; | 695 | ucchar tshf = card->chan[ch].falc.offset; |
@@ -704,7 +705,7 @@ void falc_close_timeslot(pc300_t * card, int ch, int timeslot) | |||
704 | ~(0x80 >> (timeslot & 0x07))); | 705 | ~(0x80 >> (timeslot & 0x07))); |
705 | } | 706 | } |
706 | 707 | ||
707 | void falc_close_all_timeslots(pc300_t * card, int ch) | 708 | static void falc_close_all_timeslots(pc300_t * card, int ch) |
708 | { | 709 | { |
709 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 710 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
710 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 711 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -726,7 +727,7 @@ void falc_close_all_timeslots(pc300_t * card, int ch) | |||
726 | } | 727 | } |
727 | } | 728 | } |
728 | 729 | ||
729 | void falc_open_all_timeslots(pc300_t * card, int ch) | 730 | static void falc_open_all_timeslots(pc300_t * card, int ch) |
730 | { | 731 | { |
731 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 732 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
732 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 733 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -758,7 +759,7 @@ void falc_open_all_timeslots(pc300_t * card, int ch) | |||
758 | } | 759 | } |
759 | } | 760 | } |
760 | 761 | ||
761 | void falc_init_timeslot(pc300_t * card, int ch) | 762 | static void falc_init_timeslot(pc300_t * card, int ch) |
762 | { | 763 | { |
763 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 764 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
764 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 765 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -776,7 +777,7 @@ void falc_init_timeslot(pc300_t * card, int ch) | |||
776 | } | 777 | } |
777 | } | 778 | } |
778 | 779 | ||
779 | void falc_enable_comm(pc300_t * card, int ch) | 780 | static void falc_enable_comm(pc300_t * card, int ch) |
780 | { | 781 | { |
781 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 782 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
782 | falc_t *pfalc = (falc_t *) & chan->falc; | 783 | falc_t *pfalc = (falc_t *) & chan->falc; |
@@ -792,7 +793,7 @@ void falc_enable_comm(pc300_t * card, int ch) | |||
792 | ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); | 793 | ~((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); |
793 | } | 794 | } |
794 | 795 | ||
795 | void falc_disable_comm(pc300_t * card, int ch) | 796 | static void falc_disable_comm(pc300_t * card, int ch) |
796 | { | 797 | { |
797 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 798 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
798 | falc_t *pfalc = (falc_t *) & chan->falc; | 799 | falc_t *pfalc = (falc_t *) & chan->falc; |
@@ -806,7 +807,7 @@ void falc_disable_comm(pc300_t * card, int ch) | |||
806 | ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); | 807 | ((CPLD_REG1_FALC_DCD | CPLD_REG1_FALC_CTS) << (2 * ch))); |
807 | } | 808 | } |
808 | 809 | ||
809 | void falc_init_t1(pc300_t * card, int ch) | 810 | static void falc_init_t1(pc300_t * card, int ch) |
810 | { | 811 | { |
811 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 812 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
812 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 813 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -975,7 +976,7 @@ void falc_init_t1(pc300_t * card, int ch) | |||
975 | falc_close_all_timeslots(card, ch); | 976 | falc_close_all_timeslots(card, ch); |
976 | } | 977 | } |
977 | 978 | ||
978 | void falc_init_e1(pc300_t * card, int ch) | 979 | static void falc_init_e1(pc300_t * card, int ch) |
979 | { | 980 | { |
980 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 981 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
981 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 982 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1155,7 +1156,7 @@ void falc_init_e1(pc300_t * card, int ch) | |||
1155 | falc_close_all_timeslots(card, ch); | 1156 | falc_close_all_timeslots(card, ch); |
1156 | } | 1157 | } |
1157 | 1158 | ||
1158 | void falc_init_hdlc(pc300_t * card, int ch) | 1159 | static void falc_init_hdlc(pc300_t * card, int ch) |
1159 | { | 1160 | { |
1160 | void __iomem *falcbase = card->hw.falcbase; | 1161 | void __iomem *falcbase = card->hw.falcbase; |
1161 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1162 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
@@ -1181,7 +1182,7 @@ void falc_init_hdlc(pc300_t * card, int ch) | |||
1181 | falc_intr_enable(card, ch); | 1182 | falc_intr_enable(card, ch); |
1182 | } | 1183 | } |
1183 | 1184 | ||
1184 | void te_config(pc300_t * card, int ch) | 1185 | static void te_config(pc300_t * card, int ch) |
1185 | { | 1186 | { |
1186 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1187 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1187 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1188 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1241,7 +1242,7 @@ void te_config(pc300_t * card, int ch) | |||
1241 | CPC_UNLOCK(card, flags); | 1242 | CPC_UNLOCK(card, flags); |
1242 | } | 1243 | } |
1243 | 1244 | ||
1244 | void falc_check_status(pc300_t * card, int ch, unsigned char frs0) | 1245 | static void falc_check_status(pc300_t * card, int ch, unsigned char frs0) |
1245 | { | 1246 | { |
1246 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1247 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1247 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1248 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1397,7 +1398,7 @@ void falc_check_status(pc300_t * card, int ch, unsigned char frs0) | |||
1397 | } | 1398 | } |
1398 | } | 1399 | } |
1399 | 1400 | ||
1400 | void falc_update_stats(pc300_t * card, int ch) | 1401 | static void falc_update_stats(pc300_t * card, int ch) |
1401 | { | 1402 | { |
1402 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1403 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1403 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1404 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1450,7 +1451,7 @@ void falc_update_stats(pc300_t * card, int ch) | |||
1450 | * the synchronizer and then sent to the system interface. | 1451 | * the synchronizer and then sent to the system interface. |
1451 | *---------------------------------------------------------------------------- | 1452 | *---------------------------------------------------------------------------- |
1452 | */ | 1453 | */ |
1453 | void falc_remote_loop(pc300_t * card, int ch, int loop_on) | 1454 | static void falc_remote_loop(pc300_t * card, int ch, int loop_on) |
1454 | { | 1455 | { |
1455 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1456 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1456 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1457 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1495,7 +1496,7 @@ void falc_remote_loop(pc300_t * card, int ch, int loop_on) | |||
1495 | * coding must be identical. | 1496 | * coding must be identical. |
1496 | *---------------------------------------------------------------------------- | 1497 | *---------------------------------------------------------------------------- |
1497 | */ | 1498 | */ |
1498 | void falc_local_loop(pc300_t * card, int ch, int loop_on) | 1499 | static void falc_local_loop(pc300_t * card, int ch, int loop_on) |
1499 | { | 1500 | { |
1500 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1501 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1501 | falc_t *pfalc = (falc_t *) & chan->falc; | 1502 | falc_t *pfalc = (falc_t *) & chan->falc; |
@@ -1522,7 +1523,7 @@ void falc_local_loop(pc300_t * card, int ch, int loop_on) | |||
1522 | * looped. They are originated by the FALC-LH transmitter. | 1523 | * looped. They are originated by the FALC-LH transmitter. |
1523 | *---------------------------------------------------------------------------- | 1524 | *---------------------------------------------------------------------------- |
1524 | */ | 1525 | */ |
1525 | void falc_payload_loop(pc300_t * card, int ch, int loop_on) | 1526 | static void falc_payload_loop(pc300_t * card, int ch, int loop_on) |
1526 | { | 1527 | { |
1527 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1528 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1528 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1529 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1576,7 +1577,7 @@ void falc_payload_loop(pc300_t * card, int ch, int loop_on) | |||
1576 | * Description: Turns XLU bit off in the proper register | 1577 | * Description: Turns XLU bit off in the proper register |
1577 | *---------------------------------------------------------------------------- | 1578 | *---------------------------------------------------------------------------- |
1578 | */ | 1579 | */ |
1579 | void turn_off_xlu(pc300_t * card, int ch) | 1580 | static void turn_off_xlu(pc300_t * card, int ch) |
1580 | { | 1581 | { |
1581 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1582 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1582 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1583 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1597,7 +1598,7 @@ void turn_off_xlu(pc300_t * card, int ch) | |||
1597 | * Description: Turns XLD bit off in the proper register | 1598 | * Description: Turns XLD bit off in the proper register |
1598 | *---------------------------------------------------------------------------- | 1599 | *---------------------------------------------------------------------------- |
1599 | */ | 1600 | */ |
1600 | void turn_off_xld(pc300_t * card, int ch) | 1601 | static void turn_off_xld(pc300_t * card, int ch) |
1601 | { | 1602 | { |
1602 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1603 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1603 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1604 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1619,7 +1620,7 @@ void turn_off_xld(pc300_t * card, int ch) | |||
1619 | * to generate a LOOP activation code over a T1/E1 line. | 1620 | * to generate a LOOP activation code over a T1/E1 line. |
1620 | *---------------------------------------------------------------------------- | 1621 | *---------------------------------------------------------------------------- |
1621 | */ | 1622 | */ |
1622 | void falc_generate_loop_up_code(pc300_t * card, int ch) | 1623 | static void falc_generate_loop_up_code(pc300_t * card, int ch) |
1623 | { | 1624 | { |
1624 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1625 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1625 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1626 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1652,7 +1653,7 @@ void falc_generate_loop_up_code(pc300_t * card, int ch) | |||
1652 | * to generate a LOOP deactivation code over a T1/E1 line. | 1653 | * to generate a LOOP deactivation code over a T1/E1 line. |
1653 | *---------------------------------------------------------------------------- | 1654 | *---------------------------------------------------------------------------- |
1654 | */ | 1655 | */ |
1655 | void falc_generate_loop_down_code(pc300_t * card, int ch) | 1656 | static void falc_generate_loop_down_code(pc300_t * card, int ch) |
1656 | { | 1657 | { |
1657 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1658 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1658 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1659 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1682,7 +1683,7 @@ void falc_generate_loop_down_code(pc300_t * card, int ch) | |||
1682 | * it on the reception side. | 1683 | * it on the reception side. |
1683 | *---------------------------------------------------------------------------- | 1684 | *---------------------------------------------------------------------------- |
1684 | */ | 1685 | */ |
1685 | void falc_pattern_test(pc300_t * card, int ch, unsigned int activate) | 1686 | static void falc_pattern_test(pc300_t * card, int ch, unsigned int activate) |
1686 | { | 1687 | { |
1687 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1688 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1688 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 1689 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -1729,7 +1730,7 @@ void falc_pattern_test(pc300_t * card, int ch, unsigned int activate) | |||
1729 | * Description: This routine returns the bit error counter value | 1730 | * Description: This routine returns the bit error counter value |
1730 | *---------------------------------------------------------------------------- | 1731 | *---------------------------------------------------------------------------- |
1731 | */ | 1732 | */ |
1732 | ucshort falc_pattern_test_error(pc300_t * card, int ch) | 1733 | static ucshort falc_pattern_test_error(pc300_t * card, int ch) |
1733 | { | 1734 | { |
1734 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; | 1735 | pc300ch_t *chan = (pc300ch_t *) & card->chan[ch]; |
1735 | falc_t *pfalc = (falc_t *) & chan->falc; | 1736 | falc_t *pfalc = (falc_t *) & chan->falc; |
@@ -1769,7 +1770,7 @@ cpc_trace(struct net_device *dev, struct sk_buff *skb_main, char rx_tx) | |||
1769 | netif_rx(skb); | 1770 | netif_rx(skb); |
1770 | } | 1771 | } |
1771 | 1772 | ||
1772 | void cpc_tx_timeout(struct net_device *dev) | 1773 | static void cpc_tx_timeout(struct net_device *dev) |
1773 | { | 1774 | { |
1774 | pc300dev_t *d = (pc300dev_t *) dev->priv; | 1775 | pc300dev_t *d = (pc300dev_t *) dev->priv; |
1775 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 1776 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
@@ -1797,7 +1798,7 @@ void cpc_tx_timeout(struct net_device *dev) | |||
1797 | netif_wake_queue(dev); | 1798 | netif_wake_queue(dev); |
1798 | } | 1799 | } |
1799 | 1800 | ||
1800 | int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev) | 1801 | static int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev) |
1801 | { | 1802 | { |
1802 | pc300dev_t *d = (pc300dev_t *) dev->priv; | 1803 | pc300dev_t *d = (pc300dev_t *) dev->priv; |
1803 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 1804 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
@@ -1880,7 +1881,7 @@ int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1880 | return 0; | 1881 | return 0; |
1881 | } | 1882 | } |
1882 | 1883 | ||
1883 | void cpc_net_rx(struct net_device *dev) | 1884 | static void cpc_net_rx(struct net_device *dev) |
1884 | { | 1885 | { |
1885 | pc300dev_t *d = (pc300dev_t *) dev->priv; | 1886 | pc300dev_t *d = (pc300dev_t *) dev->priv; |
1886 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 1887 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
@@ -2403,7 +2404,7 @@ static irqreturn_t cpc_intr(int irq, void *dev_id, struct pt_regs *regs) | |||
2403 | return IRQ_HANDLED; | 2404 | return IRQ_HANDLED; |
2404 | } | 2405 | } |
2405 | 2406 | ||
2406 | void cpc_sca_status(pc300_t * card, int ch) | 2407 | static void cpc_sca_status(pc300_t * card, int ch) |
2407 | { | 2408 | { |
2408 | ucchar ilar; | 2409 | ucchar ilar; |
2409 | void __iomem *scabase = card->hw.scabase; | 2410 | void __iomem *scabase = card->hw.scabase; |
@@ -2495,7 +2496,7 @@ void cpc_sca_status(pc300_t * card, int ch) | |||
2495 | } | 2496 | } |
2496 | } | 2497 | } |
2497 | 2498 | ||
2498 | void cpc_falc_status(pc300_t * card, int ch) | 2499 | static void cpc_falc_status(pc300_t * card, int ch) |
2499 | { | 2500 | { |
2500 | pc300ch_t *chan = &card->chan[ch]; | 2501 | pc300ch_t *chan = &card->chan[ch]; |
2501 | falc_t *pfalc = (falc_t *) & chan->falc; | 2502 | falc_t *pfalc = (falc_t *) & chan->falc; |
@@ -2523,7 +2524,7 @@ void cpc_falc_status(pc300_t * card, int ch) | |||
2523 | CPC_UNLOCK(card, flags); | 2524 | CPC_UNLOCK(card, flags); |
2524 | } | 2525 | } |
2525 | 2526 | ||
2526 | int cpc_change_mtu(struct net_device *dev, int new_mtu) | 2527 | static int cpc_change_mtu(struct net_device *dev, int new_mtu) |
2527 | { | 2528 | { |
2528 | if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU)) | 2529 | if ((new_mtu < 128) || (new_mtu > PC300_DEF_MTU)) |
2529 | return -EINVAL; | 2530 | return -EINVAL; |
@@ -2531,7 +2532,7 @@ int cpc_change_mtu(struct net_device *dev, int new_mtu) | |||
2531 | return 0; | 2532 | return 0; |
2532 | } | 2533 | } |
2533 | 2534 | ||
2534 | int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 2535 | static int cpc_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
2535 | { | 2536 | { |
2536 | hdlc_device *hdlc = dev_to_hdlc(dev); | 2537 | hdlc_device *hdlc = dev_to_hdlc(dev); |
2537 | pc300dev_t *d = (pc300dev_t *) dev->priv; | 2538 | pc300dev_t *d = (pc300dev_t *) dev->priv; |
@@ -2856,7 +2857,7 @@ static int clock_rate_calc(uclong rate, uclong clock, int *br_io) | |||
2856 | } | 2857 | } |
2857 | } | 2858 | } |
2858 | 2859 | ||
2859 | int ch_config(pc300dev_t * d) | 2860 | static int ch_config(pc300dev_t * d) |
2860 | { | 2861 | { |
2861 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 2862 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
2862 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; | 2863 | pc300chconf_t *conf = (pc300chconf_t *) & chan->conf; |
@@ -3004,7 +3005,7 @@ int ch_config(pc300dev_t * d) | |||
3004 | return 0; | 3005 | return 0; |
3005 | } | 3006 | } |
3006 | 3007 | ||
3007 | int rx_config(pc300dev_t * d) | 3008 | static int rx_config(pc300dev_t * d) |
3008 | { | 3009 | { |
3009 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 3010 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
3010 | pc300_t *card = (pc300_t *) chan->card; | 3011 | pc300_t *card = (pc300_t *) chan->card; |
@@ -3035,7 +3036,7 @@ int rx_config(pc300dev_t * d) | |||
3035 | return 0; | 3036 | return 0; |
3036 | } | 3037 | } |
3037 | 3038 | ||
3038 | int tx_config(pc300dev_t * d) | 3039 | static int tx_config(pc300dev_t * d) |
3039 | { | 3040 | { |
3040 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 3041 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
3041 | pc300_t *card = (pc300_t *) chan->card; | 3042 | pc300_t *card = (pc300_t *) chan->card; |
@@ -3098,7 +3099,7 @@ static int cpc_attach(struct net_device *dev, unsigned short encoding, | |||
3098 | return 0; | 3099 | return 0; |
3099 | } | 3100 | } |
3100 | 3101 | ||
3101 | void cpc_opench(pc300dev_t * d) | 3102 | static void cpc_opench(pc300dev_t * d) |
3102 | { | 3103 | { |
3103 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 3104 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
3104 | pc300_t *card = (pc300_t *) chan->card; | 3105 | pc300_t *card = (pc300_t *) chan->card; |
@@ -3116,7 +3117,7 @@ void cpc_opench(pc300dev_t * d) | |||
3116 | cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR)); | 3117 | cpc_readb(scabase + M_REG(CTL, ch)) & ~(CTL_RTS | CTL_DTR)); |
3117 | } | 3118 | } |
3118 | 3119 | ||
3119 | void cpc_closech(pc300dev_t * d) | 3120 | static void cpc_closech(pc300dev_t * d) |
3120 | { | 3121 | { |
3121 | pc300ch_t *chan = (pc300ch_t *) d->chan; | 3122 | pc300ch_t *chan = (pc300ch_t *) d->chan; |
3122 | pc300_t *card = (pc300_t *) chan->card; | 3123 | pc300_t *card = (pc300_t *) chan->card; |
@@ -3173,7 +3174,7 @@ int cpc_open(struct net_device *dev) | |||
3173 | return 0; | 3174 | return 0; |
3174 | } | 3175 | } |
3175 | 3176 | ||
3176 | int cpc_close(struct net_device *dev) | 3177 | static int cpc_close(struct net_device *dev) |
3177 | { | 3178 | { |
3178 | hdlc_device *hdlc = dev_to_hdlc(dev); | 3179 | hdlc_device *hdlc = dev_to_hdlc(dev); |
3179 | pc300dev_t *d = (pc300dev_t *) dev->priv; | 3180 | pc300dev_t *d = (pc300dev_t *) dev->priv; |
diff --git a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c index 8454bf6caaa7..52f26b9c69d2 100644 --- a/drivers/net/wan/pc300_tty.c +++ b/drivers/net/wan/pc300_tty.c | |||
@@ -112,10 +112,10 @@ typedef struct _st_cpc_tty_area { | |||
112 | static struct tty_driver serial_drv; | 112 | static struct tty_driver serial_drv; |
113 | 113 | ||
114 | /* local variables */ | 114 | /* local variables */ |
115 | st_cpc_tty_area cpc_tty_area[CPC_TTY_NPORTS]; | 115 | static st_cpc_tty_area cpc_tty_area[CPC_TTY_NPORTS]; |
116 | 116 | ||
117 | int cpc_tty_cnt=0; /* number of intrfaces configured with MLPPP */ | 117 | static int cpc_tty_cnt = 0; /* number of intrfaces configured with MLPPP */ |
118 | int cpc_tty_unreg_flag = 0; | 118 | static int cpc_tty_unreg_flag = 0; |
119 | 119 | ||
120 | /* TTY functions prototype */ | 120 | /* TTY functions prototype */ |
121 | static int cpc_tty_open(struct tty_struct *tty, struct file *flip); | 121 | static int cpc_tty_open(struct tty_struct *tty, struct file *flip); |
@@ -132,9 +132,9 @@ static void cpc_tty_trace(pc300dev_t *dev, char* buf, int len, char rxtx); | |||
132 | static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char); | 132 | static void cpc_tty_signal_off(pc300dev_t *pc300dev, unsigned char); |
133 | static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char); | 133 | static void cpc_tty_signal_on(pc300dev_t *pc300dev, unsigned char); |
134 | 134 | ||
135 | int pc300_tiocmset(struct tty_struct *, struct file *, | 135 | static int pc300_tiocmset(struct tty_struct *, struct file *, |
136 | unsigned int, unsigned int); | 136 | unsigned int, unsigned int); |
137 | int pc300_tiocmget(struct tty_struct *, struct file *); | 137 | static int pc300_tiocmget(struct tty_struct *, struct file *); |
138 | 138 | ||
139 | /* functions called by PC300 driver */ | 139 | /* functions called by PC300 driver */ |
140 | void cpc_tty_init(pc300dev_t *dev); | 140 | void cpc_tty_init(pc300dev_t *dev); |
@@ -538,8 +538,8 @@ static int cpc_tty_chars_in_buffer(struct tty_struct *tty) | |||
538 | return(0); | 538 | return(0); |
539 | } | 539 | } |
540 | 540 | ||
541 | int pc300_tiocmset(struct tty_struct *tty, struct file *file, | 541 | static int pc300_tiocmset(struct tty_struct *tty, struct file *file, |
542 | unsigned int set, unsigned int clear) | 542 | unsigned int set, unsigned int clear) |
543 | { | 543 | { |
544 | st_cpc_tty_area *cpc_tty; | 544 | st_cpc_tty_area *cpc_tty; |
545 | 545 | ||
@@ -565,7 +565,7 @@ int pc300_tiocmset(struct tty_struct *tty, struct file *file, | |||
565 | return 0; | 565 | return 0; |
566 | } | 566 | } |
567 | 567 | ||
568 | int pc300_tiocmget(struct tty_struct *tty, struct file *file) | 568 | static int pc300_tiocmget(struct tty_struct *tty, struct file *file) |
569 | { | 569 | { |
570 | unsigned int result; | 570 | unsigned int result; |
571 | unsigned char status; | 571 | unsigned char status; |
diff --git a/drivers/net/wan/sdla.c b/drivers/net/wan/sdla.c index 3ac9a45b20fa..036adc4f8ba7 100644 --- a/drivers/net/wan/sdla.c +++ b/drivers/net/wan/sdla.c | |||
@@ -182,7 +182,7 @@ static char sdla_byte(struct net_device *dev, int addr) | |||
182 | return(byte); | 182 | return(byte); |
183 | } | 183 | } |
184 | 184 | ||
185 | void sdla_stop(struct net_device *dev) | 185 | static void sdla_stop(struct net_device *dev) |
186 | { | 186 | { |
187 | struct frad_local *flp; | 187 | struct frad_local *flp; |
188 | 188 | ||
@@ -209,7 +209,7 @@ void sdla_stop(struct net_device *dev) | |||
209 | } | 209 | } |
210 | } | 210 | } |
211 | 211 | ||
212 | void sdla_start(struct net_device *dev) | 212 | static void sdla_start(struct net_device *dev) |
213 | { | 213 | { |
214 | struct frad_local *flp; | 214 | struct frad_local *flp; |
215 | 215 | ||
@@ -247,7 +247,7 @@ void sdla_start(struct net_device *dev) | |||
247 | * | 247 | * |
248 | ***************************************************/ | 248 | ***************************************************/ |
249 | 249 | ||
250 | int sdla_z80_poll(struct net_device *dev, int z80_addr, int jiffs, char resp1, char resp2) | 250 | static int sdla_z80_poll(struct net_device *dev, int z80_addr, int jiffs, char resp1, char resp2) |
251 | { | 251 | { |
252 | unsigned long start, done, now; | 252 | unsigned long start, done, now; |
253 | char resp, *temp; | 253 | char resp, *temp; |
@@ -505,7 +505,7 @@ static int sdla_cmd(struct net_device *dev, int cmd, short dlci, short flags, | |||
505 | 505 | ||
506 | static int sdla_reconfig(struct net_device *dev); | 506 | static int sdla_reconfig(struct net_device *dev); |
507 | 507 | ||
508 | int sdla_activate(struct net_device *slave, struct net_device *master) | 508 | static int sdla_activate(struct net_device *slave, struct net_device *master) |
509 | { | 509 | { |
510 | struct frad_local *flp; | 510 | struct frad_local *flp; |
511 | int i; | 511 | int i; |
@@ -527,7 +527,7 @@ int sdla_activate(struct net_device *slave, struct net_device *master) | |||
527 | return(0); | 527 | return(0); |
528 | } | 528 | } |
529 | 529 | ||
530 | int sdla_deactivate(struct net_device *slave, struct net_device *master) | 530 | static int sdla_deactivate(struct net_device *slave, struct net_device *master) |
531 | { | 531 | { |
532 | struct frad_local *flp; | 532 | struct frad_local *flp; |
533 | int i; | 533 | int i; |
@@ -549,7 +549,7 @@ int sdla_deactivate(struct net_device *slave, struct net_device *master) | |||
549 | return(0); | 549 | return(0); |
550 | } | 550 | } |
551 | 551 | ||
552 | int sdla_assoc(struct net_device *slave, struct net_device *master) | 552 | static int sdla_assoc(struct net_device *slave, struct net_device *master) |
553 | { | 553 | { |
554 | struct frad_local *flp; | 554 | struct frad_local *flp; |
555 | int i; | 555 | int i; |
@@ -585,7 +585,7 @@ int sdla_assoc(struct net_device *slave, struct net_device *master) | |||
585 | return(0); | 585 | return(0); |
586 | } | 586 | } |
587 | 587 | ||
588 | int sdla_deassoc(struct net_device *slave, struct net_device *master) | 588 | static int sdla_deassoc(struct net_device *slave, struct net_device *master) |
589 | { | 589 | { |
590 | struct frad_local *flp; | 590 | struct frad_local *flp; |
591 | int i; | 591 | int i; |
@@ -613,7 +613,7 @@ int sdla_deassoc(struct net_device *slave, struct net_device *master) | |||
613 | return(0); | 613 | return(0); |
614 | } | 614 | } |
615 | 615 | ||
616 | int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get) | 616 | static int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get) |
617 | { | 617 | { |
618 | struct frad_local *flp; | 618 | struct frad_local *flp; |
619 | struct dlci_local *dlp; | 619 | struct dlci_local *dlp; |
@@ -1324,7 +1324,7 @@ NOTE: This is rather a useless action right now, as the | |||
1324 | return(0); | 1324 | return(0); |
1325 | } | 1325 | } |
1326 | 1326 | ||
1327 | int sdla_change_mtu(struct net_device *dev, int new_mtu) | 1327 | static int sdla_change_mtu(struct net_device *dev, int new_mtu) |
1328 | { | 1328 | { |
1329 | struct frad_local *flp; | 1329 | struct frad_local *flp; |
1330 | 1330 | ||
@@ -1337,7 +1337,7 @@ int sdla_change_mtu(struct net_device *dev, int new_mtu) | |||
1337 | return(-EOPNOTSUPP); | 1337 | return(-EOPNOTSUPP); |
1338 | } | 1338 | } |
1339 | 1339 | ||
1340 | int sdla_set_config(struct net_device *dev, struct ifmap *map) | 1340 | static int sdla_set_config(struct net_device *dev, struct ifmap *map) |
1341 | { | 1341 | { |
1342 | struct frad_local *flp; | 1342 | struct frad_local *flp; |
1343 | int i; | 1343 | int i; |
diff --git a/drivers/net/wan/sdla_fr.c b/drivers/net/wan/sdla_fr.c index 0497dbdb8631..7f1ce9d4333e 100644 --- a/drivers/net/wan/sdla_fr.c +++ b/drivers/net/wan/sdla_fr.c | |||
@@ -822,7 +822,7 @@ static int new_if(struct wan_device* wandev, struct net_device* dev, | |||
822 | chan->card = card; | 822 | chan->card = card; |
823 | 823 | ||
824 | /* verify media address */ | 824 | /* verify media address */ |
825 | if (is_digit(conf->addr[0])) { | 825 | if (isdigit(conf->addr[0])) { |
826 | 826 | ||
827 | dlci = dec_to_uint(conf->addr, 0); | 827 | dlci = dec_to_uint(conf->addr, 0); |
828 | 828 | ||
@@ -3456,7 +3456,7 @@ static unsigned int dec_to_uint (unsigned char* str, int len) | |||
3456 | if (!len) | 3456 | if (!len) |
3457 | len = strlen(str); | 3457 | len = strlen(str); |
3458 | 3458 | ||
3459 | for (val = 0; len && is_digit(*str); ++str, --len) | 3459 | for (val = 0; len && isdigit(*str); ++str, --len) |
3460 | val = (val * 10) + (*str - (unsigned)'0'); | 3460 | val = (val * 10) + (*str - (unsigned)'0'); |
3461 | 3461 | ||
3462 | return val; | 3462 | return val; |
diff --git a/drivers/net/wan/sdla_x25.c b/drivers/net/wan/sdla_x25.c index 8a95d61a2f8f..63f846d6f3a6 100644 --- a/drivers/net/wan/sdla_x25.c +++ b/drivers/net/wan/sdla_x25.c | |||
@@ -957,7 +957,7 @@ static int new_if(struct wan_device* wandev, struct net_device* dev, | |||
957 | chan->hold_timeout = (conf->hold_timeout) ? | 957 | chan->hold_timeout = (conf->hold_timeout) ? |
958 | conf->hold_timeout : 10; | 958 | conf->hold_timeout : 10; |
959 | 959 | ||
960 | }else if (is_digit(conf->addr[0])){ /* PVC */ | 960 | }else if (isdigit(conf->addr[0])){ /* PVC */ |
961 | int lcn = dec_to_uint(conf->addr, 0); | 961 | int lcn = dec_to_uint(conf->addr, 0); |
962 | 962 | ||
963 | if ((lcn >= card->u.x.lo_pvc) && (lcn <= card->u.x.hi_pvc)){ | 963 | if ((lcn >= card->u.x.lo_pvc) && (lcn <= card->u.x.hi_pvc)){ |
@@ -3875,7 +3875,7 @@ static unsigned int dec_to_uint (unsigned char* str, int len) | |||
3875 | if (!len) | 3875 | if (!len) |
3876 | len = strlen(str); | 3876 | len = strlen(str); |
3877 | 3877 | ||
3878 | for (val = 0; len && is_digit(*str); ++str, --len) | 3878 | for (val = 0; len && isdigit(*str); ++str, --len) |
3879 | val = (val * 10) + (*str - (unsigned)'0'); | 3879 | val = (val * 10) + (*str - (unsigned)'0'); |
3880 | 3880 | ||
3881 | return val; | 3881 | return val; |
@@ -3896,9 +3896,9 @@ static unsigned int hex_to_uint (unsigned char* str, int len) | |||
3896 | for (val = 0; len; ++str, --len) | 3896 | for (val = 0; len; ++str, --len) |
3897 | { | 3897 | { |
3898 | ch = *str; | 3898 | ch = *str; |
3899 | if (is_digit(ch)) | 3899 | if (isdigit(ch)) |
3900 | val = (val << 4) + (ch - (unsigned)'0'); | 3900 | val = (val << 4) + (ch - (unsigned)'0'); |
3901 | else if (is_hex_digit(ch)) | 3901 | else if (isxdigit(ch)) |
3902 | val = (val << 4) + ((ch & 0xDF) - (unsigned)'A' + 10); | 3902 | val = (val << 4) + ((ch & 0xDF) - (unsigned)'A' + 10); |
3903 | else break; | 3903 | else break; |
3904 | } | 3904 | } |
diff --git a/drivers/net/wan/sdladrv.c b/drivers/net/wan/sdladrv.c index c8bc6da57a41..7c2cf2e76300 100644 --- a/drivers/net/wan/sdladrv.c +++ b/drivers/net/wan/sdladrv.c | |||
@@ -642,9 +642,7 @@ int sdla_mapmem (sdlahw_t* hw, unsigned long addr) | |||
642 | * Enable interrupt generation. | 642 | * Enable interrupt generation. |
643 | */ | 643 | */ |
644 | 644 | ||
645 | EXPORT_SYMBOL(sdla_inten); | 645 | static int sdla_inten (sdlahw_t* hw) |
646 | |||
647 | int sdla_inten (sdlahw_t* hw) | ||
648 | { | 646 | { |
649 | unsigned port = hw->port; | 647 | unsigned port = hw->port; |
650 | int tmp, i; | 648 | int tmp, i; |
@@ -698,8 +696,7 @@ int sdla_inten (sdlahw_t* hw) | |||
698 | * Disable interrupt generation. | 696 | * Disable interrupt generation. |
699 | */ | 697 | */ |
700 | 698 | ||
701 | EXPORT_SYMBOL(sdla_intde); | 699 | #if 0 |
702 | |||
703 | int sdla_intde (sdlahw_t* hw) | 700 | int sdla_intde (sdlahw_t* hw) |
704 | { | 701 | { |
705 | unsigned port = hw->port; | 702 | unsigned port = hw->port; |
@@ -748,14 +745,13 @@ int sdla_intde (sdlahw_t* hw) | |||
748 | } | 745 | } |
749 | return 0; | 746 | return 0; |
750 | } | 747 | } |
748 | #endif /* 0 */ | ||
751 | 749 | ||
752 | /*============================================================================ | 750 | /*============================================================================ |
753 | * Acknowledge SDLA hardware interrupt. | 751 | * Acknowledge SDLA hardware interrupt. |
754 | */ | 752 | */ |
755 | 753 | ||
756 | EXPORT_SYMBOL(sdla_intack); | 754 | static int sdla_intack (sdlahw_t* hw) |
757 | |||
758 | int sdla_intack (sdlahw_t* hw) | ||
759 | { | 755 | { |
760 | unsigned port = hw->port; | 756 | unsigned port = hw->port; |
761 | int tmp; | 757 | int tmp; |
@@ -827,8 +823,7 @@ void read_S514_int_stat (sdlahw_t* hw, u32* int_status) | |||
827 | * Generate an interrupt to adapter's CPU. | 823 | * Generate an interrupt to adapter's CPU. |
828 | */ | 824 | */ |
829 | 825 | ||
830 | EXPORT_SYMBOL(sdla_intr); | 826 | #if 0 |
831 | |||
832 | int sdla_intr (sdlahw_t* hw) | 827 | int sdla_intr (sdlahw_t* hw) |
833 | { | 828 | { |
834 | unsigned port = hw->port; | 829 | unsigned port = hw->port; |
@@ -863,6 +858,7 @@ int sdla_intr (sdlahw_t* hw) | |||
863 | } | 858 | } |
864 | return 0; | 859 | return 0; |
865 | } | 860 | } |
861 | #endif /* 0 */ | ||
866 | 862 | ||
867 | /*============================================================================ | 863 | /*============================================================================ |
868 | * Execute Adapter Command. | 864 | * Execute Adapter Command. |
diff --git a/drivers/net/wan/syncppp.c b/drivers/net/wan/syncppp.c index b56a7b516d24..3731b22f6757 100644 --- a/drivers/net/wan/syncppp.c +++ b/drivers/net/wan/syncppp.c | |||
@@ -221,7 +221,7 @@ static void sppp_clear_timeout(struct sppp *p) | |||
221 | * here. | 221 | * here. |
222 | */ | 222 | */ |
223 | 223 | ||
224 | void sppp_input (struct net_device *dev, struct sk_buff *skb) | 224 | static void sppp_input (struct net_device *dev, struct sk_buff *skb) |
225 | { | 225 | { |
226 | struct ppp_header *h; | 226 | struct ppp_header *h; |
227 | struct sppp *sp = (struct sppp *)sppp_of(dev); | 227 | struct sppp *sp = (struct sppp *)sppp_of(dev); |
@@ -355,8 +355,6 @@ done: | |||
355 | return; | 355 | return; |
356 | } | 356 | } |
357 | 357 | ||
358 | EXPORT_SYMBOL(sppp_input); | ||
359 | |||
360 | /* | 358 | /* |
361 | * Handle transmit packets. | 359 | * Handle transmit packets. |
362 | */ | 360 | */ |
@@ -990,7 +988,7 @@ EXPORT_SYMBOL(sppp_reopen); | |||
990 | * the mtu is out of range. | 988 | * the mtu is out of range. |
991 | */ | 989 | */ |
992 | 990 | ||
993 | int sppp_change_mtu(struct net_device *dev, int new_mtu) | 991 | static int sppp_change_mtu(struct net_device *dev, int new_mtu) |
994 | { | 992 | { |
995 | if(new_mtu<128||new_mtu>PPP_MTU||(dev->flags&IFF_UP)) | 993 | if(new_mtu<128||new_mtu>PPP_MTU||(dev->flags&IFF_UP)) |
996 | return -EINVAL; | 994 | return -EINVAL; |
@@ -998,8 +996,6 @@ int sppp_change_mtu(struct net_device *dev, int new_mtu) | |||
998 | return 0; | 996 | return 0; |
999 | } | 997 | } |
1000 | 998 | ||
1001 | EXPORT_SYMBOL(sppp_change_mtu); | ||
1002 | |||
1003 | /** | 999 | /** |
1004 | * sppp_do_ioctl - Ioctl handler for ppp/hdlc | 1000 | * sppp_do_ioctl - Ioctl handler for ppp/hdlc |
1005 | * @dev: Device subject to ioctl | 1001 | * @dev: Device subject to ioctl |
@@ -1456,7 +1452,7 @@ static int sppp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_t | |||
1456 | return 0; | 1452 | return 0; |
1457 | } | 1453 | } |
1458 | 1454 | ||
1459 | struct packet_type sppp_packet_type = { | 1455 | static struct packet_type sppp_packet_type = { |
1460 | .type = __constant_htons(ETH_P_WAN_PPP), | 1456 | .type = __constant_htons(ETH_P_WAN_PPP), |
1461 | .func = sppp_rcv, | 1457 | .func = sppp_rcv, |
1462 | }; | 1458 | }; |
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index 2414e6493aa5..e5cdb5bfabc8 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c | |||
@@ -800,8 +800,7 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv, | |||
800 | * doesn't seem to have as many firmware restart cycles... | 800 | * doesn't seem to have as many firmware restart cycles... |
801 | * | 801 | * |
802 | * As a test, we're sticking in a 1/100s delay here */ | 802 | * As a test, we're sticking in a 1/100s delay here */ |
803 | set_current_state(TASK_UNINTERRUPTIBLE); | 803 | schedule_timeout_uninterruptible(msecs_to_jiffies(10)); |
804 | schedule_timeout(HZ / 100); | ||
805 | 804 | ||
806 | return 0; | 805 | return 0; |
807 | 806 | ||
@@ -1256,8 +1255,7 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv) | |||
1256 | IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n"); | 1255 | IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n"); |
1257 | i = 5000; | 1256 | i = 5000; |
1258 | do { | 1257 | do { |
1259 | set_current_state(TASK_UNINTERRUPTIBLE); | 1258 | schedule_timeout_uninterruptible(msecs_to_jiffies(40)); |
1260 | schedule_timeout(40 * HZ / 1000); | ||
1261 | /* Todo... wait for sync command ... */ | 1259 | /* Todo... wait for sync command ... */ |
1262 | 1260 | ||
1263 | read_register(priv->net_dev, IPW_REG_INTA, &inta); | 1261 | read_register(priv->net_dev, IPW_REG_INTA, &inta); |
@@ -1411,8 +1409,7 @@ static int ipw2100_hw_phy_off(struct ipw2100_priv *priv) | |||
1411 | (val2 & IPW2100_COMMAND_PHY_OFF)) | 1409 | (val2 & IPW2100_COMMAND_PHY_OFF)) |
1412 | return 0; | 1410 | return 0; |
1413 | 1411 | ||
1414 | set_current_state(TASK_UNINTERRUPTIBLE); | 1412 | schedule_timeout_uninterruptible(HW_PHY_OFF_LOOP_DELAY); |
1415 | schedule_timeout(HW_PHY_OFF_LOOP_DELAY); | ||
1416 | } | 1413 | } |
1417 | 1414 | ||
1418 | return -EIO; | 1415 | return -EIO; |
@@ -1466,7 +1463,7 @@ fail_up: | |||
1466 | 1463 | ||
1467 | static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv) | 1464 | static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv) |
1468 | { | 1465 | { |
1469 | #define HW_POWER_DOWN_DELAY (HZ / 10) | 1466 | #define HW_POWER_DOWN_DELAY (msecs_to_jiffies(100)) |
1470 | 1467 | ||
1471 | struct host_command cmd = { | 1468 | struct host_command cmd = { |
1472 | .host_command = HOST_PRE_POWER_DOWN, | 1469 | .host_command = HOST_PRE_POWER_DOWN, |
@@ -1520,10 +1517,8 @@ static int ipw2100_hw_stop_adapter(struct ipw2100_priv *priv) | |||
1520 | printk(KERN_WARNING DRV_NAME ": " | 1517 | printk(KERN_WARNING DRV_NAME ": " |
1521 | "%s: Power down command failed: Error %d\n", | 1518 | "%s: Power down command failed: Error %d\n", |
1522 | priv->net_dev->name, err); | 1519 | priv->net_dev->name, err); |
1523 | else { | 1520 | else |
1524 | set_current_state(TASK_UNINTERRUPTIBLE); | 1521 | schedule_timeout_uninterruptible(HW_POWER_DOWN_DELAY); |
1525 | schedule_timeout(HW_POWER_DOWN_DELAY); | ||
1526 | } | ||
1527 | } | 1522 | } |
1528 | 1523 | ||
1529 | priv->status &= ~STATUS_ENABLED; | 1524 | priv->status &= ~STATUS_ENABLED; |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index b7f275c00de3..86feef732dbb 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -6010,12 +6010,12 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, | |||
6010 | } | 6010 | } |
6011 | 6011 | ||
6012 | if (priv->adapter == IPW_2915ABG) { | 6012 | if (priv->adapter == IPW_2915ABG) { |
6013 | priv->ieee->abg_ture = 1; | 6013 | priv->ieee->abg_true = 1; |
6014 | if (mode & IEEE_A) { | 6014 | if (mode & IEEE_A) { |
6015 | band |= IEEE80211_52GHZ_BAND; | 6015 | band |= IEEE80211_52GHZ_BAND; |
6016 | modulation |= IEEE80211_OFDM_MODULATION; | 6016 | modulation |= IEEE80211_OFDM_MODULATION; |
6017 | } else | 6017 | } else |
6018 | priv->ieee->abg_ture = 0; | 6018 | priv->ieee->abg_true = 0; |
6019 | } else { | 6019 | } else { |
6020 | if (mode & IEEE_A) { | 6020 | if (mode & IEEE_A) { |
6021 | IPW_WARNING("Attempt to set 2200BG into " | 6021 | IPW_WARNING("Attempt to set 2200BG into " |
@@ -6023,20 +6023,20 @@ static int ipw_wx_set_wireless_mode(struct net_device *dev, | |||
6023 | return -EINVAL; | 6023 | return -EINVAL; |
6024 | } | 6024 | } |
6025 | 6025 | ||
6026 | priv->ieee->abg_ture = 0; | 6026 | priv->ieee->abg_true = 0; |
6027 | } | 6027 | } |
6028 | 6028 | ||
6029 | if (mode & IEEE_B) { | 6029 | if (mode & IEEE_B) { |
6030 | band |= IEEE80211_24GHZ_BAND; | 6030 | band |= IEEE80211_24GHZ_BAND; |
6031 | modulation |= IEEE80211_CCK_MODULATION; | 6031 | modulation |= IEEE80211_CCK_MODULATION; |
6032 | } else | 6032 | } else |
6033 | priv->ieee->abg_ture = 0; | 6033 | priv->ieee->abg_true = 0; |
6034 | 6034 | ||
6035 | if (mode & IEEE_G) { | 6035 | if (mode & IEEE_G) { |
6036 | band |= IEEE80211_24GHZ_BAND; | 6036 | band |= IEEE80211_24GHZ_BAND; |
6037 | modulation |= IEEE80211_OFDM_MODULATION; | 6037 | modulation |= IEEE80211_OFDM_MODULATION; |
6038 | } else | 6038 | } else |
6039 | priv->ieee->abg_ture = 0; | 6039 | priv->ieee->abg_true = 0; |
6040 | 6040 | ||
6041 | priv->ieee->mode = mode; | 6041 | priv->ieee->mode = mode; |
6042 | priv->ieee->freq_band = band; | 6042 | priv->ieee->freq_band = band; |
@@ -7108,7 +7108,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
7108 | printk(KERN_INFO DRV_NAME | 7108 | printk(KERN_INFO DRV_NAME |
7109 | ": Detected Intel PRO/Wireless 2915ABG Network " | 7109 | ": Detected Intel PRO/Wireless 2915ABG Network " |
7110 | "Connection\n"); | 7110 | "Connection\n"); |
7111 | priv->ieee->abg_ture = 1; | 7111 | priv->ieee->abg_true = 1; |
7112 | band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND; | 7112 | band = IEEE80211_52GHZ_BAND | IEEE80211_24GHZ_BAND; |
7113 | modulation = IEEE80211_OFDM_MODULATION | | 7113 | modulation = IEEE80211_OFDM_MODULATION | |
7114 | IEEE80211_CCK_MODULATION; | 7114 | IEEE80211_CCK_MODULATION; |
@@ -7124,7 +7124,7 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
7124 | ": Detected Intel PRO/Wireless 2200BG Network " | 7124 | ": Detected Intel PRO/Wireless 2200BG Network " |
7125 | "Connection\n"); | 7125 | "Connection\n"); |
7126 | 7126 | ||
7127 | priv->ieee->abg_ture = 0; | 7127 | priv->ieee->abg_true = 0; |
7128 | band = IEEE80211_24GHZ_BAND; | 7128 | band = IEEE80211_24GHZ_BAND; |
7129 | modulation = IEEE80211_OFDM_MODULATION | | 7129 | modulation = IEEE80211_OFDM_MODULATION | |
7130 | IEEE80211_CCK_MODULATION; | 7130 | IEEE80211_CCK_MODULATION; |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index 8de49fe57233..77e93a225530 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
@@ -94,8 +94,6 @@ | |||
94 | #include <net/iw_handler.h> | 94 | #include <net/iw_handler.h> |
95 | #include <net/ieee80211.h> | 95 | #include <net/ieee80211.h> |
96 | 96 | ||
97 | #include <net/ieee80211.h> | ||
98 | |||
99 | #include <asm/uaccess.h> | 97 | #include <asm/uaccess.h> |
100 | #include <asm/io.h> | 98 | #include <asm/io.h> |
101 | #include <asm/system.h> | 99 | #include <asm/system.h> |
@@ -137,7 +135,7 @@ MODULE_PARM_DESC(force_monitor, "Allow monitor mode for all firmware versions"); | |||
137 | 135 | ||
138 | /* We do this this way to avoid ifdefs in the actual code */ | 136 | /* We do this this way to avoid ifdefs in the actual code */ |
139 | #ifdef WIRELESS_SPY | 137 | #ifdef WIRELESS_SPY |
140 | #define SPY_NUMBER(priv) (priv->spy_number) | 138 | #define SPY_NUMBER(priv) (priv->spy_data.spy_number) |
141 | #else | 139 | #else |
142 | #define SPY_NUMBER(priv) 0 | 140 | #define SPY_NUMBER(priv) 0 |
143 | #endif /* WIRELESS_SPY */ | 141 | #endif /* WIRELESS_SPY */ |
@@ -396,10 +394,10 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev) | |||
396 | /* If a spy address is defined, we report stats of the | 394 | /* If a spy address is defined, we report stats of the |
397 | * first spy address - Jean II */ | 395 | * first spy address - Jean II */ |
398 | if (SPY_NUMBER(priv)) { | 396 | if (SPY_NUMBER(priv)) { |
399 | wstats->qual.qual = priv->spy_stat[0].qual; | 397 | wstats->qual.qual = priv->spy_data.spy_stat[0].qual; |
400 | wstats->qual.level = priv->spy_stat[0].level; | 398 | wstats->qual.level = priv->spy_data.spy_stat[0].level; |
401 | wstats->qual.noise = priv->spy_stat[0].noise; | 399 | wstats->qual.noise = priv->spy_data.spy_stat[0].noise; |
402 | wstats->qual.updated = priv->spy_stat[0].updated; | 400 | wstats->qual.updated = priv->spy_data.spy_stat[0].updated; |
403 | } | 401 | } |
404 | } else { | 402 | } else { |
405 | struct { | 403 | struct { |
@@ -718,18 +716,13 @@ static inline int is_ethersnap(void *_hdr) | |||
718 | static inline void orinoco_spy_gather(struct net_device *dev, u_char *mac, | 716 | static inline void orinoco_spy_gather(struct net_device *dev, u_char *mac, |
719 | int level, int noise) | 717 | int level, int noise) |
720 | { | 718 | { |
721 | struct orinoco_private *priv = netdev_priv(dev); | 719 | struct iw_quality wstats; |
722 | int i; | 720 | wstats.level = level - 0x95; |
723 | 721 | wstats.noise = noise - 0x95; | |
724 | /* Gather wireless spy statistics: for each packet, compare the | 722 | wstats.qual = (level > noise) ? (level - noise) : 0; |
725 | * source address with out list, and if match, get the stats... */ | 723 | wstats.updated = 7; |
726 | for (i = 0; i < priv->spy_number; i++) | 724 | /* Update spy records */ |
727 | if (!memcmp(mac, priv->spy_address[i], ETH_ALEN)) { | 725 | wireless_spy_update(dev, mac, &wstats); |
728 | priv->spy_stat[i].level = level - 0x95; | ||
729 | priv->spy_stat[i].noise = noise - 0x95; | ||
730 | priv->spy_stat[i].qual = (level > noise) ? (level - noise) : 0; | ||
731 | priv->spy_stat[i].updated = 7; | ||
732 | } | ||
733 | } | 726 | } |
734 | 727 | ||
735 | static void orinoco_stat_gather(struct net_device *dev, | 728 | static void orinoco_stat_gather(struct net_device *dev, |
@@ -2458,8 +2451,11 @@ struct net_device *alloc_orinocodev(int sizeof_card, | |||
2458 | dev->watchdog_timeo = HZ; /* 1 second timeout */ | 2451 | dev->watchdog_timeo = HZ; /* 1 second timeout */ |
2459 | dev->get_stats = orinoco_get_stats; | 2452 | dev->get_stats = orinoco_get_stats; |
2460 | dev->ethtool_ops = &orinoco_ethtool_ops; | 2453 | dev->ethtool_ops = &orinoco_ethtool_ops; |
2461 | dev->get_wireless_stats = orinoco_get_wireless_stats; | ||
2462 | dev->wireless_handlers = (struct iw_handler_def *)&orinoco_handler_def; | 2454 | dev->wireless_handlers = (struct iw_handler_def *)&orinoco_handler_def; |
2455 | #ifdef WIRELESS_SPY | ||
2456 | priv->wireless_data.spy_data = &priv->spy_data; | ||
2457 | dev->wireless_data = &priv->wireless_data; | ||
2458 | #endif | ||
2463 | dev->change_mtu = orinoco_change_mtu; | 2459 | dev->change_mtu = orinoco_change_mtu; |
2464 | dev->set_multicast_list = orinoco_set_multicast_list; | 2460 | dev->set_multicast_list = orinoco_set_multicast_list; |
2465 | /* we use the default eth_mac_addr for setting the MAC addr */ | 2461 | /* we use the default eth_mac_addr for setting the MAC addr */ |
@@ -2831,7 +2827,7 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, | |||
2831 | } | 2827 | } |
2832 | } | 2828 | } |
2833 | 2829 | ||
2834 | if ((priv->iw_mode == IW_MODE_ADHOC) && (priv->spy_number == 0)){ | 2830 | if ((priv->iw_mode == IW_MODE_ADHOC) && (!SPY_NUMBER(priv))){ |
2835 | /* Quality stats meaningless in ad-hoc mode */ | 2831 | /* Quality stats meaningless in ad-hoc mode */ |
2836 | } else { | 2832 | } else { |
2837 | range->max_qual.qual = 0x8b - 0x2f; | 2833 | range->max_qual.qual = 0x8b - 0x2f; |
@@ -2878,6 +2874,14 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, | |||
2878 | range->min_r_time = 0; | 2874 | range->min_r_time = 0; |
2879 | range->max_r_time = 65535 * 1000; /* ??? */ | 2875 | range->max_r_time = 65535 * 1000; /* ??? */ |
2880 | 2876 | ||
2877 | /* Event capability (kernel) */ | ||
2878 | IW_EVENT_CAPA_SET_KERNEL(range->event_capa); | ||
2879 | /* Event capability (driver) */ | ||
2880 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWTHRSPY); | ||
2881 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWAP); | ||
2882 | IW_EVENT_CAPA_SET(range->event_capa, SIOCGIWSCAN); | ||
2883 | IW_EVENT_CAPA_SET(range->event_capa, IWEVTXDROP); | ||
2884 | |||
2881 | TRACE_EXIT(dev->name); | 2885 | TRACE_EXIT(dev->name); |
2882 | 2886 | ||
2883 | return 0; | 2887 | return 0; |
@@ -3837,92 +3841,6 @@ static int orinoco_ioctl_getrid(struct net_device *dev, | |||
3837 | return err; | 3841 | return err; |
3838 | } | 3842 | } |
3839 | 3843 | ||
3840 | /* Spy is used for link quality/strength measurements in Ad-Hoc mode | ||
3841 | * Jean II */ | ||
3842 | static int orinoco_ioctl_setspy(struct net_device *dev, | ||
3843 | struct iw_request_info *info, | ||
3844 | struct iw_point *srq, | ||
3845 | char *extra) | ||
3846 | |||
3847 | { | ||
3848 | struct orinoco_private *priv = netdev_priv(dev); | ||
3849 | struct sockaddr *address = (struct sockaddr *) extra; | ||
3850 | int number = srq->length; | ||
3851 | int i; | ||
3852 | unsigned long flags; | ||
3853 | |||
3854 | /* Make sure nobody mess with the structure while we do */ | ||
3855 | if (orinoco_lock(priv, &flags) != 0) | ||
3856 | return -EBUSY; | ||
3857 | |||
3858 | /* orinoco_lock() doesn't disable interrupts, so make sure the | ||
3859 | * interrupt rx path don't get confused while we copy */ | ||
3860 | priv->spy_number = 0; | ||
3861 | |||
3862 | if (number > 0) { | ||
3863 | /* Extract the addresses */ | ||
3864 | for (i = 0; i < number; i++) | ||
3865 | memcpy(priv->spy_address[i], address[i].sa_data, | ||
3866 | ETH_ALEN); | ||
3867 | /* Reset stats */ | ||
3868 | memset(priv->spy_stat, 0, | ||
3869 | sizeof(struct iw_quality) * IW_MAX_SPY); | ||
3870 | /* Set number of addresses */ | ||
3871 | priv->spy_number = number; | ||
3872 | } | ||
3873 | |||
3874 | /* Now, let the others play */ | ||
3875 | orinoco_unlock(priv, &flags); | ||
3876 | |||
3877 | /* Do NOT call commit handler */ | ||
3878 | return 0; | ||
3879 | } | ||
3880 | |||
3881 | static int orinoco_ioctl_getspy(struct net_device *dev, | ||
3882 | struct iw_request_info *info, | ||
3883 | struct iw_point *srq, | ||
3884 | char *extra) | ||
3885 | { | ||
3886 | struct orinoco_private *priv = netdev_priv(dev); | ||
3887 | struct sockaddr *address = (struct sockaddr *) extra; | ||
3888 | int number; | ||
3889 | int i; | ||
3890 | unsigned long flags; | ||
3891 | |||
3892 | if (orinoco_lock(priv, &flags) != 0) | ||
3893 | return -EBUSY; | ||
3894 | |||
3895 | number = priv->spy_number; | ||
3896 | /* Create address struct */ | ||
3897 | for (i = 0; i < number; i++) { | ||
3898 | memcpy(address[i].sa_data, priv->spy_address[i], ETH_ALEN); | ||
3899 | address[i].sa_family = AF_UNIX; | ||
3900 | } | ||
3901 | if (number > 0) { | ||
3902 | /* Create address struct */ | ||
3903 | for (i = 0; i < number; i++) { | ||
3904 | memcpy(address[i].sa_data, priv->spy_address[i], | ||
3905 | ETH_ALEN); | ||
3906 | address[i].sa_family = AF_UNIX; | ||
3907 | } | ||
3908 | /* Copy stats */ | ||
3909 | /* In theory, we should disable irqs while copying the stats | ||
3910 | * because the rx path might update it in the middle... | ||
3911 | * Bah, who care ? - Jean II */ | ||
3912 | memcpy(extra + (sizeof(struct sockaddr) * number), | ||
3913 | priv->spy_stat, sizeof(struct iw_quality) * number); | ||
3914 | } | ||
3915 | /* Reset updated flags. */ | ||
3916 | for (i = 0; i < number; i++) | ||
3917 | priv->spy_stat[i].updated = 0; | ||
3918 | |||
3919 | orinoco_unlock(priv, &flags); | ||
3920 | |||
3921 | srq->length = number; | ||
3922 | |||
3923 | return 0; | ||
3924 | } | ||
3925 | |||
3926 | /* Trigger a scan (look for other cells in the vicinity */ | 3844 | /* Trigger a scan (look for other cells in the vicinity */ |
3927 | static int orinoco_ioctl_setscan(struct net_device *dev, | 3845 | static int orinoco_ioctl_setscan(struct net_device *dev, |
3928 | struct iw_request_info *info, | 3846 | struct iw_request_info *info, |
@@ -4353,8 +4271,10 @@ static const iw_handler orinoco_handler[] = { | |||
4353 | [SIOCSIWSENS -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setsens, | 4271 | [SIOCSIWSENS -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setsens, |
4354 | [SIOCGIWSENS -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getsens, | 4272 | [SIOCGIWSENS -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getsens, |
4355 | [SIOCGIWRANGE -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getiwrange, | 4273 | [SIOCGIWRANGE -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getiwrange, |
4356 | [SIOCSIWSPY -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setspy, | 4274 | [SIOCSIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_set_spy, |
4357 | [SIOCGIWSPY -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getspy, | 4275 | [SIOCGIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_get_spy, |
4276 | [SIOCSIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_set_thrspy, | ||
4277 | [SIOCGIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_get_thrspy, | ||
4358 | [SIOCSIWAP -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setwap, | 4278 | [SIOCSIWAP -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setwap, |
4359 | [SIOCGIWAP -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getwap, | 4279 | [SIOCGIWAP -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_getwap, |
4360 | [SIOCSIWSCAN -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setscan, | 4280 | [SIOCSIWSCAN -SIOCIWFIRST] = (iw_handler) orinoco_ioctl_setscan, |
@@ -4399,6 +4319,7 @@ static const struct iw_handler_def orinoco_handler_def = { | |||
4399 | .standard = orinoco_handler, | 4319 | .standard = orinoco_handler, |
4400 | .private = orinoco_private_handler, | 4320 | .private = orinoco_private_handler, |
4401 | .private_args = orinoco_privtab, | 4321 | .private_args = orinoco_privtab, |
4322 | .get_wireless_stats = orinoco_get_wireless_stats, | ||
4402 | }; | 4323 | }; |
4403 | 4324 | ||
4404 | static void orinoco_get_drvinfo(struct net_device *dev, | 4325 | static void orinoco_get_drvinfo(struct net_device *dev, |
diff --git a/drivers/net/wireless/orinoco.h b/drivers/net/wireless/orinoco.h index 2f213a7103fe..c800563034a7 100644 --- a/drivers/net/wireless/orinoco.h +++ b/drivers/net/wireless/orinoco.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
14 | #include <linux/netdevice.h> | 14 | #include <linux/netdevice.h> |
15 | #include <linux/wireless.h> | 15 | #include <linux/wireless.h> |
16 | #include <net/iw_handler.h> | ||
16 | #include <linux/version.h> | 17 | #include <linux/version.h> |
17 | 18 | ||
18 | #include "hermes.h" | 19 | #include "hermes.h" |
@@ -112,9 +113,8 @@ struct orinoco_private { | |||
112 | u16 pm_on, pm_mcast, pm_period, pm_timeout; | 113 | u16 pm_on, pm_mcast, pm_period, pm_timeout; |
113 | u16 preamble; | 114 | u16 preamble; |
114 | #ifdef WIRELESS_SPY | 115 | #ifdef WIRELESS_SPY |
115 | int spy_number; | 116 | struct iw_spy_data spy_data; /* iwspy support */ |
116 | u_char spy_address[IW_MAX_SPY][ETH_ALEN]; | 117 | struct iw_public_data wireless_data; |
117 | struct iw_quality spy_stat[IW_MAX_SPY]; | ||
118 | #endif | 118 | #endif |
119 | 119 | ||
120 | /* Configuration dependent variables */ | 120 | /* Configuration dependent variables */ |
diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c index bedd7f9f23e4..80920b1c6fcf 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c | |||
@@ -14,9 +14,6 @@ | |||
14 | #define PFX DRIVER_NAME ": " | 14 | #define PFX DRIVER_NAME ": " |
15 | 15 | ||
16 | #include <linux/config.h> | 16 | #include <linux/config.h> |
17 | #ifdef __IN_PCMCIA_PACKAGE__ | ||
18 | #include <pcmcia/k_compat.h> | ||
19 | #endif /* __IN_PCMCIA_PACKAGE__ */ | ||
20 | 17 | ||
21 | #include <linux/module.h> | 18 | #include <linux/module.h> |
22 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
@@ -603,49 +600,85 @@ static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION | |||
603 | "Pavel Roskin <proski@gnu.org>, et al)"; | 600 | "Pavel Roskin <proski@gnu.org>, et al)"; |
604 | 601 | ||
605 | static struct pcmcia_device_id orinoco_cs_ids[] = { | 602 | static struct pcmcia_device_id orinoco_cs_ids[] = { |
606 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), | 603 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), /* SonicWALL Long Range Wireless Card */ |
607 | PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), | 604 | PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), /* Sohoware NCP110, Philips 802.11b */ |
608 | PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), | 605 | PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), /* AnyPoint(TM) Wireless II PC Card */ |
609 | PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), | 606 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), /* 3Com AirConnect PCI 777A */ |
610 | PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), | 607 | PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), /* PROXIM RangeLAN-DS/LAN PC CARD */ |
611 | PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), | 608 | PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), /* Compaq WL100 11 Mbps Wireless Adapter */ |
612 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), | 609 | PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), /* Lucent Orinoco and old Intersil */ |
613 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), | 610 | PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), /* Ericsson WLAN Card C11 */ |
614 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), | 611 | PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), /* Nortel Networks eMobility 802.11 Wireless Adapter */ |
615 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), | 612 | PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), /* Intermec MobileLAN 11Mbps 802.11b WLAN Card */ |
616 | PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), | 613 | PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), /* Samsung SWL2000-N 11Mb/s WLAN Card */ |
617 | PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), | 614 | PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), /* AirWay 802.11 Adapter (PCMCIA) */ |
618 | PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), | 615 | PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), /* ARtem Onair */ |
619 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), | 616 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), /* Buffalo WLI-PCM-S11 */ |
620 | PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), | 617 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), /* Linksys WPC11 Version 2.5 */ |
621 | PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), | 618 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), /* Linksys WPC11 Version 3 */ |
622 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), | 619 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), /* Compaq HNW-100 11 Mbps Wireless Adapter */ |
623 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), | 620 | PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), /* Linksys WCF12 Wireless CompactFlash Card */ |
621 | PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), /* ASUS SpaceLink WL-100 */ | ||
622 | PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), /* SpeedStream SS1021 Wireless Adapter */ | ||
623 | PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), /* PLANEX RoadLannerWave GW-NS11H */ | ||
624 | PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), /* Airvast WN-100 */ | ||
625 | PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), /* Adaptec Ultra Wireless ANW-8030 */ | ||
626 | PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), /* CONTEC FLEXSCAN/FX-DDS110-PCC */ | ||
627 | PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), /* Conceptronic CON11Cpro, EMTAC A2424i */ | ||
628 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), /* Safeway 802.11b, ZCOMAX AirRunner/XI-300 */ | ||
629 | PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), /* D-Link DCF660, Sandisk Connect SDWCFB-000 */ | ||
630 | PCMCIA_DEVICE_PROD_ID12(" ", "IEEE 802.11 Wireless LAN/PC Card", 0x3b6e20c8, 0xefccafe9), | ||
624 | PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), | 631 | PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), |
625 | PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0), | ||
626 | PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), | 632 | PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), |
633 | PCMCIA_DEVICE_PROD_ID12("Addtron", "AWP-100 Wireless PCMCIA", 0xe6ec52ce, 0x08649af2), | ||
634 | PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092), | ||
635 | PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), | ||
636 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), | ||
637 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), | ||
627 | PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169), | 638 | PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169), |
639 | PCMCIA_DEVICE_PROD_ID12("BENQ", "AWL100 PCMCIA ADAPTER", 0x35dadc74, 0x01f7fedb), | ||
628 | PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3), | 640 | PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3), |
641 | PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), | ||
629 | PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), | 642 | PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), |
643 | PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), | ||
644 | PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39), | ||
630 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), | 645 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), |
631 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), | 646 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), |
632 | PCMCIA_DEVICE_PROD_ID12("corega_K.K.", "Wireless_LAN_PCCB-11", 0x29e33311, 0xee7a27ae), | 647 | PCMCIA_DEVICE_PROD_ID12("corega_K.K.", "Wireless_LAN_PCCB-11", 0x29e33311, 0xee7a27ae), |
633 | PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac), | 648 | PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac), |
634 | PCMCIA_DEVICE_PROD_ID12("D", "Link DWL-650 11Mbps WLAN Card", 0x71b18589, 0xb6f1b0ab), | 649 | PCMCIA_DEVICE_PROD_ID12("D", "Link DWL-650 11Mbps WLAN Card", 0x71b18589, 0xb6f1b0ab), |
650 | PCMCIA_DEVICE_PROD_ID12("D-Link Corporation", "D-Link DWL-650H 11Mbps WLAN Adapter", 0xef544d24, 0xcd8ea916), | ||
651 | PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", 0xfdd73470, 0xe0b6f146), | ||
635 | PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3), | 652 | PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3), |
636 | PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c), | 653 | PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c), |
654 | PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0), | ||
655 | PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless 2011 LAN PC Card", 0x816cc815, 0x07f58077), | ||
637 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), | 656 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), |
657 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), | ||
658 | PCMCIA_DEVICE_PROD_ID12("Intersil", "PRISM 2_5 PCMCIA ADAPTER", 0x4b801a17, 0x6345a0bf), | ||
659 | PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2), | ||
660 | PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), | ||
661 | PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), | ||
638 | PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), | 662 | PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), |
639 | PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410), | 663 | PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410), |
640 | PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3), | 664 | PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3), |
641 | PCMCIA_DEVICE_PROD_ID12("Microsoft", "Wireless Notebook Adapter MN-520", 0x5961bf85, 0x6eec8c01), | 665 | PCMCIA_DEVICE_PROD_ID12("Microsoft", "Wireless Notebook Adapter MN-520", 0x5961bf85, 0x6eec8c01), |
642 | PCMCIA_DEVICE_PROD_ID12("NCR", "WaveLAN/IEEE", 0x24358cd4, 0xc562e72a), | 666 | PCMCIA_DEVICE_PROD_ID12("NCR", "WaveLAN/IEEE", 0x24358cd4, 0xc562e72a), |
667 | PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401 Wireless PC", "Card", 0xa37434e9, 0x9762e8f1), | ||
643 | PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401RA Wireless PC", "Card", 0x0306467f, 0x9762e8f1), | 668 | PCMCIA_DEVICE_PROD_ID12("NETGEAR MA401RA Wireless PC", "Card", 0x0306467f, 0x9762e8f1), |
669 | PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), | ||
670 | PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), | ||
671 | PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), | ||
672 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "11M WLAN Card v2.5", "ISL37300P", 0x281f1c5d, 0x6e440487, 0xc9049a39), | ||
644 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), | 673 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), |
674 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), | ||
645 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), | 675 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), |
646 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26), | 676 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26), |
647 | PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b), | 677 | PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b), |
648 | PCMCIA_DEVICE_PROD_ID1("Symbol Technologies", 0x3f02b4d6), | 678 | PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2632W", 0xc4f8b18b, 0x474a1f2a), |
679 | PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), | ||
680 | PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), | ||
681 | PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), | ||
649 | PCMCIA_DEVICE_NULL, | 682 | PCMCIA_DEVICE_NULL, |
650 | }; | 683 | }; |
651 | MODULE_DEVICE_TABLE(pcmcia, orinoco_cs_ids); | 684 | MODULE_DEVICE_TABLE(pcmcia, orinoco_cs_ids); |
diff --git a/drivers/net/wireless/prism54/islpci_dev.c b/drivers/net/wireless/prism54/islpci_dev.c index 6f13d4a8e2d3..10cce514c15d 100644 --- a/drivers/net/wireless/prism54/islpci_dev.c +++ b/drivers/net/wireless/prism54/islpci_dev.c | |||
@@ -439,8 +439,7 @@ prism54_bring_down(islpci_private *priv) | |||
439 | wmb(); | 439 | wmb(); |
440 | 440 | ||
441 | /* wait a while for the device to reset */ | 441 | /* wait a while for the device to reset */ |
442 | set_current_state(TASK_UNINTERRUPTIBLE); | 442 | schedule_timeout_uninterruptible(msecs_to_jiffies(50)); |
443 | schedule_timeout(50*HZ/1000); | ||
444 | 443 | ||
445 | return 0; | 444 | return 0; |
446 | } | 445 | } |
@@ -491,8 +490,7 @@ islpci_reset_if(islpci_private *priv) | |||
491 | /* The software reset acknowledge needs about 220 msec here. | 490 | /* The software reset acknowledge needs about 220 msec here. |
492 | * Be conservative and wait for up to one second. */ | 491 | * Be conservative and wait for up to one second. */ |
493 | 492 | ||
494 | set_current_state(TASK_UNINTERRUPTIBLE); | 493 | remaining = schedule_timeout_uninterruptible(HZ); |
495 | remaining = schedule_timeout(HZ); | ||
496 | 494 | ||
497 | if(remaining > 0) { | 495 | if(remaining > 0) { |
498 | result = 0; | 496 | result = 0; |
diff --git a/drivers/net/wireless/prism54/islpci_mgt.c b/drivers/net/wireless/prism54/islpci_mgt.c index b6f2e5a223be..4937a5ad4b2c 100644 --- a/drivers/net/wireless/prism54/islpci_mgt.c +++ b/drivers/net/wireless/prism54/islpci_mgt.c | |||
@@ -455,7 +455,7 @@ islpci_mgt_transaction(struct net_device *ndev, | |||
455 | struct islpci_mgmtframe **recvframe) | 455 | struct islpci_mgmtframe **recvframe) |
456 | { | 456 | { |
457 | islpci_private *priv = netdev_priv(ndev); | 457 | islpci_private *priv = netdev_priv(ndev); |
458 | const long wait_cycle_jiffies = (ISL38XX_WAIT_CYCLE * 10 * HZ) / 1000; | 458 | const long wait_cycle_jiffies = msecs_to_jiffies(ISL38XX_WAIT_CYCLE * 10); |
459 | long timeout_left = ISL38XX_MAX_WAIT_CYCLES * wait_cycle_jiffies; | 459 | long timeout_left = ISL38XX_MAX_WAIT_CYCLES * wait_cycle_jiffies; |
460 | int err; | 460 | int err; |
461 | DEFINE_WAIT(wait); | 461 | DEFINE_WAIT(wait); |
@@ -475,8 +475,7 @@ islpci_mgt_transaction(struct net_device *ndev, | |||
475 | int timeleft; | 475 | int timeleft; |
476 | struct islpci_mgmtframe *frame; | 476 | struct islpci_mgmtframe *frame; |
477 | 477 | ||
478 | set_current_state(TASK_UNINTERRUPTIBLE); | 478 | timeleft = schedule_timeout_uninterruptible(wait_cycle_jiffies); |
479 | timeleft = schedule_timeout(wait_cycle_jiffies); | ||
480 | frame = xchg(&priv->mgmt_received, NULL); | 479 | frame = xchg(&priv->mgmt_received, NULL); |
481 | if (frame) { | 480 | if (frame) { |
482 | if (frame->header->oid == oid) { | 481 | if (frame->header->oid == oid) { |
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index e9c5ea0f5535..70fd6fd8feb9 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
@@ -1649,28 +1649,28 @@ static iw_stats * ray_get_wireless_stats(struct net_device * dev) | |||
1649 | */ | 1649 | */ |
1650 | 1650 | ||
1651 | static const iw_handler ray_handler[] = { | 1651 | static const iw_handler ray_handler[] = { |
1652 | [SIOCSIWCOMMIT-SIOCIWFIRST] (iw_handler) ray_commit, | 1652 | [SIOCSIWCOMMIT-SIOCIWFIRST] = (iw_handler) ray_commit, |
1653 | [SIOCGIWNAME -SIOCIWFIRST] (iw_handler) ray_get_name, | 1653 | [SIOCGIWNAME -SIOCIWFIRST] = (iw_handler) ray_get_name, |
1654 | [SIOCSIWFREQ -SIOCIWFIRST] (iw_handler) ray_set_freq, | 1654 | [SIOCSIWFREQ -SIOCIWFIRST] = (iw_handler) ray_set_freq, |
1655 | [SIOCGIWFREQ -SIOCIWFIRST] (iw_handler) ray_get_freq, | 1655 | [SIOCGIWFREQ -SIOCIWFIRST] = (iw_handler) ray_get_freq, |
1656 | [SIOCSIWMODE -SIOCIWFIRST] (iw_handler) ray_set_mode, | 1656 | [SIOCSIWMODE -SIOCIWFIRST] = (iw_handler) ray_set_mode, |
1657 | [SIOCGIWMODE -SIOCIWFIRST] (iw_handler) ray_get_mode, | 1657 | [SIOCGIWMODE -SIOCIWFIRST] = (iw_handler) ray_get_mode, |
1658 | [SIOCGIWRANGE -SIOCIWFIRST] (iw_handler) ray_get_range, | 1658 | [SIOCGIWRANGE -SIOCIWFIRST] = (iw_handler) ray_get_range, |
1659 | #ifdef WIRELESS_SPY | 1659 | #ifdef WIRELESS_SPY |
1660 | [SIOCSIWSPY -SIOCIWFIRST] (iw_handler) iw_handler_set_spy, | 1660 | [SIOCSIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_set_spy, |
1661 | [SIOCGIWSPY -SIOCIWFIRST] (iw_handler) iw_handler_get_spy, | 1661 | [SIOCGIWSPY -SIOCIWFIRST] = (iw_handler) iw_handler_get_spy, |
1662 | [SIOCSIWTHRSPY-SIOCIWFIRST] (iw_handler) iw_handler_set_thrspy, | 1662 | [SIOCSIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_set_thrspy, |
1663 | [SIOCGIWTHRSPY-SIOCIWFIRST] (iw_handler) iw_handler_get_thrspy, | 1663 | [SIOCGIWTHRSPY-SIOCIWFIRST] = (iw_handler) iw_handler_get_thrspy, |
1664 | #endif /* WIRELESS_SPY */ | 1664 | #endif /* WIRELESS_SPY */ |
1665 | [SIOCGIWAP -SIOCIWFIRST] (iw_handler) ray_get_wap, | 1665 | [SIOCGIWAP -SIOCIWFIRST] = (iw_handler) ray_get_wap, |
1666 | [SIOCSIWESSID -SIOCIWFIRST] (iw_handler) ray_set_essid, | 1666 | [SIOCSIWESSID -SIOCIWFIRST] = (iw_handler) ray_set_essid, |
1667 | [SIOCGIWESSID -SIOCIWFIRST] (iw_handler) ray_get_essid, | 1667 | [SIOCGIWESSID -SIOCIWFIRST] = (iw_handler) ray_get_essid, |
1668 | [SIOCSIWRATE -SIOCIWFIRST] (iw_handler) ray_set_rate, | 1668 | [SIOCSIWRATE -SIOCIWFIRST] = (iw_handler) ray_set_rate, |
1669 | [SIOCGIWRATE -SIOCIWFIRST] (iw_handler) ray_get_rate, | 1669 | [SIOCGIWRATE -SIOCIWFIRST] = (iw_handler) ray_get_rate, |
1670 | [SIOCSIWRTS -SIOCIWFIRST] (iw_handler) ray_set_rts, | 1670 | [SIOCSIWRTS -SIOCIWFIRST] = (iw_handler) ray_set_rts, |
1671 | [SIOCGIWRTS -SIOCIWFIRST] (iw_handler) ray_get_rts, | 1671 | [SIOCGIWRTS -SIOCIWFIRST] = (iw_handler) ray_get_rts, |
1672 | [SIOCSIWFRAG -SIOCIWFIRST] (iw_handler) ray_set_frag, | 1672 | [SIOCSIWFRAG -SIOCIWFIRST] = (iw_handler) ray_set_frag, |
1673 | [SIOCGIWFRAG -SIOCIWFIRST] (iw_handler) ray_get_frag, | 1673 | [SIOCGIWFRAG -SIOCIWFIRST] = (iw_handler) ray_get_frag, |
1674 | }; | 1674 | }; |
1675 | 1675 | ||
1676 | #define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */ | 1676 | #define SIOCSIPFRAMING SIOCIWFIRSTPRIV /* Set framing mode */ |
@@ -1678,9 +1678,9 @@ static const iw_handler ray_handler[] = { | |||
1678 | #define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */ | 1678 | #define SIOCGIPCOUNTRY SIOCIWFIRSTPRIV + 3 /* Get country code */ |
1679 | 1679 | ||
1680 | static const iw_handler ray_private_handler[] = { | 1680 | static const iw_handler ray_private_handler[] = { |
1681 | [0] (iw_handler) ray_set_framing, | 1681 | [0] = (iw_handler) ray_set_framing, |
1682 | [1] (iw_handler) ray_get_framing, | 1682 | [1] = (iw_handler) ray_get_framing, |
1683 | [3] (iw_handler) ray_get_country, | 1683 | [3] = (iw_handler) ray_get_country, |
1684 | }; | 1684 | }; |
1685 | 1685 | ||
1686 | static const struct iw_priv_args ray_private_args[] = { | 1686 | static const struct iw_priv_args ray_private_args[] = { |
diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index 39c6cdf7f3f7..63e00422d1a0 100644 --- a/drivers/net/wireless/spectrum_cs.c +++ b/drivers/net/wireless/spectrum_cs.c | |||
@@ -22,9 +22,6 @@ | |||
22 | #define PFX DRIVER_NAME ": " | 22 | #define PFX DRIVER_NAME ": " |
23 | 23 | ||
24 | #include <linux/config.h> | 24 | #include <linux/config.h> |
25 | #ifdef __IN_PCMCIA_PACKAGE__ | ||
26 | #include <pcmcia/k_compat.h> | ||
27 | #endif /* __IN_PCMCIA_PACKAGE__ */ | ||
28 | 25 | ||
29 | #include <linux/module.h> | 26 | #include <linux/module.h> |
30 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
@@ -38,6 +35,7 @@ | |||
38 | #include <linux/if_arp.h> | 35 | #include <linux/if_arp.h> |
39 | #include <linux/etherdevice.h> | 36 | #include <linux/etherdevice.h> |
40 | #include <linux/wireless.h> | 37 | #include <linux/wireless.h> |
38 | #include <linux/firmware.h> | ||
41 | 39 | ||
42 | #include <pcmcia/cs_types.h> | 40 | #include <pcmcia/cs_types.h> |
43 | #include <pcmcia/cs.h> | 41 | #include <pcmcia/cs.h> |
@@ -51,29 +49,10 @@ | |||
51 | 49 | ||
52 | #include "orinoco.h" | 50 | #include "orinoco.h" |
53 | 51 | ||
54 | /* | ||
55 | * If SPECTRUM_FW_INCLUDED is defined, the firmware is hardcoded into | ||
56 | * the driver. Use get_symbol_fw script to generate spectrum_fw.h and | ||
57 | * copy it to the same directory as spectrum_cs.c. | ||
58 | * | ||
59 | * If SPECTRUM_FW_INCLUDED is not defined, the firmware is loaded at the | ||
60 | * runtime using hotplug. Use the same get_symbol_fw script to generate | ||
61 | * files symbol_sp24t_prim_fw symbol_sp24t_sec_fw, copy them to the | ||
62 | * hotplug firmware directory (typically /usr/lib/hotplug/firmware) and | ||
63 | * make sure that you have hotplug installed and enabled in the kernel. | ||
64 | */ | ||
65 | /* #define SPECTRUM_FW_INCLUDED 1 */ | ||
66 | |||
67 | #ifdef SPECTRUM_FW_INCLUDED | ||
68 | /* Header with the firmware */ | ||
69 | #include "spectrum_fw.h" | ||
70 | #else /* !SPECTRUM_FW_INCLUDED */ | ||
71 | #include <linux/firmware.h> | ||
72 | static unsigned char *primsym; | 52 | static unsigned char *primsym; |
73 | static unsigned char *secsym; | 53 | static unsigned char *secsym; |
74 | static const char primary_fw_name[] = "symbol_sp24t_prim_fw"; | 54 | static const char primary_fw_name[] = "symbol_sp24t_prim_fw"; |
75 | static const char secondary_fw_name[] = "symbol_sp24t_sec_fw"; | 55 | static const char secondary_fw_name[] = "symbol_sp24t_sec_fw"; |
76 | #endif /* !SPECTRUM_FW_INCLUDED */ | ||
77 | 56 | ||
78 | /********************************************************************/ | 57 | /********************************************************************/ |
79 | /* Module stuff */ | 58 | /* Module stuff */ |
@@ -571,8 +550,6 @@ spectrum_dl_firmware(hermes_t *hw, dev_link_t *link) | |||
571 | { | 550 | { |
572 | int ret; | 551 | int ret; |
573 | client_handle_t handle = link->handle; | 552 | client_handle_t handle = link->handle; |
574 | |||
575 | #ifndef SPECTRUM_FW_INCLUDED | ||
576 | const struct firmware *fw_entry; | 553 | const struct firmware *fw_entry; |
577 | 554 | ||
578 | if (request_firmware(&fw_entry, primary_fw_name, | 555 | if (request_firmware(&fw_entry, primary_fw_name, |
@@ -592,7 +569,6 @@ spectrum_dl_firmware(hermes_t *hw, dev_link_t *link) | |||
592 | secondary_fw_name); | 569 | secondary_fw_name); |
593 | return -ENOENT; | 570 | return -ENOENT; |
594 | } | 571 | } |
595 | #endif | ||
596 | 572 | ||
597 | /* Load primary firmware */ | 573 | /* Load primary firmware */ |
598 | ret = spectrum_dl_image(hw, link, primsym); | 574 | ret = spectrum_dl_image(hw, link, primsym); |
@@ -1085,7 +1061,7 @@ static char version[] __initdata = DRIVER_NAME " " DRIVER_VERSION | |||
1085 | static struct pcmcia_device_id spectrum_cs_ids[] = { | 1061 | static struct pcmcia_device_id spectrum_cs_ids[] = { |
1086 | PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4100 */ | 1062 | PCMCIA_DEVICE_MANF_CARD(0x026c, 0x0001), /* Symbol Spectrum24 LA4100 */ |
1087 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0001), /* Socket Communications CF */ | 1063 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0001), /* Socket Communications CF */ |
1088 | PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0001), /* Intel PRO/Wireless 2011B */ | 1064 | PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless LAN PC Card", 0x816cc815, 0x6fbf459a), /* 2011B, not 2011 */ |
1089 | PCMCIA_DEVICE_NULL, | 1065 | PCMCIA_DEVICE_NULL, |
1090 | }; | 1066 | }; |
1091 | MODULE_DEVICE_TABLE(pcmcia, spectrum_cs_ids); | 1067 | MODULE_DEVICE_TABLE(pcmcia, spectrum_cs_ids); |
diff --git a/include/linux/cyclomx.h b/include/linux/cyclomx.h index 04fa7dff079c..300d704bdb9a 100644 --- a/include/linux/cyclomx.h +++ b/include/linux/cyclomx.h | |||
@@ -37,8 +37,6 @@ | |||
37 | #include <linux/cycx_x25.h> | 37 | #include <linux/cycx_x25.h> |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | #define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0) | ||
41 | |||
42 | /* Adapter Data Space. | 40 | /* Adapter Data Space. |
43 | * This structure is needed because we handle multiple cards, otherwise | 41 | * This structure is needed because we handle multiple cards, otherwise |
44 | * static data would do it. | 42 | * static data would do it. |
diff --git a/include/linux/cycx_drv.h b/include/linux/cycx_drv.h index 6621df86a748..12fe6b0bfcff 100644 --- a/include/linux/cycx_drv.h +++ b/include/linux/cycx_drv.h | |||
@@ -60,6 +60,5 @@ extern int cycx_peek(struct cycx_hw *hw, u32 addr, void *buf, u32 len); | |||
60 | extern int cycx_poke(struct cycx_hw *hw, u32 addr, void *buf, u32 len); | 60 | extern int cycx_poke(struct cycx_hw *hw, u32 addr, void *buf, u32 len); |
61 | extern int cycx_exec(void __iomem *addr); | 61 | extern int cycx_exec(void __iomem *addr); |
62 | 62 | ||
63 | extern void cycx_inten(struct cycx_hw *hw); | ||
64 | extern void cycx_intr(struct cycx_hw *hw); | 63 | extern void cycx_intr(struct cycx_hw *hw); |
65 | #endif /* _CYCX_DRV_H */ | 64 | #endif /* _CYCX_DRV_H */ |
diff --git a/include/linux/ibmtr.h b/include/linux/ibmtr.h index 2ef0b21517fb..1c7a0dd5536a 100644 --- a/include/linux/ibmtr.h +++ b/include/linux/ibmtr.h | |||
@@ -7,8 +7,8 @@ | |||
7 | /* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */ | 7 | /* ported to the Alpha architecture 02/20/96 (just used the HZ macro) */ |
8 | 8 | ||
9 | #define TR_RETRY_INTERVAL (30*HZ) /* 500 on PC = 5 s */ | 9 | #define TR_RETRY_INTERVAL (30*HZ) /* 500 on PC = 5 s */ |
10 | #define TR_RST_TIME (HZ/20) /* 5 on PC = 50 ms */ | 10 | #define TR_RST_TIME (msecs_to_jiffies(50)) /* 5 on PC = 50 ms */ |
11 | #define TR_BUSY_INTERVAL (HZ/5) /* 5 on PC = 200 ms */ | 11 | #define TR_BUSY_INTERVAL (msecs_to_jiffies(200)) /* 5 on PC = 200 ms */ |
12 | #define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */ | 12 | #define TR_SPIN_INTERVAL (3*HZ) /* 3 seconds before init timeout */ |
13 | 13 | ||
14 | #define TR_ISA 1 | 14 | #define TR_ISA 1 |
diff --git a/include/linux/mii.h b/include/linux/mii.h index 9b8d0476988a..68f5a0f392dd 100644 --- a/include/linux/mii.h +++ b/include/linux/mii.h | |||
@@ -158,6 +158,7 @@ extern int mii_link_ok (struct mii_if_info *mii); | |||
158 | extern int mii_nway_restart (struct mii_if_info *mii); | 158 | extern int mii_nway_restart (struct mii_if_info *mii); |
159 | extern int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); | 159 | extern int mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); |
160 | extern int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); | 160 | extern int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd); |
161 | extern int mii_check_gmii_support(struct mii_if_info *mii); | ||
161 | extern void mii_check_link (struct mii_if_info *mii); | 162 | extern void mii_check_link (struct mii_if_info *mii); |
162 | extern unsigned int mii_check_media (struct mii_if_info *mii, | 163 | extern unsigned int mii_check_media (struct mii_if_info *mii, |
163 | unsigned int ok_to_print, | 164 | unsigned int ok_to_print, |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 7c717907896d..98c98e6cd4f3 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -852,11 +852,9 @@ static inline void netif_rx_complete(struct net_device *dev) | |||
852 | 852 | ||
853 | static inline void netif_poll_disable(struct net_device *dev) | 853 | static inline void netif_poll_disable(struct net_device *dev) |
854 | { | 854 | { |
855 | while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { | 855 | while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) |
856 | /* No hurry. */ | 856 | /* No hurry. */ |
857 | current->state = TASK_INTERRUPTIBLE; | 857 | schedule_timeout_interruptible(1); |
858 | schedule_timeout(1); | ||
859 | } | ||
860 | } | 858 | } |
861 | 859 | ||
862 | static inline void netif_poll_enable(struct net_device *dev) | 860 | static inline void netif_poll_enable(struct net_device *dev) |
diff --git a/include/linux/sdladrv.h b/include/linux/sdladrv.h index 78f634007fc6..c85e103d5e7b 100644 --- a/include/linux/sdladrv.h +++ b/include/linux/sdladrv.h | |||
@@ -52,12 +52,8 @@ typedef struct sdlahw | |||
52 | 52 | ||
53 | extern int sdla_setup (sdlahw_t* hw, void* sfm, unsigned len); | 53 | extern int sdla_setup (sdlahw_t* hw, void* sfm, unsigned len); |
54 | extern int sdla_down (sdlahw_t* hw); | 54 | extern int sdla_down (sdlahw_t* hw); |
55 | extern int sdla_inten (sdlahw_t* hw); | ||
56 | extern int sdla_intde (sdlahw_t* hw); | ||
57 | extern int sdla_intack (sdlahw_t* hw); | ||
58 | extern void S514_intack (sdlahw_t* hw, u32 int_status); | 55 | extern void S514_intack (sdlahw_t* hw, u32 int_status); |
59 | extern void read_S514_int_stat (sdlahw_t* hw, u32* int_status); | 56 | extern void read_S514_int_stat (sdlahw_t* hw, u32* int_status); |
60 | extern int sdla_intr (sdlahw_t* hw); | ||
61 | extern int sdla_mapmem (sdlahw_t* hw, unsigned long addr); | 57 | extern int sdla_mapmem (sdlahw_t* hw, unsigned long addr); |
62 | extern int sdla_peek (sdlahw_t* hw, unsigned long addr, void* buf, | 58 | extern int sdla_peek (sdlahw_t* hw, unsigned long addr, void* buf, |
63 | unsigned len); | 59 | unsigned len); |
diff --git a/include/linux/wanpipe.h b/include/linux/wanpipe.h index 167d956c492b..dae9860091dd 100644 --- a/include/linux/wanpipe.h +++ b/include/linux/wanpipe.h | |||
@@ -265,15 +265,6 @@ typedef struct { | |||
265 | #include <linux/tty_driver.h> | 265 | #include <linux/tty_driver.h> |
266 | #include <linux/tty_flip.h> | 266 | #include <linux/tty_flip.h> |
267 | 267 | ||
268 | |||
269 | #define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0) | ||
270 | #define is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||\ | ||
271 | ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0) | ||
272 | #define is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||\ | ||
273 | ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\ | ||
274 | ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0) | ||
275 | |||
276 | |||
277 | /****** Data Structures *****************************************************/ | 268 | /****** Data Structures *****************************************************/ |
278 | 269 | ||
279 | /* Adapter Data Space. | 270 | /* Adapter Data Space. |
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index dc36b1be6745..2d9c679cf6b6 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h | |||
@@ -20,8 +20,8 @@ | |||
20 | */ | 20 | */ |
21 | #ifndef IEEE80211_H | 21 | #ifndef IEEE80211_H |
22 | #define IEEE80211_H | 22 | #define IEEE80211_H |
23 | #include <linux/if_ether.h> /* ETH_ALEN */ | 23 | #include <linux/if_ether.h> /* ETH_ALEN */ |
24 | #include <linux/kernel.h> /* ARRAY_SIZE */ | 24 | #include <linux/kernel.h> /* ARRAY_SIZE */ |
25 | #include <linux/wireless.h> | 25 | #include <linux/wireless.h> |
26 | 26 | ||
27 | #define IEEE80211_DATA_LEN 2304 | 27 | #define IEEE80211_DATA_LEN 2304 |
@@ -33,7 +33,6 @@ | |||
33 | represents the 2304 bytes of real data, plus a possible 8 bytes of | 33 | represents the 2304 bytes of real data, plus a possible 8 bytes of |
34 | WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ | 34 | WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ |
35 | 35 | ||
36 | |||
37 | #define IEEE80211_HLEN 30 | 36 | #define IEEE80211_HLEN 30 |
38 | #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) | 37 | #define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) |
39 | 38 | ||
@@ -117,7 +116,6 @@ struct ieee80211_hdr_3addr { | |||
117 | #define IEEE80211_SCTL_FRAG 0x000F | 116 | #define IEEE80211_SCTL_FRAG 0x000F |
118 | #define IEEE80211_SCTL_SEQ 0xFFF0 | 117 | #define IEEE80211_SCTL_SEQ 0xFFF0 |
119 | 118 | ||
120 | |||
121 | /* debug macros */ | 119 | /* debug macros */ |
122 | 120 | ||
123 | #ifdef CONFIG_IEEE80211_DEBUG | 121 | #ifdef CONFIG_IEEE80211_DEBUG |
@@ -128,8 +126,7 @@ do { if (ieee80211_debug_level & (level)) \ | |||
128 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) | 126 | in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) |
129 | #else | 127 | #else |
130 | #define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) | 128 | #define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) |
131 | #endif /* CONFIG_IEEE80211_DEBUG */ | 129 | #endif /* CONFIG_IEEE80211_DEBUG */ |
132 | |||
133 | 130 | ||
134 | /* debug macros not dependent on CONFIG_IEEE80211_DEBUG */ | 131 | /* debug macros not dependent on CONFIG_IEEE80211_DEBUG */ |
135 | 132 | ||
@@ -140,7 +137,6 @@ do { if (ieee80211_debug_level & (level)) \ | |||
140 | * messages. It should never be used for passing essid to user space. */ | 137 | * messages. It should never be used for passing essid to user space. */ |
141 | const char *escape_essid(const char *essid, u8 essid_len); | 138 | const char *escape_essid(const char *essid, u8 essid_len); |
142 | 139 | ||
143 | |||
144 | /* | 140 | /* |
145 | * To use the debug system: | 141 | * To use the debug system: |
146 | * | 142 | * |
@@ -192,7 +188,7 @@ const char *escape_essid(const char *essid, u8 essid_len); | |||
192 | #define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a) | 188 | #define IEEE80211_DEBUG_RX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a) |
193 | #include <linux/netdevice.h> | 189 | #include <linux/netdevice.h> |
194 | #include <linux/wireless.h> | 190 | #include <linux/wireless.h> |
195 | #include <linux/if_arp.h> /* ARPHRD_ETHER */ | 191 | #include <linux/if_arp.h> /* ARPHRD_ETHER */ |
196 | 192 | ||
197 | #ifndef WIRELESS_SPY | 193 | #ifndef WIRELESS_SPY |
198 | #define WIRELESS_SPY /* enable iwspy support */ | 194 | #define WIRELESS_SPY /* enable iwspy support */ |
@@ -200,10 +196,10 @@ const char *escape_essid(const char *essid, u8 essid_len); | |||
200 | #include <net/iw_handler.h> /* new driver API */ | 196 | #include <net/iw_handler.h> /* new driver API */ |
201 | 197 | ||
202 | #ifndef ETH_P_PAE | 198 | #ifndef ETH_P_PAE |
203 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ | 199 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ |
204 | #endif /* ETH_P_PAE */ | 200 | #endif /* ETH_P_PAE */ |
205 | 201 | ||
206 | #define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ | 202 | #define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ |
207 | 203 | ||
208 | #ifndef ETH_P_80211_RAW | 204 | #ifndef ETH_P_80211_RAW |
209 | #define ETH_P_80211_RAW (ETH_P_ECONET + 1) | 205 | #define ETH_P_80211_RAW (ETH_P_ECONET + 1) |
@@ -215,10 +211,10 @@ const char *escape_essid(const char *essid, u8 essid_len); | |||
215 | 211 | ||
216 | struct ieee80211_snap_hdr { | 212 | struct ieee80211_snap_hdr { |
217 | 213 | ||
218 | u8 dsap; /* always 0xAA */ | 214 | u8 dsap; /* always 0xAA */ |
219 | u8 ssap; /* always 0xAA */ | 215 | u8 ssap; /* always 0xAA */ |
220 | u8 ctrl; /* always 0x03 */ | 216 | u8 ctrl; /* always 0x03 */ |
221 | u8 oui[P80211_OUI_LEN]; /* organizational universal id */ | 217 | u8 oui[P80211_OUI_LEN]; /* organizational universal id */ |
222 | 218 | ||
223 | } __attribute__ ((packed)); | 219 | } __attribute__ ((packed)); |
224 | 220 | ||
@@ -312,14 +308,12 @@ enum ieee80211_reasoncode { | |||
312 | WLAN_REASON_CIPHER_SUITE_REJECTED = 24, | 308 | WLAN_REASON_CIPHER_SUITE_REJECTED = 24, |
313 | }; | 309 | }; |
314 | 310 | ||
315 | |||
316 | #define IEEE80211_STATMASK_SIGNAL (1<<0) | 311 | #define IEEE80211_STATMASK_SIGNAL (1<<0) |
317 | #define IEEE80211_STATMASK_RSSI (1<<1) | 312 | #define IEEE80211_STATMASK_RSSI (1<<1) |
318 | #define IEEE80211_STATMASK_NOISE (1<<2) | 313 | #define IEEE80211_STATMASK_NOISE (1<<2) |
319 | #define IEEE80211_STATMASK_RATE (1<<3) | 314 | #define IEEE80211_STATMASK_RATE (1<<3) |
320 | #define IEEE80211_STATMASK_WEMASK 0x7 | 315 | #define IEEE80211_STATMASK_WEMASK 0x7 |
321 | 316 | ||
322 | |||
323 | #define IEEE80211_CCK_MODULATION (1<<0) | 317 | #define IEEE80211_CCK_MODULATION (1<<0) |
324 | #define IEEE80211_OFDM_MODULATION (1<<1) | 318 | #define IEEE80211_OFDM_MODULATION (1<<1) |
325 | 319 | ||
@@ -377,9 +371,6 @@ enum ieee80211_reasoncode { | |||
377 | #define IEEE80211_NUM_CCK_RATES 4 | 371 | #define IEEE80211_NUM_CCK_RATES 4 |
378 | #define IEEE80211_OFDM_SHIFT_MASK_A 4 | 372 | #define IEEE80211_OFDM_SHIFT_MASK_A 4 |
379 | 373 | ||
380 | |||
381 | |||
382 | |||
383 | /* NOTE: This data is for statistical purposes; not all hardware provides this | 374 | /* NOTE: This data is for statistical purposes; not all hardware provides this |
384 | * information for frames received. Not setting these will not cause | 375 | * information for frames received. Not setting these will not cause |
385 | * any adverse affects. */ | 376 | * any adverse affects. */ |
@@ -388,7 +379,7 @@ struct ieee80211_rx_stats { | |||
388 | s8 rssi; | 379 | s8 rssi; |
389 | u8 signal; | 380 | u8 signal; |
390 | u8 noise; | 381 | u8 noise; |
391 | u16 rate; /* in 100 kbps */ | 382 | u16 rate; /* in 100 kbps */ |
392 | u8 received_channel; | 383 | u8 received_channel; |
393 | u8 control; | 384 | u8 control; |
394 | u8 mask; | 385 | u8 mask; |
@@ -449,28 +440,24 @@ struct ieee80211_device; | |||
449 | #define SEC_LEVEL (1<<7) | 440 | #define SEC_LEVEL (1<<7) |
450 | #define SEC_ENABLED (1<<8) | 441 | #define SEC_ENABLED (1<<8) |
451 | 442 | ||
452 | #define SEC_LEVEL_0 0 /* None */ | 443 | #define SEC_LEVEL_0 0 /* None */ |
453 | #define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ | 444 | #define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ |
454 | #define SEC_LEVEL_2 2 /* Level 1 + TKIP */ | 445 | #define SEC_LEVEL_2 2 /* Level 1 + TKIP */ |
455 | #define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ | 446 | #define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ |
456 | #define SEC_LEVEL_3 4 /* Level 2 + CCMP */ | 447 | #define SEC_LEVEL_3 4 /* Level 2 + CCMP */ |
457 | 448 | ||
458 | #define WEP_KEYS 4 | 449 | #define WEP_KEYS 4 |
459 | #define WEP_KEY_LEN 13 | 450 | #define WEP_KEY_LEN 13 |
460 | 451 | ||
461 | struct ieee80211_security { | 452 | struct ieee80211_security { |
462 | u16 active_key:2, | 453 | u16 active_key:2, |
463 | enabled:1, | 454 | enabled:1, auth_mode:2, auth_algo:4, unicast_uses_group:1; |
464 | auth_mode:2, | ||
465 | auth_algo:4, | ||
466 | unicast_uses_group:1; | ||
467 | u8 key_sizes[WEP_KEYS]; | 455 | u8 key_sizes[WEP_KEYS]; |
468 | u8 keys[WEP_KEYS][WEP_KEY_LEN]; | 456 | u8 keys[WEP_KEYS][WEP_KEY_LEN]; |
469 | u8 level; | 457 | u8 level; |
470 | u16 flags; | 458 | u16 flags; |
471 | } __attribute__ ((packed)); | 459 | } __attribute__ ((packed)); |
472 | 460 | ||
473 | |||
474 | /* | 461 | /* |
475 | 462 | ||
476 | 802.11 data frame from AP | 463 | 802.11 data frame from AP |
@@ -494,7 +481,7 @@ enum ieee80211_mfie { | |||
494 | MFIE_TYPE_RATES = 1, | 481 | MFIE_TYPE_RATES = 1, |
495 | MFIE_TYPE_FH_SET = 2, | 482 | MFIE_TYPE_FH_SET = 2, |
496 | MFIE_TYPE_DS_SET = 3, | 483 | MFIE_TYPE_DS_SET = 3, |
497 | MFIE_TYPE_CF_SET = 4, | 484 | MFIE_TYPE_CF_SET = 4, |
498 | MFIE_TYPE_TIM = 5, | 485 | MFIE_TYPE_TIM = 5, |
499 | MFIE_TYPE_IBSS_SET = 6, | 486 | MFIE_TYPE_IBSS_SET = 6, |
500 | MFIE_TYPE_COUNTRY = 7, | 487 | MFIE_TYPE_COUNTRY = 7, |
@@ -518,11 +505,6 @@ enum ieee80211_mfie { | |||
518 | MFIE_TYPE_GENERIC = 221, | 505 | MFIE_TYPE_GENERIC = 221, |
519 | }; | 506 | }; |
520 | 507 | ||
521 | struct ieee80211_info_element_hdr { | ||
522 | u8 id; | ||
523 | u8 len; | ||
524 | } __attribute__ ((packed)); | ||
525 | |||
526 | struct ieee80211_info_element { | 508 | struct ieee80211_info_element { |
527 | u8 id; | 509 | u8 id; |
528 | u8 len; | 510 | u8 len; |
@@ -551,23 +533,22 @@ struct ieee80211_authentication { | |||
551 | __le16 algorithm; | 533 | __le16 algorithm; |
552 | __le16 transaction; | 534 | __le16 transaction; |
553 | __le16 status; | 535 | __le16 status; |
554 | struct ieee80211_info_element info_element; | 536 | struct ieee80211_info_element info_element[0]; |
555 | } __attribute__ ((packed)); | 537 | } __attribute__ ((packed)); |
556 | 538 | ||
557 | |||
558 | struct ieee80211_probe_response { | 539 | struct ieee80211_probe_response { |
559 | struct ieee80211_hdr_3addr header; | 540 | struct ieee80211_hdr_3addr header; |
560 | u32 time_stamp[2]; | 541 | u32 time_stamp[2]; |
561 | __le16 beacon_interval; | 542 | __le16 beacon_interval; |
562 | __le16 capability; | 543 | __le16 capability; |
563 | struct ieee80211_info_element info_element; | 544 | struct ieee80211_info_element info_element[0]; |
564 | } __attribute__ ((packed)); | 545 | } __attribute__ ((packed)); |
565 | 546 | ||
566 | struct ieee80211_assoc_request_frame { | 547 | struct ieee80211_assoc_request_frame { |
567 | __le16 capability; | 548 | __le16 capability; |
568 | __le16 listen_interval; | 549 | __le16 listen_interval; |
569 | u8 current_ap[ETH_ALEN]; | 550 | u8 current_ap[ETH_ALEN]; |
570 | struct ieee80211_info_element info_element; | 551 | struct ieee80211_info_element info_element[0]; |
571 | } __attribute__ ((packed)); | 552 | } __attribute__ ((packed)); |
572 | 553 | ||
573 | struct ieee80211_assoc_response_frame { | 554 | struct ieee80211_assoc_response_frame { |
@@ -575,10 +556,9 @@ struct ieee80211_assoc_response_frame { | |||
575 | __le16 capability; | 556 | __le16 capability; |
576 | __le16 status; | 557 | __le16 status; |
577 | __le16 aid; | 558 | __le16 aid; |
578 | struct ieee80211_info_element info_element; /* supported rates */ | 559 | struct ieee80211_info_element info_element[0]; /* supported rates */ |
579 | } __attribute__ ((packed)); | 560 | } __attribute__ ((packed)); |
580 | 561 | ||
581 | |||
582 | struct ieee80211_txb { | 562 | struct ieee80211_txb { |
583 | u8 nr_frags; | 563 | u8 nr_frags; |
584 | u8 encrypted; | 564 | u8 encrypted; |
@@ -588,7 +568,6 @@ struct ieee80211_txb { | |||
588 | struct sk_buff *fragments[0]; | 568 | struct sk_buff *fragments[0]; |
589 | }; | 569 | }; |
590 | 570 | ||
591 | |||
592 | /* SWEEP TABLE ENTRIES NUMBER */ | 571 | /* SWEEP TABLE ENTRIES NUMBER */ |
593 | #define MAX_SWEEP_TAB_ENTRIES 42 | 572 | #define MAX_SWEEP_TAB_ENTRIES 42 |
594 | #define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 | 573 | #define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 |
@@ -651,7 +630,6 @@ enum ieee80211_state { | |||
651 | #define DEFAULT_MAX_SCAN_AGE (15 * HZ) | 630 | #define DEFAULT_MAX_SCAN_AGE (15 * HZ) |
652 | #define DEFAULT_FTS 2346 | 631 | #define DEFAULT_FTS 2346 |
653 | 632 | ||
654 | |||
655 | #define CFG_IEEE80211_RESERVE_FCS (1<<0) | 633 | #define CFG_IEEE80211_RESERVE_FCS (1<<0) |
656 | #define CFG_IEEE80211_COMPUTE_FCS (1<<1) | 634 | #define CFG_IEEE80211_COMPUTE_FCS (1<<1) |
657 | 635 | ||
@@ -669,24 +647,25 @@ struct ieee80211_device { | |||
669 | int scans; | 647 | int scans; |
670 | int scan_age; | 648 | int scan_age; |
671 | 649 | ||
672 | int iw_mode; /* operating mode (IW_MODE_*) */ | 650 | int iw_mode; /* operating mode (IW_MODE_*) */ |
651 | struct iw_spy_data spy_data; /* iwspy support */ | ||
673 | 652 | ||
674 | spinlock_t lock; | 653 | spinlock_t lock; |
675 | 654 | ||
676 | int tx_headroom; /* Set to size of any additional room needed at front | 655 | int tx_headroom; /* Set to size of any additional room needed at front |
677 | * of allocated Tx SKBs */ | 656 | * of allocated Tx SKBs */ |
678 | u32 config; | 657 | u32 config; |
679 | 658 | ||
680 | /* WEP and other encryption related settings at the device level */ | 659 | /* WEP and other encryption related settings at the device level */ |
681 | int open_wep; /* Set to 1 to allow unencrypted frames */ | 660 | int open_wep; /* Set to 1 to allow unencrypted frames */ |
682 | 661 | ||
683 | int reset_on_keychange; /* Set to 1 if the HW needs to be reset on | 662 | int reset_on_keychange; /* Set to 1 if the HW needs to be reset on |
684 | * WEP key changes */ | 663 | * WEP key changes */ |
685 | 664 | ||
686 | /* If the host performs {en,de}cryption, then set to 1 */ | 665 | /* If the host performs {en,de}cryption, then set to 1 */ |
687 | int host_encrypt; | 666 | int host_encrypt; |
688 | int host_decrypt; | 667 | int host_decrypt; |
689 | int ieee802_1x; /* is IEEE 802.1X used */ | 668 | int ieee802_1x; /* is IEEE 802.1X used */ |
690 | 669 | ||
691 | /* WPA data */ | 670 | /* WPA data */ |
692 | int wpa_enabled; | 671 | int wpa_enabled; |
@@ -698,33 +677,36 @@ struct ieee80211_device { | |||
698 | 677 | ||
699 | struct list_head crypt_deinit_list; | 678 | struct list_head crypt_deinit_list; |
700 | struct ieee80211_crypt_data *crypt[WEP_KEYS]; | 679 | struct ieee80211_crypt_data *crypt[WEP_KEYS]; |
701 | int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ | 680 | int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ |
702 | struct timer_list crypt_deinit_timer; | 681 | struct timer_list crypt_deinit_timer; |
703 | 682 | ||
704 | int bcrx_sta_key; /* use individual keys to override default keys even | 683 | int bcrx_sta_key; /* use individual keys to override default keys even |
705 | * with RX of broad/multicast frames */ | 684 | * with RX of broad/multicast frames */ |
706 | 685 | ||
707 | /* Fragmentation structures */ | 686 | /* Fragmentation structures */ |
708 | struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_LEN]; | 687 | struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_LEN]; |
709 | unsigned int frag_next_idx; | 688 | unsigned int frag_next_idx; |
710 | u16 fts; /* Fragmentation Threshold */ | 689 | u16 fts; /* Fragmentation Threshold */ |
711 | 690 | ||
712 | /* Association info */ | 691 | /* Association info */ |
713 | u8 bssid[ETH_ALEN]; | 692 | u8 bssid[ETH_ALEN]; |
714 | 693 | ||
715 | enum ieee80211_state state; | 694 | enum ieee80211_state state; |
716 | 695 | ||
717 | int mode; /* A, B, G */ | 696 | int mode; /* A, B, G */ |
718 | int modulation; /* CCK, OFDM */ | 697 | int modulation; /* CCK, OFDM */ |
719 | int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ | 698 | int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ |
720 | int abg_ture; /* ABG flag */ | 699 | int abg_true; /* ABG flag */ |
700 | |||
701 | int perfect_rssi; | ||
702 | int worst_rssi; | ||
721 | 703 | ||
722 | /* Callback functions */ | 704 | /* Callback functions */ |
723 | void (*set_security)(struct net_device *dev, | 705 | void (*set_security) (struct net_device * dev, |
724 | struct ieee80211_security *sec); | 706 | struct ieee80211_security * sec); |
725 | int (*hard_start_xmit)(struct ieee80211_txb *txb, | 707 | int (*hard_start_xmit) (struct ieee80211_txb * txb, |
726 | struct net_device *dev); | 708 | struct net_device * dev); |
727 | int (*reset_port)(struct net_device *dev); | 709 | int (*reset_port) (struct net_device * dev); |
728 | 710 | ||
729 | /* This must be the last item so that it points to the data | 711 | /* This must be the last item so that it points to the data |
730 | * allocated beyond this structure by alloc_ieee80211 */ | 712 | * allocated beyond this structure by alloc_ieee80211 */ |
@@ -757,7 +739,8 @@ extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) | |||
757 | return 1; | 739 | return 1; |
758 | } | 740 | } |
759 | 741 | ||
760 | extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) | 742 | extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, |
743 | int mode) | ||
761 | { | 744 | { |
762 | /* | 745 | /* |
763 | * It is possible for both access points and our device to support | 746 | * It is possible for both access points and our device to support |
@@ -808,8 +791,6 @@ extern inline int ieee80211_get_hdrlen(u16 fc) | |||
808 | return hdrlen; | 791 | return hdrlen; |
809 | } | 792 | } |
810 | 793 | ||
811 | |||
812 | |||
813 | /* ieee80211.c */ | 794 | /* ieee80211.c */ |
814 | extern void free_ieee80211(struct net_device *dev); | 795 | extern void free_ieee80211(struct net_device *dev); |
815 | extern struct net_device *alloc_ieee80211(int sizeof_priv); | 796 | extern struct net_device *alloc_ieee80211(int sizeof_priv); |
@@ -817,11 +798,9 @@ extern struct net_device *alloc_ieee80211(int sizeof_priv); | |||
817 | extern int ieee80211_set_encryption(struct ieee80211_device *ieee); | 798 | extern int ieee80211_set_encryption(struct ieee80211_device *ieee); |
818 | 799 | ||
819 | /* ieee80211_tx.c */ | 800 | /* ieee80211_tx.c */ |
820 | extern int ieee80211_xmit(struct sk_buff *skb, | 801 | extern int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev); |
821 | struct net_device *dev); | ||
822 | extern void ieee80211_txb_free(struct ieee80211_txb *); | 802 | extern void ieee80211_txb_free(struct ieee80211_txb *); |
823 | 803 | ||
824 | |||
825 | /* ieee80211_rx.c */ | 804 | /* ieee80211_rx.c */ |
826 | extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, | 805 | extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, |
827 | struct ieee80211_rx_stats *rx_stats); | 806 | struct ieee80211_rx_stats *rx_stats); |
@@ -840,7 +819,6 @@ extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, | |||
840 | struct iw_request_info *info, | 819 | struct iw_request_info *info, |
841 | union iwreq_data *wrqu, char *key); | 820 | union iwreq_data *wrqu, char *key); |
842 | 821 | ||
843 | |||
844 | extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) | 822 | extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) |
845 | { | 823 | { |
846 | ieee->scans++; | 824 | ieee->scans++; |
@@ -851,5 +829,4 @@ extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) | |||
851 | return ieee->scans; | 829 | return ieee->scans; |
852 | } | 830 | } |
853 | 831 | ||
854 | 832 | #endif /* IEEE80211_H */ | |
855 | #endif /* IEEE80211_H */ | ||
diff --git a/include/net/ieee80211_crypt.h b/include/net/ieee80211_crypt.h index b58a3bcc0dc0..93bf91fda82e 100644 --- a/include/net/ieee80211_crypt.h +++ b/include/net/ieee80211_crypt.h | |||
@@ -31,10 +31,10 @@ struct ieee80211_crypto_ops { | |||
31 | /* init new crypto context (e.g., allocate private data space, | 31 | /* init new crypto context (e.g., allocate private data space, |
32 | * select IV, etc.); returns NULL on failure or pointer to allocated | 32 | * select IV, etc.); returns NULL on failure or pointer to allocated |
33 | * private data on success */ | 33 | * private data on success */ |
34 | void * (*init)(int keyidx); | 34 | void *(*init) (int keyidx); |
35 | 35 | ||
36 | /* deinitialize crypto context and free allocated private data */ | 36 | /* deinitialize crypto context and free allocated private data */ |
37 | void (*deinit)(void *priv); | 37 | void (*deinit) (void *priv); |
38 | 38 | ||
39 | /* encrypt/decrypt return < 0 on error or >= 0 on success. The return | 39 | /* encrypt/decrypt return < 0 on error or >= 0 on success. The return |
40 | * value from decrypt_mpdu is passed as the keyidx value for | 40 | * value from decrypt_mpdu is passed as the keyidx value for |
@@ -42,21 +42,21 @@ struct ieee80211_crypto_ops { | |||
42 | * encryption; if not, error will be returned; these functions are | 42 | * encryption; if not, error will be returned; these functions are |
43 | * called for all MPDUs (i.e., fragments). | 43 | * called for all MPDUs (i.e., fragments). |
44 | */ | 44 | */ |
45 | int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); | 45 | int (*encrypt_mpdu) (struct sk_buff * skb, int hdr_len, void *priv); |
46 | int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); | 46 | int (*decrypt_mpdu) (struct sk_buff * skb, int hdr_len, void *priv); |
47 | 47 | ||
48 | /* These functions are called for full MSDUs, i.e. full frames. | 48 | /* These functions are called for full MSDUs, i.e. full frames. |
49 | * These can be NULL if full MSDU operations are not needed. */ | 49 | * These can be NULL if full MSDU operations are not needed. */ |
50 | int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv); | 50 | int (*encrypt_msdu) (struct sk_buff * skb, int hdr_len, void *priv); |
51 | int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len, | 51 | int (*decrypt_msdu) (struct sk_buff * skb, int keyidx, int hdr_len, |
52 | void *priv); | 52 | void *priv); |
53 | 53 | ||
54 | int (*set_key)(void *key, int len, u8 *seq, void *priv); | 54 | int (*set_key) (void *key, int len, u8 * seq, void *priv); |
55 | int (*get_key)(void *key, int len, u8 *seq, void *priv); | 55 | int (*get_key) (void *key, int len, u8 * seq, void *priv); |
56 | 56 | ||
57 | /* procfs handler for printing out key information and possible | 57 | /* procfs handler for printing out key information and possible |
58 | * statistics */ | 58 | * statistics */ |
59 | char * (*print_stats)(char *p, void *priv); | 59 | char *(*print_stats) (char *p, void *priv); |
60 | 60 | ||
61 | /* maximum number of bytes added by encryption; encrypt buf is | 61 | /* maximum number of bytes added by encryption; encrypt buf is |
62 | * allocated with extra_prefix_len bytes, copy of in_buf, and | 62 | * allocated with extra_prefix_len bytes, copy of in_buf, and |
@@ -69,7 +69,7 @@ struct ieee80211_crypto_ops { | |||
69 | }; | 69 | }; |
70 | 70 | ||
71 | struct ieee80211_crypt_data { | 71 | struct ieee80211_crypt_data { |
72 | struct list_head list; /* delayed deletion list */ | 72 | struct list_head list; /* delayed deletion list */ |
73 | struct ieee80211_crypto_ops *ops; | 73 | struct ieee80211_crypto_ops *ops; |
74 | void *priv; | 74 | void *priv; |
75 | atomic_t refcnt; | 75 | atomic_t refcnt; |
@@ -77,7 +77,7 @@ struct ieee80211_crypt_data { | |||
77 | 77 | ||
78 | int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); | 78 | int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); |
79 | int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); | 79 | int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); |
80 | struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); | 80 | struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name); |
81 | void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); | 81 | void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); |
82 | void ieee80211_crypt_deinit_handler(unsigned long); | 82 | void ieee80211_crypt_deinit_handler(unsigned long); |
83 | void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, | 83 | void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, |
diff --git a/include/net/syncppp.h b/include/net/syncppp.h index 614cb6ba564e..877efa434700 100644 --- a/include/net/syncppp.h +++ b/include/net/syncppp.h | |||
@@ -86,7 +86,6 @@ static inline struct sppp *sppp_of(struct net_device *dev) | |||
86 | 86 | ||
87 | void sppp_attach (struct ppp_device *pd); | 87 | void sppp_attach (struct ppp_device *pd); |
88 | void sppp_detach (struct net_device *dev); | 88 | void sppp_detach (struct net_device *dev); |
89 | void sppp_input (struct net_device *dev, struct sk_buff *m); | ||
90 | int sppp_do_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd); | 89 | int sppp_do_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd); |
91 | struct sk_buff *sppp_dequeue (struct net_device *dev); | 90 | struct sk_buff *sppp_dequeue (struct net_device *dev); |
92 | int sppp_isempty (struct net_device *dev); | 91 | int sppp_isempty (struct net_device *dev); |
diff --git a/net/ieee80211/ieee80211_crypt.c b/net/ieee80211/ieee80211_crypt.c index 61a9d92e455b..dc835f68edd3 100644 --- a/net/ieee80211/ieee80211_crypt.c +++ b/net/ieee80211/ieee80211_crypt.c | |||
@@ -191,18 +191,18 @@ static void ieee80211_crypt_null_deinit(void *priv) | |||
191 | } | 191 | } |
192 | 192 | ||
193 | static struct ieee80211_crypto_ops ieee80211_crypt_null = { | 193 | static struct ieee80211_crypto_ops ieee80211_crypt_null = { |
194 | .name = "NULL", | 194 | .name = "NULL", |
195 | .init = ieee80211_crypt_null_init, | 195 | .init = ieee80211_crypt_null_init, |
196 | .deinit = ieee80211_crypt_null_deinit, | 196 | .deinit = ieee80211_crypt_null_deinit, |
197 | .encrypt_mpdu = NULL, | 197 | .encrypt_mpdu = NULL, |
198 | .decrypt_mpdu = NULL, | 198 | .decrypt_mpdu = NULL, |
199 | .encrypt_msdu = NULL, | 199 | .encrypt_msdu = NULL, |
200 | .decrypt_msdu = NULL, | 200 | .decrypt_msdu = NULL, |
201 | .set_key = NULL, | 201 | .set_key = NULL, |
202 | .get_key = NULL, | 202 | .get_key = NULL, |
203 | .extra_prefix_len = 0, | 203 | .extra_prefix_len = 0, |
204 | .extra_postfix_len = 0, | 204 | .extra_postfix_len = 0, |
205 | .owner = THIS_MODULE, | 205 | .owner = THIS_MODULE, |
206 | }; | 206 | }; |
207 | 207 | ||
208 | static int __init ieee80211_crypto_init(void) | 208 | static int __init ieee80211_crypto_init(void) |
diff --git a/net/ieee80211/ieee80211_crypt_ccmp.c b/net/ieee80211/ieee80211_crypt_ccmp.c index 8fc13f45971e..7b6290885e7d 100644 --- a/net/ieee80211/ieee80211_crypt_ccmp.c +++ b/net/ieee80211/ieee80211_crypt_ccmp.c | |||
@@ -426,19 +426,19 @@ static char *ieee80211_ccmp_print_stats(char *p, void *priv) | |||
426 | } | 426 | } |
427 | 427 | ||
428 | static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { | 428 | static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { |
429 | .name = "CCMP", | 429 | .name = "CCMP", |
430 | .init = ieee80211_ccmp_init, | 430 | .init = ieee80211_ccmp_init, |
431 | .deinit = ieee80211_ccmp_deinit, | 431 | .deinit = ieee80211_ccmp_deinit, |
432 | .encrypt_mpdu = ieee80211_ccmp_encrypt, | 432 | .encrypt_mpdu = ieee80211_ccmp_encrypt, |
433 | .decrypt_mpdu = ieee80211_ccmp_decrypt, | 433 | .decrypt_mpdu = ieee80211_ccmp_decrypt, |
434 | .encrypt_msdu = NULL, | 434 | .encrypt_msdu = NULL, |
435 | .decrypt_msdu = NULL, | 435 | .decrypt_msdu = NULL, |
436 | .set_key = ieee80211_ccmp_set_key, | 436 | .set_key = ieee80211_ccmp_set_key, |
437 | .get_key = ieee80211_ccmp_get_key, | 437 | .get_key = ieee80211_ccmp_get_key, |
438 | .print_stats = ieee80211_ccmp_print_stats, | 438 | .print_stats = ieee80211_ccmp_print_stats, |
439 | .extra_prefix_len = CCMP_HDR_LEN, | 439 | .extra_prefix_len = CCMP_HDR_LEN, |
440 | .extra_postfix_len = CCMP_MIC_LEN, | 440 | .extra_postfix_len = CCMP_MIC_LEN, |
441 | .owner = THIS_MODULE, | 441 | .owner = THIS_MODULE, |
442 | }; | 442 | }; |
443 | 443 | ||
444 | static int __init ieee80211_crypto_ccmp_init(void) | 444 | static int __init ieee80211_crypto_ccmp_init(void) |
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index d4f9164be1a1..dca380e57454 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c | |||
@@ -654,19 +654,19 @@ static char *ieee80211_tkip_print_stats(char *p, void *priv) | |||
654 | } | 654 | } |
655 | 655 | ||
656 | static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { | 656 | static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { |
657 | .name = "TKIP", | 657 | .name = "TKIP", |
658 | .init = ieee80211_tkip_init, | 658 | .init = ieee80211_tkip_init, |
659 | .deinit = ieee80211_tkip_deinit, | 659 | .deinit = ieee80211_tkip_deinit, |
660 | .encrypt_mpdu = ieee80211_tkip_encrypt, | 660 | .encrypt_mpdu = ieee80211_tkip_encrypt, |
661 | .decrypt_mpdu = ieee80211_tkip_decrypt, | 661 | .decrypt_mpdu = ieee80211_tkip_decrypt, |
662 | .encrypt_msdu = ieee80211_michael_mic_add, | 662 | .encrypt_msdu = ieee80211_michael_mic_add, |
663 | .decrypt_msdu = ieee80211_michael_mic_verify, | 663 | .decrypt_msdu = ieee80211_michael_mic_verify, |
664 | .set_key = ieee80211_tkip_set_key, | 664 | .set_key = ieee80211_tkip_set_key, |
665 | .get_key = ieee80211_tkip_get_key, | 665 | .get_key = ieee80211_tkip_get_key, |
666 | .print_stats = ieee80211_tkip_print_stats, | 666 | .print_stats = ieee80211_tkip_print_stats, |
667 | .extra_prefix_len = 4 + 4, /* IV + ExtIV */ | 667 | .extra_prefix_len = 4 + 4, /* IV + ExtIV */ |
668 | .extra_postfix_len = 8 + 4, /* MIC + ICV */ | 668 | .extra_postfix_len = 8 + 4, /* MIC + ICV */ |
669 | .owner = THIS_MODULE, | 669 | .owner = THIS_MODULE, |
670 | }; | 670 | }; |
671 | 671 | ||
672 | static int __init ieee80211_crypto_tkip_init(void) | 672 | static int __init ieee80211_crypto_tkip_init(void) |
diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index b4d2514a0902..ebe16155e792 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c | |||
@@ -229,19 +229,19 @@ static char *prism2_wep_print_stats(char *p, void *priv) | |||
229 | } | 229 | } |
230 | 230 | ||
231 | static struct ieee80211_crypto_ops ieee80211_crypt_wep = { | 231 | static struct ieee80211_crypto_ops ieee80211_crypt_wep = { |
232 | .name = "WEP", | 232 | .name = "WEP", |
233 | .init = prism2_wep_init, | 233 | .init = prism2_wep_init, |
234 | .deinit = prism2_wep_deinit, | 234 | .deinit = prism2_wep_deinit, |
235 | .encrypt_mpdu = prism2_wep_encrypt, | 235 | .encrypt_mpdu = prism2_wep_encrypt, |
236 | .decrypt_mpdu = prism2_wep_decrypt, | 236 | .decrypt_mpdu = prism2_wep_decrypt, |
237 | .encrypt_msdu = NULL, | 237 | .encrypt_msdu = NULL, |
238 | .decrypt_msdu = NULL, | 238 | .decrypt_msdu = NULL, |
239 | .set_key = prism2_wep_set_key, | 239 | .set_key = prism2_wep_set_key, |
240 | .get_key = prism2_wep_get_key, | 240 | .get_key = prism2_wep_get_key, |
241 | .print_stats = prism2_wep_print_stats, | 241 | .print_stats = prism2_wep_print_stats, |
242 | .extra_prefix_len = 4, /* IV */ | 242 | .extra_prefix_len = 4, /* IV */ |
243 | .extra_postfix_len = 4, /* ICV */ | 243 | .extra_postfix_len = 4, /* ICV */ |
244 | .owner = THIS_MODULE, | 244 | .owner = THIS_MODULE, |
245 | }; | 245 | }; |
246 | 246 | ||
247 | static int __init ieee80211_crypto_wep_init(void) | 247 | static int __init ieee80211_crypto_wep_init(void) |
diff --git a/net/ieee80211/ieee80211_module.c b/net/ieee80211/ieee80211_module.c index 03a47343ddc7..4b43ae1235f9 100644 --- a/net/ieee80211/ieee80211_module.c +++ b/net/ieee80211/ieee80211_module.c | |||
@@ -195,34 +195,20 @@ static int show_debug_level(char *page, char **start, off_t offset, | |||
195 | static int store_debug_level(struct file *file, const char __user * buffer, | 195 | static int store_debug_level(struct file *file, const char __user * buffer, |
196 | unsigned long count, void *data) | 196 | unsigned long count, void *data) |
197 | { | 197 | { |
198 | char buf[] = "0x00000000"; | 198 | char buf[] = "0x00000000\n"; |
199 | char *p = (char *)buf; | 199 | unsigned long len = min((unsigned long)sizeof(buf) - 1, count); |
200 | unsigned long val; | 200 | unsigned long val; |
201 | 201 | ||
202 | if (count > sizeof(buf) - 1) | 202 | if (copy_from_user(buf, buffer, len)) |
203 | count = sizeof(buf) - 1; | ||
204 | |||
205 | if (copy_from_user(buf, buffer, count)) | ||
206 | return count; | 203 | return count; |
207 | buf[count] = 0; | 204 | buf[len] = 0; |
208 | /* | 205 | if (sscanf(buf, "%li", &val) != 1) |
209 | * what a FPOS... What, sscanf(buf, "%i", &val) would be too | ||
210 | * scary? | ||
211 | */ | ||
212 | if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') { | ||
213 | p++; | ||
214 | if (p[0] == 'x' || p[0] == 'X') | ||
215 | p++; | ||
216 | val = simple_strtoul(p, &p, 16); | ||
217 | } else | ||
218 | val = simple_strtoul(p, &p, 10); | ||
219 | if (p == buf) | ||
220 | printk(KERN_INFO DRV_NAME | 206 | printk(KERN_INFO DRV_NAME |
221 | ": %s is not in hex or decimal form.\n", buf); | 207 | ": %s is not in hex or decimal form.\n", buf); |
222 | else | 208 | else |
223 | ieee80211_debug_level = val; | 209 | ieee80211_debug_level = val; |
224 | 210 | ||
225 | return strlen(buf); | 211 | return strnlen(buf, len); |
226 | } | 212 | } |
227 | 213 | ||
228 | static int __init ieee80211_init(void) | 214 | static int __init ieee80211_init(void) |
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index f7dcd854139e..e0337c8fcde8 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c | |||
@@ -378,33 +378,47 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, | |||
378 | frag = WLAN_GET_SEQ_FRAG(sc); | 378 | frag = WLAN_GET_SEQ_FRAG(sc); |
379 | hdrlen = ieee80211_get_hdrlen(fc); | 379 | hdrlen = ieee80211_get_hdrlen(fc); |
380 | 380 | ||
381 | #ifdef NOT_YET | ||
382 | #if WIRELESS_EXT > 15 | ||
383 | /* Put this code here so that we avoid duplicating it in all | 381 | /* Put this code here so that we avoid duplicating it in all |
384 | * Rx paths. - Jean II */ | 382 | * Rx paths. - Jean II */ |
385 | #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ | 383 | #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ |
386 | /* If spy monitoring on */ | 384 | /* If spy monitoring on */ |
387 | if (iface->spy_data.spy_number > 0) { | 385 | if (ieee->spy_data.spy_number > 0) { |
388 | struct iw_quality wstats; | 386 | struct iw_quality wstats; |
389 | wstats.level = rx_stats->signal; | 387 | |
390 | wstats.noise = rx_stats->noise; | 388 | wstats.updated = 0; |
391 | wstats.updated = 6; /* No qual value */ | 389 | if (rx_stats->mask & IEEE80211_STATMASK_RSSI) { |
390 | wstats.level = rx_stats->rssi; | ||
391 | wstats.updated |= IW_QUAL_LEVEL_UPDATED; | ||
392 | } else | ||
393 | wstats.updated |= IW_QUAL_LEVEL_INVALID; | ||
394 | |||
395 | if (rx_stats->mask & IEEE80211_STATMASK_NOISE) { | ||
396 | wstats.noise = rx_stats->noise; | ||
397 | wstats.updated |= IW_QUAL_NOISE_UPDATED; | ||
398 | } else | ||
399 | wstats.updated |= IW_QUAL_NOISE_INVALID; | ||
400 | |||
401 | if (rx_stats->mask & IEEE80211_STATMASK_SIGNAL) { | ||
402 | wstats.qual = rx_stats->signal; | ||
403 | wstats.updated |= IW_QUAL_QUAL_UPDATED; | ||
404 | } else | ||
405 | wstats.updated |= IW_QUAL_QUAL_INVALID; | ||
406 | |||
392 | /* Update spy records */ | 407 | /* Update spy records */ |
393 | wireless_spy_update(dev, hdr->addr2, &wstats); | 408 | wireless_spy_update(ieee->dev, hdr->addr2, &wstats); |
394 | } | 409 | } |
395 | #endif /* IW_WIRELESS_SPY */ | 410 | #endif /* IW_WIRELESS_SPY */ |
396 | #endif /* WIRELESS_EXT > 15 */ | 411 | |
412 | #ifdef NOT_YET | ||
397 | hostap_update_rx_stats(local->ap, hdr, rx_stats); | 413 | hostap_update_rx_stats(local->ap, hdr, rx_stats); |
398 | #endif | 414 | #endif |
399 | 415 | ||
400 | #if WIRELESS_EXT > 15 | ||
401 | if (ieee->iw_mode == IW_MODE_MONITOR) { | 416 | if (ieee->iw_mode == IW_MODE_MONITOR) { |
402 | ieee80211_monitor_rx(ieee, skb, rx_stats); | 417 | ieee80211_monitor_rx(ieee, skb, rx_stats); |
403 | stats->rx_packets++; | 418 | stats->rx_packets++; |
404 | stats->rx_bytes += skb->len; | 419 | stats->rx_bytes += skb->len; |
405 | return 1; | 420 | return 1; |
406 | } | 421 | } |
407 | #endif | ||
408 | 422 | ||
409 | if (ieee->host_decrypt) { | 423 | if (ieee->host_decrypt) { |
410 | int idx = 0; | 424 | int idx = 0; |
@@ -771,8 +785,7 @@ static inline int ieee80211_is_ofdm_rate(u8 rate) | |||
771 | return 0; | 785 | return 0; |
772 | } | 786 | } |
773 | 787 | ||
774 | static inline int ieee80211_network_init(struct ieee80211_device *ieee, | 788 | static inline int ieee80211_network_init(struct ieee80211_device *ieee, struct ieee80211_probe_response |
775 | struct ieee80211_probe_response | ||
776 | *beacon, | 789 | *beacon, |
777 | struct ieee80211_network *network, | 790 | struct ieee80211_network *network, |
778 | struct ieee80211_rx_stats *stats) | 791 | struct ieee80211_rx_stats *stats) |
@@ -787,11 +800,11 @@ static inline int ieee80211_network_init(struct ieee80211_device *ieee, | |||
787 | 800 | ||
788 | /* Pull out fixed field data */ | 801 | /* Pull out fixed field data */ |
789 | memcpy(network->bssid, beacon->header.addr3, ETH_ALEN); | 802 | memcpy(network->bssid, beacon->header.addr3, ETH_ALEN); |
790 | network->capability = beacon->capability; | 803 | network->capability = le16_to_cpu(beacon->capability); |
791 | network->last_scanned = jiffies; | 804 | network->last_scanned = jiffies; |
792 | network->time_stamp[0] = beacon->time_stamp[0]; | 805 | network->time_stamp[0] = le32_to_cpu(beacon->time_stamp[0]); |
793 | network->time_stamp[1] = beacon->time_stamp[1]; | 806 | network->time_stamp[1] = le32_to_cpu(beacon->time_stamp[1]); |
794 | network->beacon_interval = beacon->beacon_interval; | 807 | network->beacon_interval = le16_to_cpu(beacon->beacon_interval); |
795 | /* Where to pull this? beacon->listen_interval; */ | 808 | /* Where to pull this? beacon->listen_interval; */ |
796 | network->listen_interval = 0x0A; | 809 | network->listen_interval = 0x0A; |
797 | network->rates_len = network->rates_ex_len = 0; | 810 | network->rates_len = network->rates_ex_len = 0; |
@@ -809,11 +822,11 @@ static inline int ieee80211_network_init(struct ieee80211_device *ieee, | |||
809 | network->wpa_ie_len = 0; | 822 | network->wpa_ie_len = 0; |
810 | network->rsn_ie_len = 0; | 823 | network->rsn_ie_len = 0; |
811 | 824 | ||
812 | info_element = &beacon->info_element; | 825 | info_element = beacon->info_element; |
813 | left = stats->len - ((void *)info_element - (void *)beacon); | 826 | left = stats->len - sizeof(*beacon); |
814 | while (left >= sizeof(struct ieee80211_info_element_hdr)) { | 827 | while (left >= sizeof(struct ieee80211_info_element)) { |
815 | if (sizeof(struct ieee80211_info_element_hdr) + | 828 | if (sizeof(struct ieee80211_info_element) + info_element->len > |
816 | info_element->len > left) { | 829 | left) { |
817 | IEEE80211_DEBUG_SCAN | 830 | IEEE80211_DEBUG_SCAN |
818 | ("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n", | 831 | ("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n", |
819 | info_element->len + | 832 | info_element->len + |
@@ -954,7 +967,7 @@ static inline int ieee80211_network_init(struct ieee80211_device *ieee, | |||
954 | break; | 967 | break; |
955 | } | 968 | } |
956 | 969 | ||
957 | left -= sizeof(struct ieee80211_info_element_hdr) + | 970 | left -= sizeof(struct ieee80211_info_element) + |
958 | info_element->len; | 971 | info_element->len; |
959 | info_element = (struct ieee80211_info_element *) | 972 | info_element = (struct ieee80211_info_element *) |
960 | &info_element->data[info_element->len]; | 973 | &info_element->data[info_element->len]; |
@@ -1028,18 +1041,16 @@ static inline void update_network(struct ieee80211_network *dst, | |||
1028 | } | 1041 | } |
1029 | 1042 | ||
1030 | static inline void ieee80211_process_probe_response(struct ieee80211_device | 1043 | static inline void ieee80211_process_probe_response(struct ieee80211_device |
1031 | *ieee, | 1044 | *ieee, struct |
1032 | struct | ||
1033 | ieee80211_probe_response | 1045 | ieee80211_probe_response |
1034 | *beacon, | 1046 | *beacon, struct ieee80211_rx_stats |
1035 | struct ieee80211_rx_stats | ||
1036 | *stats) | 1047 | *stats) |
1037 | { | 1048 | { |
1038 | struct ieee80211_network network; | 1049 | struct ieee80211_network network; |
1039 | struct ieee80211_network *target; | 1050 | struct ieee80211_network *target; |
1040 | struct ieee80211_network *oldest = NULL; | 1051 | struct ieee80211_network *oldest = NULL; |
1041 | #ifdef CONFIG_IEEE80211_DEBUG | 1052 | #ifdef CONFIG_IEEE80211_DEBUG |
1042 | struct ieee80211_info_element *info_element = &beacon->info_element; | 1053 | struct ieee80211_info_element *info_element = beacon->info_element; |
1043 | #endif | 1054 | #endif |
1044 | unsigned long flags; | 1055 | unsigned long flags; |
1045 | 1056 | ||
@@ -1070,8 +1081,9 @@ static inline void ieee80211_process_probe_response(struct ieee80211_device | |||
1070 | escape_essid(info_element->data, | 1081 | escape_essid(info_element->data, |
1071 | info_element->len), | 1082 | info_element->len), |
1072 | MAC_ARG(beacon->header.addr3), | 1083 | MAC_ARG(beacon->header.addr3), |
1073 | WLAN_FC_GET_STYPE(beacon->header. | 1084 | WLAN_FC_GET_STYPE(le16_to_cpu |
1074 | frame_ctl) == | 1085 | (beacon->header. |
1086 | frame_ctl)) == | ||
1075 | IEEE80211_STYPE_PROBE_RESP ? | 1087 | IEEE80211_STYPE_PROBE_RESP ? |
1076 | "PROBE RESPONSE" : "BEACON"); | 1088 | "PROBE RESPONSE" : "BEACON"); |
1077 | return; | 1089 | return; |
@@ -1122,8 +1134,9 @@ static inline void ieee80211_process_probe_response(struct ieee80211_device | |||
1122 | escape_essid(network.ssid, | 1134 | escape_essid(network.ssid, |
1123 | network.ssid_len), | 1135 | network.ssid_len), |
1124 | MAC_ARG(network.bssid), | 1136 | MAC_ARG(network.bssid), |
1125 | WLAN_FC_GET_STYPE(beacon->header. | 1137 | WLAN_FC_GET_STYPE(le16_to_cpu |
1126 | frame_ctl) == | 1138 | (beacon->header. |
1139 | frame_ctl)) == | ||
1127 | IEEE80211_STYPE_PROBE_RESP ? | 1140 | IEEE80211_STYPE_PROBE_RESP ? |
1128 | "PROBE RESPONSE" : "BEACON"); | 1141 | "PROBE RESPONSE" : "BEACON"); |
1129 | #endif | 1142 | #endif |
@@ -1134,8 +1147,9 @@ static inline void ieee80211_process_probe_response(struct ieee80211_device | |||
1134 | escape_essid(target->ssid, | 1147 | escape_essid(target->ssid, |
1135 | target->ssid_len), | 1148 | target->ssid_len), |
1136 | MAC_ARG(target->bssid), | 1149 | MAC_ARG(target->bssid), |
1137 | WLAN_FC_GET_STYPE(beacon->header. | 1150 | WLAN_FC_GET_STYPE(le16_to_cpu |
1138 | frame_ctl) == | 1151 | (beacon->header. |
1152 | frame_ctl)) == | ||
1139 | IEEE80211_STYPE_PROBE_RESP ? | 1153 | IEEE80211_STYPE_PROBE_RESP ? |
1140 | "PROBE RESPONSE" : "BEACON"); | 1154 | "PROBE RESPONSE" : "BEACON"); |
1141 | update_network(target, &network); | 1155 | update_network(target, &network); |
@@ -1148,20 +1162,23 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, | |||
1148 | struct ieee80211_hdr *header, | 1162 | struct ieee80211_hdr *header, |
1149 | struct ieee80211_rx_stats *stats) | 1163 | struct ieee80211_rx_stats *stats) |
1150 | { | 1164 | { |
1151 | switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { | 1165 | switch (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl))) { |
1152 | case IEEE80211_STYPE_ASSOC_RESP: | 1166 | case IEEE80211_STYPE_ASSOC_RESP: |
1153 | IEEE80211_DEBUG_MGMT("received ASSOCIATION RESPONSE (%d)\n", | 1167 | IEEE80211_DEBUG_MGMT("received ASSOCIATION RESPONSE (%d)\n", |
1154 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1168 | WLAN_FC_GET_STYPE(le16_to_cpu |
1169 | (header->frame_ctl))); | ||
1155 | break; | 1170 | break; |
1156 | 1171 | ||
1157 | case IEEE80211_STYPE_REASSOC_RESP: | 1172 | case IEEE80211_STYPE_REASSOC_RESP: |
1158 | IEEE80211_DEBUG_MGMT("received REASSOCIATION RESPONSE (%d)\n", | 1173 | IEEE80211_DEBUG_MGMT("received REASSOCIATION RESPONSE (%d)\n", |
1159 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1174 | WLAN_FC_GET_STYPE(le16_to_cpu |
1175 | (header->frame_ctl))); | ||
1160 | break; | 1176 | break; |
1161 | 1177 | ||
1162 | case IEEE80211_STYPE_PROBE_RESP: | 1178 | case IEEE80211_STYPE_PROBE_RESP: |
1163 | IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", | 1179 | IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", |
1164 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1180 | WLAN_FC_GET_STYPE(le16_to_cpu |
1181 | (header->frame_ctl))); | ||
1165 | IEEE80211_DEBUG_SCAN("Probe response\n"); | 1182 | IEEE80211_DEBUG_SCAN("Probe response\n"); |
1166 | ieee80211_process_probe_response(ieee, | 1183 | ieee80211_process_probe_response(ieee, |
1167 | (struct | 1184 | (struct |
@@ -1171,7 +1188,8 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, | |||
1171 | 1188 | ||
1172 | case IEEE80211_STYPE_BEACON: | 1189 | case IEEE80211_STYPE_BEACON: |
1173 | IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", | 1190 | IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", |
1174 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1191 | WLAN_FC_GET_STYPE(le16_to_cpu |
1192 | (header->frame_ctl))); | ||
1175 | IEEE80211_DEBUG_SCAN("Beacon\n"); | 1193 | IEEE80211_DEBUG_SCAN("Beacon\n"); |
1176 | ieee80211_process_probe_response(ieee, | 1194 | ieee80211_process_probe_response(ieee, |
1177 | (struct | 1195 | (struct |
@@ -1181,10 +1199,12 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, | |||
1181 | 1199 | ||
1182 | default: | 1200 | default: |
1183 | IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n", | 1201 | IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n", |
1184 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1202 | WLAN_FC_GET_STYPE(le16_to_cpu |
1203 | (header->frame_ctl))); | ||
1185 | IEEE80211_WARNING("%s: Unknown management packet: %d\n", | 1204 | IEEE80211_WARNING("%s: Unknown management packet: %d\n", |
1186 | ieee->dev->name, | 1205 | ieee->dev->name, |
1187 | WLAN_FC_GET_STYPE(header->frame_ctl)); | 1206 | WLAN_FC_GET_STYPE(le16_to_cpu |
1207 | (header->frame_ctl))); | ||
1188 | break; | 1208 | break; |
1189 | } | 1209 | } |
1190 | } | 1210 | } |
diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index c9aaff3fea1e..1a09448016ed 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c | |||
@@ -285,8 +285,8 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | |||
285 | } | 285 | } |
286 | 286 | ||
287 | /* Save source and destination addresses */ | 287 | /* Save source and destination addresses */ |
288 | memcpy(&dest, skb->data, ETH_ALEN); | 288 | memcpy(dest, skb->data, ETH_ALEN); |
289 | memcpy(&src, skb->data + ETH_ALEN, ETH_ALEN); | 289 | memcpy(src, skb->data + ETH_ALEN, ETH_ALEN); |
290 | 290 | ||
291 | /* Advance the SKB to the start of the payload */ | 291 | /* Advance the SKB to the start of the payload */ |
292 | skb_pull(skb, sizeof(struct ethhdr)); | 292 | skb_pull(skb, sizeof(struct ethhdr)); |
@@ -304,15 +304,15 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | |||
304 | fc |= IEEE80211_FCTL_TODS; | 304 | fc |= IEEE80211_FCTL_TODS; |
305 | /* To DS: Addr1 = BSSID, Addr2 = SA, | 305 | /* To DS: Addr1 = BSSID, Addr2 = SA, |
306 | Addr3 = DA */ | 306 | Addr3 = DA */ |
307 | memcpy(&header.addr1, ieee->bssid, ETH_ALEN); | 307 | memcpy(header.addr1, ieee->bssid, ETH_ALEN); |
308 | memcpy(&header.addr2, &src, ETH_ALEN); | 308 | memcpy(header.addr2, src, ETH_ALEN); |
309 | memcpy(&header.addr3, &dest, ETH_ALEN); | 309 | memcpy(header.addr3, dest, ETH_ALEN); |
310 | } else if (ieee->iw_mode == IW_MODE_ADHOC) { | 310 | } else if (ieee->iw_mode == IW_MODE_ADHOC) { |
311 | /* not From/To DS: Addr1 = DA, Addr2 = SA, | 311 | /* not From/To DS: Addr1 = DA, Addr2 = SA, |
312 | Addr3 = BSSID */ | 312 | Addr3 = BSSID */ |
313 | memcpy(&header.addr1, dest, ETH_ALEN); | 313 | memcpy(header.addr1, dest, ETH_ALEN); |
314 | memcpy(&header.addr2, src, ETH_ALEN); | 314 | memcpy(header.addr2, src, ETH_ALEN); |
315 | memcpy(&header.addr3, ieee->bssid, ETH_ALEN); | 315 | memcpy(header.addr3, ieee->bssid, ETH_ALEN); |
316 | } | 316 | } |
317 | header.frame_ctl = cpu_to_le16(fc); | 317 | header.frame_ctl = cpu_to_le16(fc); |
318 | hdr_len = IEEE80211_3ADDR_LEN; | 318 | hdr_len = IEEE80211_3ADDR_LEN; |
diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c index 94882f39b072..04f0897b0653 100644 --- a/net/ieee80211/ieee80211_wx.c +++ b/net/ieee80211/ieee80211_wx.c | |||
@@ -140,18 +140,38 @@ static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, | |||
140 | start = iwe_stream_add_point(start, stop, &iwe, custom); | 140 | start = iwe_stream_add_point(start, stop, &iwe, custom); |
141 | 141 | ||
142 | /* Add quality statistics */ | 142 | /* Add quality statistics */ |
143 | /* TODO: Fix these values... */ | ||
144 | iwe.cmd = IWEVQUAL; | 143 | iwe.cmd = IWEVQUAL; |
145 | iwe.u.qual.qual = network->stats.signal; | 144 | iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED | |
146 | iwe.u.qual.level = network->stats.rssi; | 145 | IW_QUAL_NOISE_UPDATED; |
147 | iwe.u.qual.noise = network->stats.noise; | 146 | |
148 | iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK; | 147 | if (!(network->stats.mask & IEEE80211_STATMASK_RSSI)) { |
149 | if (!(network->stats.mask & IEEE80211_STATMASK_RSSI)) | 148 | iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID | |
150 | iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID; | 149 | IW_QUAL_LEVEL_INVALID; |
151 | if (!(network->stats.mask & IEEE80211_STATMASK_NOISE)) | 150 | iwe.u.qual.qual = 0; |
151 | iwe.u.qual.level = 0; | ||
152 | } else { | ||
153 | iwe.u.qual.level = network->stats.rssi; | ||
154 | iwe.u.qual.qual = | ||
155 | (100 * | ||
156 | (ieee->perfect_rssi - ieee->worst_rssi) * | ||
157 | (ieee->perfect_rssi - ieee->worst_rssi) - | ||
158 | (ieee->perfect_rssi - network->stats.rssi) * | ||
159 | (15 * (ieee->perfect_rssi - ieee->worst_rssi) + | ||
160 | 62 * (ieee->perfect_rssi - network->stats.rssi))) / | ||
161 | ((ieee->perfect_rssi - ieee->worst_rssi) * | ||
162 | (ieee->perfect_rssi - ieee->worst_rssi)); | ||
163 | if (iwe.u.qual.qual > 100) | ||
164 | iwe.u.qual.qual = 100; | ||
165 | else if (iwe.u.qual.qual < 1) | ||
166 | iwe.u.qual.qual = 0; | ||
167 | } | ||
168 | |||
169 | if (!(network->stats.mask & IEEE80211_STATMASK_NOISE)) { | ||
152 | iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID; | 170 | iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID; |
153 | if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL)) | 171 | iwe.u.qual.noise = 0; |
154 | iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID; | 172 | } else { |
173 | iwe.u.qual.noise = network->stats.noise; | ||
174 | } | ||
155 | 175 | ||
156 | start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); | 176 | start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); |
157 | 177 | ||