diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-18 17:07:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-18 17:07:15 -0400 |
commit | d2aa4550379f92e929af7ed1dd4f55e6a1e331f8 (patch) | |
tree | 5ef0fc69a507f0d701fd157b6652427eabd5efdd /drivers/net | |
parent | 9e3e4b1d2d13bead8d52703c82a02b55f108b491 (diff) | |
parent | cb2107be43d2fc5eadec58b92b54bf32c00bfff3 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (55 commits)
netxen: fix tx ring accounting
netxen: fix detection of cut-thru firmware mode
forcedeth: fix dma api mismatches
atm: sk_wmem_alloc initial value is one
net: correct off-by-one write allocations reports
via-velocity : fix no link detection on boot
Net / e100: Fix suspend of devices that cannot be power managed
TI DaVinci EMAC : Fix rmmod error
net: group address list and its count
ipv4: Fix fib_trie rebalancing, part 2
pkt_sched: Update drops stats in act_police
sky2: version 1.23
sky2: add GRO support
sky2: skb recycling
sky2: reduce default transmit ring
sky2: receive counter update
sky2: fix shutdown synchronization
sky2: PCI irq issues
sky2: more receive shutdown
sky2: turn off pause during shutdown
...
Manually fix trivial conflict in net/core/skbuff.c due to kmemcheck
Diffstat (limited to 'drivers/net')
40 files changed, 452 insertions, 421 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 7e3738112c4e..38f1c3375d7f 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -3552,14 +3552,14 @@ bnx2_set_rx_mode(struct net_device *dev) | |||
3552 | sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN; | 3552 | sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN; |
3553 | } | 3553 | } |
3554 | 3554 | ||
3555 | if (dev->uc_count > BNX2_MAX_UNICAST_ADDRESSES) { | 3555 | if (dev->uc.count > BNX2_MAX_UNICAST_ADDRESSES) { |
3556 | rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; | 3556 | rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; |
3557 | sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN | | 3557 | sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN | |
3558 | BNX2_RPM_SORT_USER0_PROM_VLAN; | 3558 | BNX2_RPM_SORT_USER0_PROM_VLAN; |
3559 | } else if (!(dev->flags & IFF_PROMISC)) { | 3559 | } else if (!(dev->flags & IFF_PROMISC)) { |
3560 | /* Add all entries into to the match filter list */ | 3560 | /* Add all entries into to the match filter list */ |
3561 | i = 0; | 3561 | i = 0; |
3562 | list_for_each_entry(ha, &dev->uc_list, list) { | 3562 | list_for_each_entry(ha, &dev->uc.list, list) { |
3563 | bnx2_set_mac_addr(bp, ha->addr, | 3563 | bnx2_set_mac_addr(bp, ha->addr, |
3564 | i + BNX2_START_UNICAST_ADDRESS_INDEX); | 3564 | i + BNX2_START_UNICAST_ADDRESS_INDEX); |
3565 | sort_mode |= (1 << | 3565 | sort_mode |= (1 << |
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c index 0e9b9f9632c1..2df8fb0af701 100644 --- a/drivers/net/davinci_emac.c +++ b/drivers/net/davinci_emac.c | |||
@@ -2767,7 +2767,6 @@ static int __devexit davinci_emac_remove(struct platform_device *pdev) | |||
2767 | 2767 | ||
2768 | dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n"); | 2768 | dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n"); |
2769 | 2769 | ||
2770 | clk_disable(emac_clk); | ||
2771 | platform_set_drvdata(pdev, NULL); | 2770 | platform_set_drvdata(pdev, NULL); |
2772 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2771 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
2773 | mdiobus_unregister(priv->mii_bus); | 2772 | mdiobus_unregister(priv->mii_bus); |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index f7929e89eb03..efa680f4b8dd 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2895,12 +2895,13 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake) | |||
2895 | 2895 | ||
2896 | static int __e100_power_off(struct pci_dev *pdev, bool wake) | 2896 | static int __e100_power_off(struct pci_dev *pdev, bool wake) |
2897 | { | 2897 | { |
2898 | if (wake) { | 2898 | if (wake) |
2899 | return pci_prepare_to_sleep(pdev); | 2899 | return pci_prepare_to_sleep(pdev); |
2900 | } else { | 2900 | |
2901 | pci_wake_from_d3(pdev, false); | 2901 | pci_wake_from_d3(pdev, false); |
2902 | return pci_set_power_state(pdev, PCI_D3hot); | 2902 | pci_set_power_state(pdev, PCI_D3hot); |
2903 | } | 2903 | |
2904 | return 0; | ||
2904 | } | 2905 | } |
2905 | 2906 | ||
2906 | #ifdef CONFIG_PM | 2907 | #ifdef CONFIG_PM |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 8d36743c8140..5e3356f8eb5a 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -2370,7 +2370,7 @@ static void e1000_set_rx_mode(struct net_device *netdev) | |||
2370 | rctl |= E1000_RCTL_VFE; | 2370 | rctl |= E1000_RCTL_VFE; |
2371 | } | 2371 | } |
2372 | 2372 | ||
2373 | if (netdev->uc_count > rar_entries - 1) { | 2373 | if (netdev->uc.count > rar_entries - 1) { |
2374 | rctl |= E1000_RCTL_UPE; | 2374 | rctl |= E1000_RCTL_UPE; |
2375 | } else if (!(netdev->flags & IFF_PROMISC)) { | 2375 | } else if (!(netdev->flags & IFF_PROMISC)) { |
2376 | rctl &= ~E1000_RCTL_UPE; | 2376 | rctl &= ~E1000_RCTL_UPE; |
@@ -2394,7 +2394,7 @@ static void e1000_set_rx_mode(struct net_device *netdev) | |||
2394 | */ | 2394 | */ |
2395 | i = 1; | 2395 | i = 1; |
2396 | if (use_uc) | 2396 | if (use_uc) |
2397 | list_for_each_entry(ha, &netdev->uc_list, list) { | 2397 | list_for_each_entry(ha, &netdev->uc.list, list) { |
2398 | if (i == rar_entries) | 2398 | if (i == rar_entries) |
2399 | break; | 2399 | break; |
2400 | e1000_rar_set(hw, ha->addr, i++); | 2400 | e1000_rar_set(hw, ha->addr, i++); |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index b60a3041b64c..1094d292630f 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -719,7 +719,8 @@ static const struct register_test nv_registers_test[] = { | |||
719 | struct nv_skb_map { | 719 | struct nv_skb_map { |
720 | struct sk_buff *skb; | 720 | struct sk_buff *skb; |
721 | dma_addr_t dma; | 721 | dma_addr_t dma; |
722 | unsigned int dma_len; | 722 | unsigned int dma_len:31; |
723 | unsigned int dma_single:1; | ||
723 | struct ring_desc_ex *first_tx_desc; | 724 | struct ring_desc_ex *first_tx_desc; |
724 | struct nv_skb_map *next_tx_ctx; | 725 | struct nv_skb_map *next_tx_ctx; |
725 | }; | 726 | }; |
@@ -1912,6 +1913,7 @@ static void nv_init_tx(struct net_device *dev) | |||
1912 | np->tx_skb[i].skb = NULL; | 1913 | np->tx_skb[i].skb = NULL; |
1913 | np->tx_skb[i].dma = 0; | 1914 | np->tx_skb[i].dma = 0; |
1914 | np->tx_skb[i].dma_len = 0; | 1915 | np->tx_skb[i].dma_len = 0; |
1916 | np->tx_skb[i].dma_single = 0; | ||
1915 | np->tx_skb[i].first_tx_desc = NULL; | 1917 | np->tx_skb[i].first_tx_desc = NULL; |
1916 | np->tx_skb[i].next_tx_ctx = NULL; | 1918 | np->tx_skb[i].next_tx_ctx = NULL; |
1917 | } | 1919 | } |
@@ -1930,23 +1932,30 @@ static int nv_init_ring(struct net_device *dev) | |||
1930 | return nv_alloc_rx_optimized(dev); | 1932 | return nv_alloc_rx_optimized(dev); |
1931 | } | 1933 | } |
1932 | 1934 | ||
1933 | static int nv_release_txskb(struct net_device *dev, struct nv_skb_map* tx_skb) | 1935 | static void nv_unmap_txskb(struct fe_priv *np, struct nv_skb_map *tx_skb) |
1934 | { | 1936 | { |
1935 | struct fe_priv *np = netdev_priv(dev); | ||
1936 | |||
1937 | if (tx_skb->dma) { | 1937 | if (tx_skb->dma) { |
1938 | pci_unmap_page(np->pci_dev, tx_skb->dma, | 1938 | if (tx_skb->dma_single) |
1939 | tx_skb->dma_len, | 1939 | pci_unmap_single(np->pci_dev, tx_skb->dma, |
1940 | PCI_DMA_TODEVICE); | 1940 | tx_skb->dma_len, |
1941 | PCI_DMA_TODEVICE); | ||
1942 | else | ||
1943 | pci_unmap_page(np->pci_dev, tx_skb->dma, | ||
1944 | tx_skb->dma_len, | ||
1945 | PCI_DMA_TODEVICE); | ||
1941 | tx_skb->dma = 0; | 1946 | tx_skb->dma = 0; |
1942 | } | 1947 | } |
1948 | } | ||
1949 | |||
1950 | static int nv_release_txskb(struct fe_priv *np, struct nv_skb_map *tx_skb) | ||
1951 | { | ||
1952 | nv_unmap_txskb(np, tx_skb); | ||
1943 | if (tx_skb->skb) { | 1953 | if (tx_skb->skb) { |
1944 | dev_kfree_skb_any(tx_skb->skb); | 1954 | dev_kfree_skb_any(tx_skb->skb); |
1945 | tx_skb->skb = NULL; | 1955 | tx_skb->skb = NULL; |
1946 | return 1; | 1956 | return 1; |
1947 | } else { | ||
1948 | return 0; | ||
1949 | } | 1957 | } |
1958 | return 0; | ||
1950 | } | 1959 | } |
1951 | 1960 | ||
1952 | static void nv_drain_tx(struct net_device *dev) | 1961 | static void nv_drain_tx(struct net_device *dev) |
@@ -1964,10 +1973,11 @@ static void nv_drain_tx(struct net_device *dev) | |||
1964 | np->tx_ring.ex[i].bufhigh = 0; | 1973 | np->tx_ring.ex[i].bufhigh = 0; |
1965 | np->tx_ring.ex[i].buflow = 0; | 1974 | np->tx_ring.ex[i].buflow = 0; |
1966 | } | 1975 | } |
1967 | if (nv_release_txskb(dev, &np->tx_skb[i])) | 1976 | if (nv_release_txskb(np, &np->tx_skb[i])) |
1968 | dev->stats.tx_dropped++; | 1977 | dev->stats.tx_dropped++; |
1969 | np->tx_skb[i].dma = 0; | 1978 | np->tx_skb[i].dma = 0; |
1970 | np->tx_skb[i].dma_len = 0; | 1979 | np->tx_skb[i].dma_len = 0; |
1980 | np->tx_skb[i].dma_single = 0; | ||
1971 | np->tx_skb[i].first_tx_desc = NULL; | 1981 | np->tx_skb[i].first_tx_desc = NULL; |
1972 | np->tx_skb[i].next_tx_ctx = NULL; | 1982 | np->tx_skb[i].next_tx_ctx = NULL; |
1973 | } | 1983 | } |
@@ -2171,6 +2181,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2171 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, | 2181 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, |
2172 | PCI_DMA_TODEVICE); | 2182 | PCI_DMA_TODEVICE); |
2173 | np->put_tx_ctx->dma_len = bcnt; | 2183 | np->put_tx_ctx->dma_len = bcnt; |
2184 | np->put_tx_ctx->dma_single = 1; | ||
2174 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); | 2185 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); |
2175 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); | 2186 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); |
2176 | 2187 | ||
@@ -2196,6 +2207,7 @@ static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2196 | np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, | 2207 | np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, |
2197 | PCI_DMA_TODEVICE); | 2208 | PCI_DMA_TODEVICE); |
2198 | np->put_tx_ctx->dma_len = bcnt; | 2209 | np->put_tx_ctx->dma_len = bcnt; |
2210 | np->put_tx_ctx->dma_single = 0; | ||
2199 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); | 2211 | put_tx->buf = cpu_to_le32(np->put_tx_ctx->dma); |
2200 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); | 2212 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); |
2201 | 2213 | ||
@@ -2291,6 +2303,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
2291 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, | 2303 | np->put_tx_ctx->dma = pci_map_single(np->pci_dev, skb->data + offset, bcnt, |
2292 | PCI_DMA_TODEVICE); | 2304 | PCI_DMA_TODEVICE); |
2293 | np->put_tx_ctx->dma_len = bcnt; | 2305 | np->put_tx_ctx->dma_len = bcnt; |
2306 | np->put_tx_ctx->dma_single = 1; | ||
2294 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); | 2307 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); |
2295 | put_tx->buflow = cpu_to_le32(dma_low(np->put_tx_ctx->dma)); | 2308 | put_tx->buflow = cpu_to_le32(dma_low(np->put_tx_ctx->dma)); |
2296 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); | 2309 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); |
@@ -2317,6 +2330,7 @@ static int nv_start_xmit_optimized(struct sk_buff *skb, struct net_device *dev) | |||
2317 | np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, | 2330 | np->put_tx_ctx->dma = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, |
2318 | PCI_DMA_TODEVICE); | 2331 | PCI_DMA_TODEVICE); |
2319 | np->put_tx_ctx->dma_len = bcnt; | 2332 | np->put_tx_ctx->dma_len = bcnt; |
2333 | np->put_tx_ctx->dma_single = 0; | ||
2320 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); | 2334 | put_tx->bufhigh = cpu_to_le32(dma_high(np->put_tx_ctx->dma)); |
2321 | put_tx->buflow = cpu_to_le32(dma_low(np->put_tx_ctx->dma)); | 2335 | put_tx->buflow = cpu_to_le32(dma_low(np->put_tx_ctx->dma)); |
2322 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); | 2336 | put_tx->flaglen = cpu_to_le32((bcnt-1) | tx_flags); |
@@ -2434,10 +2448,7 @@ static int nv_tx_done(struct net_device *dev, int limit) | |||
2434 | dprintk(KERN_DEBUG "%s: nv_tx_done: flags 0x%x.\n", | 2448 | dprintk(KERN_DEBUG "%s: nv_tx_done: flags 0x%x.\n", |
2435 | dev->name, flags); | 2449 | dev->name, flags); |
2436 | 2450 | ||
2437 | pci_unmap_page(np->pci_dev, np->get_tx_ctx->dma, | 2451 | nv_unmap_txskb(np, np->get_tx_ctx); |
2438 | np->get_tx_ctx->dma_len, | ||
2439 | PCI_DMA_TODEVICE); | ||
2440 | np->get_tx_ctx->dma = 0; | ||
2441 | 2452 | ||
2442 | if (np->desc_ver == DESC_VER_1) { | 2453 | if (np->desc_ver == DESC_VER_1) { |
2443 | if (flags & NV_TX_LASTPACKET) { | 2454 | if (flags & NV_TX_LASTPACKET) { |
@@ -2502,10 +2513,7 @@ static int nv_tx_done_optimized(struct net_device *dev, int limit) | |||
2502 | dprintk(KERN_DEBUG "%s: nv_tx_done_optimized: flags 0x%x.\n", | 2513 | dprintk(KERN_DEBUG "%s: nv_tx_done_optimized: flags 0x%x.\n", |
2503 | dev->name, flags); | 2514 | dev->name, flags); |
2504 | 2515 | ||
2505 | pci_unmap_page(np->pci_dev, np->get_tx_ctx->dma, | 2516 | nv_unmap_txskb(np, np->get_tx_ctx); |
2506 | np->get_tx_ctx->dma_len, | ||
2507 | PCI_DMA_TODEVICE); | ||
2508 | np->get_tx_ctx->dma = 0; | ||
2509 | 2517 | ||
2510 | if (flags & NV_TX2_LASTPACKET) { | 2518 | if (flags & NV_TX2_LASTPACKET) { |
2511 | if (!(flags & NV_TX2_ERROR)) | 2519 | if (!(flags & NV_TX2_ERROR)) |
@@ -5091,7 +5099,7 @@ static int nv_loopback_test(struct net_device *dev) | |||
5091 | dprintk(KERN_DEBUG "%s: loopback - did not receive test packet\n", dev->name); | 5099 | dprintk(KERN_DEBUG "%s: loopback - did not receive test packet\n", dev->name); |
5092 | } | 5100 | } |
5093 | 5101 | ||
5094 | pci_unmap_page(np->pci_dev, test_dma_addr, | 5102 | pci_unmap_single(np->pci_dev, test_dma_addr, |
5095 | (skb_end_pointer(tx_skb) - tx_skb->data), | 5103 | (skb_end_pointer(tx_skb) - tx_skb->data), |
5096 | PCI_DMA_TODEVICE); | 5104 | PCI_DMA_TODEVICE); |
5097 | dev_kfree_skb_any(tx_skb); | 5105 | dev_kfree_skb_any(tx_skb); |
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c index 5105548ad50c..abcd19a8bff9 100644 --- a/drivers/net/hamradio/bpqether.c +++ b/drivers/net/hamradio/bpqether.c | |||
@@ -260,7 +260,7 @@ static int bpq_xmit(struct sk_buff *skb, struct net_device *dev) | |||
260 | */ | 260 | */ |
261 | if (!netif_running(dev)) { | 261 | if (!netif_running(dev)) { |
262 | kfree_skb(skb); | 262 | kfree_skb(skb); |
263 | return -ENODEV; | 263 | return NETDEV_TX_OK; |
264 | } | 264 | } |
265 | 265 | ||
266 | skb_pull(skb, 1); | 266 | skb_pull(skb, 1); |
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index 8feda9fe8297..1d3429a415e6 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c | |||
@@ -1495,13 +1495,8 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) | |||
1495 | hp100_outw(0x4210, TRACE); | 1495 | hp100_outw(0x4210, TRACE); |
1496 | printk("hp100: %s: start_xmit_bm\n", dev->name); | 1496 | printk("hp100: %s: start_xmit_bm\n", dev->name); |
1497 | #endif | 1497 | #endif |
1498 | |||
1499 | if (skb == NULL) { | ||
1500 | return 0; | ||
1501 | } | ||
1502 | |||
1503 | if (skb->len <= 0) | 1498 | if (skb->len <= 0) |
1504 | return 0; | 1499 | goto drop; |
1505 | 1500 | ||
1506 | if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN)) | 1501 | if (lp->chip == HP100_CHIPID_SHASTA && skb_padto(skb, ETH_ZLEN)) |
1507 | return 0; | 1502 | return 0; |
@@ -1514,10 +1509,10 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) | |||
1514 | #endif | 1509 | #endif |
1515 | /* not waited long enough since last tx? */ | 1510 | /* not waited long enough since last tx? */ |
1516 | if (time_before(jiffies, dev->trans_start + HZ)) | 1511 | if (time_before(jiffies, dev->trans_start + HZ)) |
1517 | return -EAGAIN; | 1512 | goto drop; |
1518 | 1513 | ||
1519 | if (hp100_check_lan(dev)) | 1514 | if (hp100_check_lan(dev)) |
1520 | return -EIO; | 1515 | goto drop; |
1521 | 1516 | ||
1522 | if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) { | 1517 | if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) { |
1523 | /* we have a 100Mb/s adapter but it isn't connected to hub */ | 1518 | /* we have a 100Mb/s adapter but it isn't connected to hub */ |
@@ -1551,7 +1546,7 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) | |||
1551 | } | 1546 | } |
1552 | 1547 | ||
1553 | dev->trans_start = jiffies; | 1548 | dev->trans_start = jiffies; |
1554 | return -EAGAIN; | 1549 | goto drop; |
1555 | } | 1550 | } |
1556 | 1551 | ||
1557 | /* | 1552 | /* |
@@ -1591,6 +1586,10 @@ static int hp100_start_xmit_bm(struct sk_buff *skb, struct net_device *dev) | |||
1591 | dev->trans_start = jiffies; | 1586 | dev->trans_start = jiffies; |
1592 | 1587 | ||
1593 | return 0; | 1588 | return 0; |
1589 | |||
1590 | drop: | ||
1591 | dev_kfree_skb(skb); | ||
1592 | return NETDEV_TX_OK; | ||
1594 | } | 1593 | } |
1595 | 1594 | ||
1596 | 1595 | ||
@@ -1648,16 +1647,11 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1648 | hp100_outw(0x4212, TRACE); | 1647 | hp100_outw(0x4212, TRACE); |
1649 | printk("hp100: %s: start_xmit\n", dev->name); | 1648 | printk("hp100: %s: start_xmit\n", dev->name); |
1650 | #endif | 1649 | #endif |
1651 | |||
1652 | if (skb == NULL) { | ||
1653 | return 0; | ||
1654 | } | ||
1655 | |||
1656 | if (skb->len <= 0) | 1650 | if (skb->len <= 0) |
1657 | return 0; | 1651 | goto drop; |
1658 | 1652 | ||
1659 | if (hp100_check_lan(dev)) | 1653 | if (hp100_check_lan(dev)) |
1660 | return -EIO; | 1654 | goto drop; |
1661 | 1655 | ||
1662 | /* If there is not enough free memory on the card... */ | 1656 | /* If there is not enough free memory on the card... */ |
1663 | i = hp100_inl(TX_MEM_FREE) & 0x7fffffff; | 1657 | i = hp100_inl(TX_MEM_FREE) & 0x7fffffff; |
@@ -1671,7 +1665,7 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1671 | printk("hp100: %s: trans_start timing problem\n", | 1665 | printk("hp100: %s: trans_start timing problem\n", |
1672 | dev->name); | 1666 | dev->name); |
1673 | #endif | 1667 | #endif |
1674 | return -EAGAIN; | 1668 | goto drop; |
1675 | } | 1669 | } |
1676 | if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) { | 1670 | if (lp->lan_type == HP100_LAN_100 && lp->hub_status < 0) { |
1677 | /* we have a 100Mb/s adapter but it isn't connected to hub */ | 1671 | /* we have a 100Mb/s adapter but it isn't connected to hub */ |
@@ -1705,7 +1699,7 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1705 | } | 1699 | } |
1706 | } | 1700 | } |
1707 | dev->trans_start = jiffies; | 1701 | dev->trans_start = jiffies; |
1708 | return -EAGAIN; | 1702 | goto drop; |
1709 | } | 1703 | } |
1710 | 1704 | ||
1711 | for (i = 0; i < 6000 && (hp100_inb(OPTION_MSW) & HP100_TX_CMD); i++) { | 1705 | for (i = 0; i < 6000 && (hp100_inb(OPTION_MSW) & HP100_TX_CMD); i++) { |
@@ -1759,6 +1753,11 @@ static int hp100_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1759 | #endif | 1753 | #endif |
1760 | 1754 | ||
1761 | return 0; | 1755 | return 0; |
1756 | |||
1757 | drop: | ||
1758 | dev_kfree_skb(skb); | ||
1759 | return NETDEV_TX_OK; | ||
1760 | |||
1762 | } | 1761 | } |
1763 | 1762 | ||
1764 | 1763 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index a551a96ce676..e756e220db32 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -2321,7 +2321,7 @@ static void ixgbe_set_rx_mode(struct net_device *netdev) | |||
2321 | IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); | 2321 | IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); |
2322 | 2322 | ||
2323 | /* reprogram secondary unicast list */ | 2323 | /* reprogram secondary unicast list */ |
2324 | hw->mac.ops.update_uc_addr_list(hw, &netdev->uc_list); | 2324 | hw->mac.ops.update_uc_addr_list(hw, &netdev->uc.list); |
2325 | 2325 | ||
2326 | /* reprogram multicast list */ | 2326 | /* reprogram multicast list */ |
2327 | addr_count = netdev->mc_count; | 2327 | addr_count = netdev->mc_count; |
@@ -5261,7 +5261,7 @@ static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *req, int cmd) | |||
5261 | 5261 | ||
5262 | /** | 5262 | /** |
5263 | * ixgbe_add_sanmac_netdev - Add the SAN MAC address to the corresponding | 5263 | * ixgbe_add_sanmac_netdev - Add the SAN MAC address to the corresponding |
5264 | * netdev->dev_addr_list | 5264 | * netdev->dev_addrs |
5265 | * @netdev: network interface device structure | 5265 | * @netdev: network interface device structure |
5266 | * | 5266 | * |
5267 | * Returns non-zero on failure | 5267 | * Returns non-zero on failure |
@@ -5282,7 +5282,7 @@ static int ixgbe_add_sanmac_netdev(struct net_device *dev) | |||
5282 | 5282 | ||
5283 | /** | 5283 | /** |
5284 | * ixgbe_del_sanmac_netdev - Removes the SAN MAC address to the corresponding | 5284 | * ixgbe_del_sanmac_netdev - Removes the SAN MAC address to the corresponding |
5285 | * netdev->dev_addr_list | 5285 | * netdev->dev_addrs |
5286 | * @netdev: network interface device structure | 5286 | * @netdev: network interface device structure |
5287 | * | 5287 | * |
5288 | * Returns non-zero on failure | 5288 | * Returns non-zero on failure |
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index b4e18a58cb1b..745ae8b4a2e8 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -1729,7 +1729,7 @@ static u32 uc_addr_filter_mask(struct net_device *dev) | |||
1729 | return 0; | 1729 | return 0; |
1730 | 1730 | ||
1731 | nibbles = 1 << (dev->dev_addr[5] & 0x0f); | 1731 | nibbles = 1 << (dev->dev_addr[5] & 0x0f); |
1732 | list_for_each_entry(ha, &dev->uc_list, list) { | 1732 | list_for_each_entry(ha, &dev->uc.list, list) { |
1733 | if (memcmp(dev->dev_addr, ha->addr, 5)) | 1733 | if (memcmp(dev->dev_addr, ha->addr, 5)) |
1734 | return 0; | 1734 | return 0; |
1735 | if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0) | 1735 | if ((dev->dev_addr[5] ^ ha->addr[5]) & 0xf0) |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index ab11c2b3f0fe..970cedeb5f37 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -169,6 +169,7 @@ | |||
169 | #define MAX_NUM_CARDS 4 | 169 | #define MAX_NUM_CARDS 4 |
170 | 170 | ||
171 | #define MAX_BUFFERS_PER_CMD 32 | 171 | #define MAX_BUFFERS_PER_CMD 32 |
172 | #define TX_STOP_THRESH ((MAX_SKB_FRAGS >> 2) + 4) | ||
172 | 173 | ||
173 | /* | 174 | /* |
174 | * Following are the states of the Phantom. Phantom will set them and | 175 | * Following are the states of the Phantom. Phantom will set them and |
@@ -1436,7 +1437,7 @@ int netxen_nic_set_mac(struct net_device *netdev, void *p); | |||
1436 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); | 1437 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); |
1437 | 1438 | ||
1438 | void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, | 1439 | void netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, |
1439 | struct nx_host_tx_ring *tx_ring, uint32_t crb_producer); | 1440 | struct nx_host_tx_ring *tx_ring); |
1440 | 1441 | ||
1441 | /* | 1442 | /* |
1442 | * NetXen Board information | 1443 | * NetXen Board information |
@@ -1538,6 +1539,14 @@ dma_watchdog_wakeup(struct netxen_adapter *adapter) | |||
1538 | } | 1539 | } |
1539 | 1540 | ||
1540 | 1541 | ||
1542 | static inline u32 netxen_tx_avail(struct nx_host_tx_ring *tx_ring) | ||
1543 | { | ||
1544 | smp_mb(); | ||
1545 | return find_diff_among(tx_ring->producer, | ||
1546 | tx_ring->sw_consumer, tx_ring->num_desc); | ||
1547 | |||
1548 | } | ||
1549 | |||
1541 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac); | 1550 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac); |
1542 | int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac); | 1551 | int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac); |
1543 | extern void netxen_change_ringparam(struct netxen_adapter *adapter); | 1552 | extern void netxen_change_ringparam(struct netxen_adapter *adapter); |
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index 7f0ddbfa7b28..3cc047844af3 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -355,6 +355,7 @@ enum { | |||
355 | #define NETXEN_HW_CRB_HUB_AGT_ADR_LPC \ | 355 | #define NETXEN_HW_CRB_HUB_AGT_ADR_LPC \ |
356 | ((NETXEN_HW_H6_CH_HUB_ADR << 7) | NETXEN_HW_LPC_CRB_AGT_ADR) | 356 | ((NETXEN_HW_H6_CH_HUB_ADR << 7) | NETXEN_HW_LPC_CRB_AGT_ADR) |
357 | 357 | ||
358 | #define NETXEN_SRE_MISC (NETXEN_CRB_SRE + 0x0002c) | ||
358 | #define NETXEN_SRE_INT_STATUS (NETXEN_CRB_SRE + 0x00034) | 359 | #define NETXEN_SRE_INT_STATUS (NETXEN_CRB_SRE + 0x00034) |
359 | #define NETXEN_SRE_PBI_ACTIVE_STATUS (NETXEN_CRB_SRE + 0x01014) | 360 | #define NETXEN_SRE_PBI_ACTIVE_STATUS (NETXEN_CRB_SRE + 0x01014) |
360 | #define NETXEN_SRE_L1RE_CTL (NETXEN_CRB_SRE + 0x03000) | 361 | #define NETXEN_SRE_L1RE_CTL (NETXEN_CRB_SRE + 0x03000) |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 42ffb825ebf1..ce3b89d2cbb6 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -488,7 +488,7 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter, | |||
488 | 488 | ||
489 | tx_ring->producer = producer; | 489 | tx_ring->producer = producer; |
490 | 490 | ||
491 | netxen_nic_update_cmd_producer(adapter, tx_ring, producer); | 491 | netxen_nic_update_cmd_producer(adapter, tx_ring); |
492 | 492 | ||
493 | netif_tx_unlock_bh(adapter->netdev); | 493 | netif_tx_unlock_bh(adapter->netdev); |
494 | 494 | ||
@@ -2041,8 +2041,8 @@ void netxen_nic_get_firmware_info(struct netxen_adapter *adapter) | |||
2041 | fw_major, fw_minor, fw_build); | 2041 | fw_major, fw_minor, fw_build); |
2042 | 2042 | ||
2043 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | 2043 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
2044 | i = NXRD32(adapter, NETXEN_MIU_MN_CONTROL); | 2044 | i = NXRD32(adapter, NETXEN_SRE_MISC); |
2045 | adapter->ahw.cut_through = (i & 0x4) ? 1 : 0; | 2045 | adapter->ahw.cut_through = (i & 0x8000) ? 1 : 0; |
2046 | dev_info(&pdev->dev, "firmware running in %s mode\n", | 2046 | dev_info(&pdev->dev, "firmware running in %s mode\n", |
2047 | adapter->ahw.cut_through ? "cut-through" : "legacy"); | 2047 | adapter->ahw.cut_through ? "cut-through" : "legacy"); |
2048 | } | 2048 | } |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 6f77ad58e3b3..bdb143d2b5c7 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -1292,7 +1292,6 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter) | |||
1292 | return 1; | 1292 | return 1; |
1293 | 1293 | ||
1294 | sw_consumer = tx_ring->sw_consumer; | 1294 | sw_consumer = tx_ring->sw_consumer; |
1295 | barrier(); /* hw_consumer can change underneath */ | ||
1296 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 1295 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
1297 | 1296 | ||
1298 | while (sw_consumer != hw_consumer) { | 1297 | while (sw_consumer != hw_consumer) { |
@@ -1319,14 +1318,15 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter) | |||
1319 | break; | 1318 | break; |
1320 | } | 1319 | } |
1321 | 1320 | ||
1322 | tx_ring->sw_consumer = sw_consumer; | ||
1323 | |||
1324 | if (count && netif_running(netdev)) { | 1321 | if (count && netif_running(netdev)) { |
1322 | tx_ring->sw_consumer = sw_consumer; | ||
1323 | |||
1325 | smp_mb(); | 1324 | smp_mb(); |
1325 | |||
1326 | if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) { | 1326 | if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) { |
1327 | netif_tx_lock(netdev); | 1327 | netif_tx_lock(netdev); |
1328 | netif_wake_queue(netdev); | 1328 | if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH) |
1329 | smp_mb(); | 1329 | netif_wake_queue(netdev); |
1330 | netif_tx_unlock(netdev); | 1330 | netif_tx_unlock(netdev); |
1331 | } | 1331 | } |
1332 | } | 1332 | } |
@@ -1343,7 +1343,6 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter) | |||
1343 | * There is still a possible race condition and the host could miss an | 1343 | * There is still a possible race condition and the host could miss an |
1344 | * interrupt. The card has to take care of this. | 1344 | * interrupt. The card has to take care of this. |
1345 | */ | 1345 | */ |
1346 | barrier(); /* hw_consumer can change underneath */ | ||
1347 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 1346 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
1348 | done = (sw_consumer == hw_consumer); | 1347 | done = (sw_consumer == hw_consumer); |
1349 | spin_unlock(&adapter->tx_clean_lock); | 1348 | spin_unlock(&adapter->tx_clean_lock); |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 98737ef72936..71daa3d5f114 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -107,9 +107,14 @@ static uint32_t crb_cmd_producer[4] = { | |||
107 | 107 | ||
108 | void | 108 | void |
109 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, | 109 | netxen_nic_update_cmd_producer(struct netxen_adapter *adapter, |
110 | struct nx_host_tx_ring *tx_ring, u32 producer) | 110 | struct nx_host_tx_ring *tx_ring) |
111 | { | 111 | { |
112 | NXWR32(adapter, tx_ring->crb_cmd_producer, producer); | 112 | NXWR32(adapter, tx_ring->crb_cmd_producer, tx_ring->producer); |
113 | |||
114 | if (netxen_tx_avail(tx_ring) <= TX_STOP_THRESH) { | ||
115 | netif_stop_queue(adapter->netdev); | ||
116 | smp_mb(); | ||
117 | } | ||
113 | } | 118 | } |
114 | 119 | ||
115 | static uint32_t crb_cmd_consumer[4] = { | 120 | static uint32_t crb_cmd_consumer[4] = { |
@@ -119,9 +124,9 @@ static uint32_t crb_cmd_consumer[4] = { | |||
119 | 124 | ||
120 | static inline void | 125 | static inline void |
121 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, | 126 | netxen_nic_update_cmd_consumer(struct netxen_adapter *adapter, |
122 | struct nx_host_tx_ring *tx_ring, u32 consumer) | 127 | struct nx_host_tx_ring *tx_ring) |
123 | { | 128 | { |
124 | NXWR32(adapter, tx_ring->crb_cmd_consumer, consumer); | 129 | NXWR32(adapter, tx_ring->crb_cmd_consumer, tx_ring->sw_consumer); |
125 | } | 130 | } |
126 | 131 | ||
127 | static uint32_t msi_tgt_status[8] = { | 132 | static uint32_t msi_tgt_status[8] = { |
@@ -900,8 +905,11 @@ netxen_nic_attach(struct netxen_adapter *adapter) | |||
900 | tx_ring->crb_cmd_producer = crb_cmd_producer[adapter->portnum]; | 905 | tx_ring->crb_cmd_producer = crb_cmd_producer[adapter->portnum]; |
901 | tx_ring->crb_cmd_consumer = crb_cmd_consumer[adapter->portnum]; | 906 | tx_ring->crb_cmd_consumer = crb_cmd_consumer[adapter->portnum]; |
902 | 907 | ||
903 | netxen_nic_update_cmd_producer(adapter, tx_ring, 0); | 908 | tx_ring->producer = 0; |
904 | netxen_nic_update_cmd_consumer(adapter, tx_ring, 0); | 909 | tx_ring->sw_consumer = 0; |
910 | |||
911 | netxen_nic_update_cmd_producer(adapter, tx_ring); | ||
912 | netxen_nic_update_cmd_consumer(adapter, tx_ring); | ||
905 | } | 913 | } |
906 | 914 | ||
907 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { | 915 | for (ring = 0; ring < adapter->max_rds_rings; ring++) { |
@@ -1362,7 +1370,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1362 | dma_addr_t temp_dma; | 1370 | dma_addr_t temp_dma; |
1363 | int i, k; | 1371 | int i, k; |
1364 | 1372 | ||
1365 | u32 producer, consumer; | 1373 | u32 producer; |
1366 | int frag_count, no_of_desc; | 1374 | int frag_count, no_of_desc; |
1367 | u32 num_txd = tx_ring->num_desc; | 1375 | u32 num_txd = tx_ring->num_desc; |
1368 | bool is_tso = false; | 1376 | bool is_tso = false; |
@@ -1372,15 +1380,13 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1372 | /* 4 fragments per cmd des */ | 1380 | /* 4 fragments per cmd des */ |
1373 | no_of_desc = (frag_count + 3) >> 2; | 1381 | no_of_desc = (frag_count + 3) >> 2; |
1374 | 1382 | ||
1375 | producer = tx_ring->producer; | 1383 | if (unlikely(no_of_desc + 2) > netxen_tx_avail(tx_ring)) { |
1376 | smp_mb(); | ||
1377 | consumer = tx_ring->sw_consumer; | ||
1378 | if ((no_of_desc+2) >= find_diff_among(producer, consumer, num_txd)) { | ||
1379 | netif_stop_queue(netdev); | 1384 | netif_stop_queue(netdev); |
1380 | smp_mb(); | ||
1381 | return NETDEV_TX_BUSY; | 1385 | return NETDEV_TX_BUSY; |
1382 | } | 1386 | } |
1383 | 1387 | ||
1388 | producer = tx_ring->producer; | ||
1389 | |||
1384 | hwdesc = &tx_ring->desc_head[producer]; | 1390 | hwdesc = &tx_ring->desc_head[producer]; |
1385 | netxen_clear_cmddesc((u64 *)hwdesc); | 1391 | netxen_clear_cmddesc((u64 *)hwdesc); |
1386 | pbuf = &tx_ring->cmd_buf_arr[producer]; | 1392 | pbuf = &tx_ring->cmd_buf_arr[producer]; |
@@ -1493,7 +1499,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1493 | tx_ring->producer = producer; | 1499 | tx_ring->producer = producer; |
1494 | adapter->stats.txbytes += skb->len; | 1500 | adapter->stats.txbytes += skb->len; |
1495 | 1501 | ||
1496 | netxen_nic_update_cmd_producer(adapter, tx_ring, producer); | 1502 | netxen_nic_update_cmd_producer(adapter, tx_ring); |
1497 | 1503 | ||
1498 | adapter->stats.xmitcalled++; | 1504 | adapter->stats.xmitcalled++; |
1499 | 1505 | ||
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index fa61a12c5e15..d2146d4a10f3 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -6376,7 +6376,7 @@ static void niu_set_rx_mode(struct net_device *dev) | |||
6376 | if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 0)) | 6376 | if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 0)) |
6377 | np->flags |= NIU_FLAGS_MCAST; | 6377 | np->flags |= NIU_FLAGS_MCAST; |
6378 | 6378 | ||
6379 | alt_cnt = dev->uc_count; | 6379 | alt_cnt = dev->uc.count; |
6380 | if (alt_cnt > niu_num_alt_addr(np)) { | 6380 | if (alt_cnt > niu_num_alt_addr(np)) { |
6381 | alt_cnt = 0; | 6381 | alt_cnt = 0; |
6382 | np->flags |= NIU_FLAGS_PROMISC; | 6382 | np->flags |= NIU_FLAGS_PROMISC; |
@@ -6385,7 +6385,7 @@ static void niu_set_rx_mode(struct net_device *dev) | |||
6385 | if (alt_cnt) { | 6385 | if (alt_cnt) { |
6386 | int index = 0; | 6386 | int index = 0; |
6387 | 6387 | ||
6388 | list_for_each_entry(ha, &dev->uc_list, list) { | 6388 | list_for_each_entry(ha, &dev->uc.list, list) { |
6389 | err = niu_set_alt_mac(np, index, ha->addr); | 6389 | err = niu_set_alt_mac(np, index, ha->addr); |
6390 | if (err) | 6390 | if (err) |
6391 | printk(KERN_WARNING PFX "%s: Error %d " | 6391 | printk(KERN_WARNING PFX "%s: Error %d " |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index a2ece89622d6..eba937c46376 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -244,7 +244,7 @@ EXPORT_SYMBOL(get_phy_device); | |||
244 | 244 | ||
245 | /** | 245 | /** |
246 | * phy_device_register - Register the phy device on the MDIO bus | 246 | * phy_device_register - Register the phy device on the MDIO bus |
247 | * @phy_device: phy_device structure to be added to the MDIO bus | 247 | * @phydev: phy_device structure to be added to the MDIO bus |
248 | */ | 248 | */ |
249 | int phy_device_register(struct phy_device *phydev) | 249 | int phy_device_register(struct phy_device *phydev) |
250 | { | 250 | { |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 35196faa084e..4e22462684c9 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -3811,22 +3811,11 @@ static struct net_device_stats *rtl8169_get_stats(struct net_device *dev) | |||
3811 | 3811 | ||
3812 | static void rtl8169_net_suspend(struct net_device *dev) | 3812 | static void rtl8169_net_suspend(struct net_device *dev) |
3813 | { | 3813 | { |
3814 | struct rtl8169_private *tp = netdev_priv(dev); | ||
3815 | void __iomem *ioaddr = tp->mmio_addr; | ||
3816 | |||
3817 | if (!netif_running(dev)) | 3814 | if (!netif_running(dev)) |
3818 | return; | 3815 | return; |
3819 | 3816 | ||
3820 | netif_device_detach(dev); | 3817 | netif_device_detach(dev); |
3821 | netif_stop_queue(dev); | 3818 | netif_stop_queue(dev); |
3822 | |||
3823 | spin_lock_irq(&tp->lock); | ||
3824 | |||
3825 | rtl8169_asic_down(ioaddr); | ||
3826 | |||
3827 | rtl8169_rx_missed(dev, ioaddr); | ||
3828 | |||
3829 | spin_unlock_irq(&tp->lock); | ||
3830 | } | 3819 | } |
3831 | 3820 | ||
3832 | #ifdef CONFIG_PM | 3821 | #ifdef CONFIG_PM |
@@ -3876,9 +3865,17 @@ static struct dev_pm_ops rtl8169_pm_ops = { | |||
3876 | static void rtl_shutdown(struct pci_dev *pdev) | 3865 | static void rtl_shutdown(struct pci_dev *pdev) |
3877 | { | 3866 | { |
3878 | struct net_device *dev = pci_get_drvdata(pdev); | 3867 | struct net_device *dev = pci_get_drvdata(pdev); |
3868 | struct rtl8169_private *tp = netdev_priv(dev); | ||
3869 | void __iomem *ioaddr = tp->mmio_addr; | ||
3879 | 3870 | ||
3880 | rtl8169_net_suspend(dev); | 3871 | rtl8169_net_suspend(dev); |
3881 | 3872 | ||
3873 | spin_lock_irq(&tp->lock); | ||
3874 | |||
3875 | rtl8169_asic_down(ioaddr); | ||
3876 | |||
3877 | spin_unlock_irq(&tp->lock); | ||
3878 | |||
3882 | if (system_state == SYSTEM_POWER_OFF) { | 3879 | if (system_state == SYSTEM_POWER_OFF) { |
3883 | pci_wake_from_d3(pdev, true); | 3880 | pci_wake_from_d3(pdev, true); |
3884 | pci_set_power_state(pdev, PCI_D3hot); | 3881 | pci_set_power_state(pdev, PCI_D3hot); |
diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index e2247669a495..1f040e8a000b 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c | |||
@@ -1281,7 +1281,7 @@ static u16 sis190_default_phy(struct net_device *dev) | |||
1281 | else if (phy_lan) | 1281 | else if (phy_lan) |
1282 | phy_default = phy_lan; | 1282 | phy_default = phy_lan; |
1283 | else | 1283 | else |
1284 | phy_default = list_entry(&tp->first_phy, | 1284 | phy_default = list_first_entry(&tp->first_phy, |
1285 | struct sis190_phy, list); | 1285 | struct sis190_phy, list); |
1286 | } | 1286 | } |
1287 | 1287 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 6b5946fe8ae2..7681d28c53d7 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -50,7 +50,7 @@ | |||
50 | #include "sky2.h" | 50 | #include "sky2.h" |
51 | 51 | ||
52 | #define DRV_NAME "sky2" | 52 | #define DRV_NAME "sky2" |
53 | #define DRV_VERSION "1.22" | 53 | #define DRV_VERSION "1.23" |
54 | #define PFX DRV_NAME " " | 54 | #define PFX DRV_NAME " " |
55 | 55 | ||
56 | /* | 56 | /* |
@@ -65,9 +65,9 @@ | |||
65 | #define RX_DEF_PENDING RX_MAX_PENDING | 65 | #define RX_DEF_PENDING RX_MAX_PENDING |
66 | 66 | ||
67 | #define TX_RING_SIZE 512 | 67 | #define TX_RING_SIZE 512 |
68 | #define TX_DEF_PENDING (TX_RING_SIZE - 1) | 68 | #define TX_DEF_PENDING 128 |
69 | #define TX_MIN_PENDING 64 | ||
70 | #define MAX_SKB_TX_LE (4 + (sizeof(dma_addr_t)/sizeof(u32))*MAX_SKB_FRAGS) | 69 | #define MAX_SKB_TX_LE (4 + (sizeof(dma_addr_t)/sizeof(u32))*MAX_SKB_FRAGS) |
70 | #define TX_MIN_PENDING (MAX_SKB_TX_LE+1) | ||
71 | 71 | ||
72 | #define STATUS_RING_SIZE 2048 /* 2 ports * (TX + 2*RX) */ | 72 | #define STATUS_RING_SIZE 2048 /* 2 ports * (TX + 2*RX) */ |
73 | #define STATUS_LE_BYTES (STATUS_RING_SIZE*sizeof(struct sky2_status_le)) | 73 | #define STATUS_LE_BYTES (STATUS_RING_SIZE*sizeof(struct sky2_status_le)) |
@@ -1151,7 +1151,14 @@ stopped: | |||
1151 | 1151 | ||
1152 | /* reset the Rx prefetch unit */ | 1152 | /* reset the Rx prefetch unit */ |
1153 | sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); | 1153 | sky2_write32(hw, Y2_QADDR(rxq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); |
1154 | mmiowb(); | 1154 | |
1155 | /* Reset the RAM Buffer receive queue */ | ||
1156 | sky2_write8(hw, RB_ADDR(rxq, RB_CTRL), RB_RST_SET); | ||
1157 | |||
1158 | /* Reset Rx MAC FIFO */ | ||
1159 | sky2_write8(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), GMF_RST_SET); | ||
1160 | |||
1161 | sky2_read8(hw, B0_CTST); | ||
1155 | } | 1162 | } |
1156 | 1163 | ||
1157 | /* Clean out receive buffer area, assumes receiver hardware stopped */ | 1164 | /* Clean out receive buffer area, assumes receiver hardware stopped */ |
@@ -1169,6 +1176,7 @@ static void sky2_rx_clean(struct sky2_port *sky2) | |||
1169 | re->skb = NULL; | 1176 | re->skb = NULL; |
1170 | } | 1177 | } |
1171 | } | 1178 | } |
1179 | skb_queue_purge(&sky2->rx_recycle); | ||
1172 | } | 1180 | } |
1173 | 1181 | ||
1174 | /* Basic MII support */ | 1182 | /* Basic MII support */ |
@@ -1245,6 +1253,12 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp | |||
1245 | } | 1253 | } |
1246 | #endif | 1254 | #endif |
1247 | 1255 | ||
1256 | /* Amount of required worst case padding in rx buffer */ | ||
1257 | static inline unsigned sky2_rx_pad(const struct sky2_hw *hw) | ||
1258 | { | ||
1259 | return (hw->flags & SKY2_HW_RAM_BUFFER) ? 8 : 2; | ||
1260 | } | ||
1261 | |||
1248 | /* | 1262 | /* |
1249 | * Allocate an skb for receiving. If the MTU is large enough | 1263 | * Allocate an skb for receiving. If the MTU is large enough |
1250 | * make the skb non-linear with a fragment list of pages. | 1264 | * make the skb non-linear with a fragment list of pages. |
@@ -1254,6 +1268,13 @@ static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2) | |||
1254 | struct sk_buff *skb; | 1268 | struct sk_buff *skb; |
1255 | int i; | 1269 | int i; |
1256 | 1270 | ||
1271 | skb = __skb_dequeue(&sky2->rx_recycle); | ||
1272 | if (!skb) | ||
1273 | skb = netdev_alloc_skb(sky2->netdev, sky2->rx_data_size | ||
1274 | + sky2_rx_pad(sky2->hw)); | ||
1275 | if (!skb) | ||
1276 | goto nomem; | ||
1277 | |||
1257 | if (sky2->hw->flags & SKY2_HW_RAM_BUFFER) { | 1278 | if (sky2->hw->flags & SKY2_HW_RAM_BUFFER) { |
1258 | unsigned char *start; | 1279 | unsigned char *start; |
1259 | /* | 1280 | /* |
@@ -1262,18 +1283,10 @@ static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2) | |||
1262 | * The buffer returned from netdev_alloc_skb is | 1283 | * The buffer returned from netdev_alloc_skb is |
1263 | * aligned except if slab debugging is enabled. | 1284 | * aligned except if slab debugging is enabled. |
1264 | */ | 1285 | */ |
1265 | skb = netdev_alloc_skb(sky2->netdev, sky2->rx_data_size + 8); | ||
1266 | if (!skb) | ||
1267 | goto nomem; | ||
1268 | start = PTR_ALIGN(skb->data, 8); | 1286 | start = PTR_ALIGN(skb->data, 8); |
1269 | skb_reserve(skb, start - skb->data); | 1287 | skb_reserve(skb, start - skb->data); |
1270 | } else { | 1288 | } else |
1271 | skb = netdev_alloc_skb(sky2->netdev, | ||
1272 | sky2->rx_data_size + NET_IP_ALIGN); | ||
1273 | if (!skb) | ||
1274 | goto nomem; | ||
1275 | skb_reserve(skb, NET_IP_ALIGN); | 1289 | skb_reserve(skb, NET_IP_ALIGN); |
1276 | } | ||
1277 | 1290 | ||
1278 | for (i = 0; i < sky2->rx_nfrags; i++) { | 1291 | for (i = 0; i < sky2->rx_nfrags; i++) { |
1279 | struct page *page = alloc_page(GFP_ATOMIC); | 1292 | struct page *page = alloc_page(GFP_ATOMIC); |
@@ -1350,6 +1363,8 @@ static int sky2_rx_start(struct sky2_port *sky2) | |||
1350 | 1363 | ||
1351 | sky2->rx_data_size = size; | 1364 | sky2->rx_data_size = size; |
1352 | 1365 | ||
1366 | skb_queue_head_init(&sky2->rx_recycle); | ||
1367 | |||
1353 | /* Fill Rx ring */ | 1368 | /* Fill Rx ring */ |
1354 | for (i = 0; i < sky2->rx_pending; i++) { | 1369 | for (i = 0; i < sky2->rx_pending; i++) { |
1355 | re = sky2->rx_ring + i; | 1370 | re = sky2->rx_ring + i; |
@@ -1488,6 +1503,7 @@ static int sky2_up(struct net_device *dev) | |||
1488 | imask = sky2_read32(hw, B0_IMSK); | 1503 | imask = sky2_read32(hw, B0_IMSK); |
1489 | imask |= portirq_msk[port]; | 1504 | imask |= portirq_msk[port]; |
1490 | sky2_write32(hw, B0_IMSK, imask); | 1505 | sky2_write32(hw, B0_IMSK, imask); |
1506 | sky2_read32(hw, B0_IMSK); | ||
1491 | 1507 | ||
1492 | sky2_set_multicast(dev); | 1508 | sky2_set_multicast(dev); |
1493 | 1509 | ||
@@ -1756,14 +1772,22 @@ static void sky2_tx_complete(struct sky2_port *sky2, u16 done) | |||
1756 | } | 1772 | } |
1757 | 1773 | ||
1758 | if (le->ctrl & EOP) { | 1774 | if (le->ctrl & EOP) { |
1775 | struct sk_buff *skb = re->skb; | ||
1776 | |||
1759 | if (unlikely(netif_msg_tx_done(sky2))) | 1777 | if (unlikely(netif_msg_tx_done(sky2))) |
1760 | printk(KERN_DEBUG "%s: tx done %u\n", | 1778 | printk(KERN_DEBUG "%s: tx done %u\n", |
1761 | dev->name, idx); | 1779 | dev->name, idx); |
1762 | 1780 | ||
1763 | dev->stats.tx_packets++; | 1781 | dev->stats.tx_packets++; |
1764 | dev->stats.tx_bytes += re->skb->len; | 1782 | dev->stats.tx_bytes += skb->len; |
1783 | |||
1784 | if (skb_queue_len(&sky2->rx_recycle) < sky2->rx_pending | ||
1785 | && skb_recycle_check(skb, sky2->rx_data_size | ||
1786 | + sky2_rx_pad(sky2->hw))) | ||
1787 | __skb_queue_head(&sky2->rx_recycle, skb); | ||
1788 | else | ||
1789 | dev_kfree_skb_any(skb); | ||
1765 | 1790 | ||
1766 | dev_kfree_skb_any(re->skb); | ||
1767 | sky2->tx_next = RING_NEXT(idx, TX_RING_SIZE); | 1791 | sky2->tx_next = RING_NEXT(idx, TX_RING_SIZE); |
1768 | } | 1792 | } |
1769 | } | 1793 | } |
@@ -1805,10 +1829,10 @@ static int sky2_down(struct net_device *dev) | |||
1805 | imask = sky2_read32(hw, B0_IMSK); | 1829 | imask = sky2_read32(hw, B0_IMSK); |
1806 | imask &= ~portirq_msk[port]; | 1830 | imask &= ~portirq_msk[port]; |
1807 | sky2_write32(hw, B0_IMSK, imask); | 1831 | sky2_write32(hw, B0_IMSK, imask); |
1832 | sky2_read32(hw, B0_IMSK); | ||
1808 | 1833 | ||
1809 | synchronize_irq(hw->pdev->irq); | 1834 | /* Force flow control off */ |
1810 | 1835 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_PAUSE_OFF); | |
1811 | sky2_gmac_reset(hw, port); | ||
1812 | 1836 | ||
1813 | /* Stop transmitter */ | 1837 | /* Stop transmitter */ |
1814 | sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_STOP); | 1838 | sky2_write32(hw, Q_ADDR(txqaddr[port], Q_CSR), BMU_STOP); |
@@ -1821,9 +1845,6 @@ static int sky2_down(struct net_device *dev) | |||
1821 | ctrl &= ~(GM_GPCR_TX_ENA | GM_GPCR_RX_ENA); | 1845 | ctrl &= ~(GM_GPCR_TX_ENA | GM_GPCR_RX_ENA); |
1822 | gma_write16(hw, port, GM_GP_CTRL, ctrl); | 1846 | gma_write16(hw, port, GM_GP_CTRL, ctrl); |
1823 | 1847 | ||
1824 | /* Make sure no packets are pending */ | ||
1825 | napi_synchronize(&hw->napi); | ||
1826 | |||
1827 | sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); | 1848 | sky2_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); |
1828 | 1849 | ||
1829 | /* Workaround shared GMAC reset */ | 1850 | /* Workaround shared GMAC reset */ |
@@ -1854,6 +1875,15 @@ static int sky2_down(struct net_device *dev) | |||
1854 | sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET); | 1875 | sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET); |
1855 | sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET); | 1876 | sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_SET); |
1856 | 1877 | ||
1878 | /* Force any delayed status interrrupt and NAPI */ | ||
1879 | sky2_write32(hw, STAT_LEV_TIMER_CNT, 0); | ||
1880 | sky2_write32(hw, STAT_TX_TIMER_CNT, 0); | ||
1881 | sky2_write32(hw, STAT_ISR_TIMER_CNT, 0); | ||
1882 | sky2_read8(hw, STAT_ISR_TIMER_CTRL); | ||
1883 | |||
1884 | synchronize_irq(hw->pdev->irq); | ||
1885 | napi_synchronize(&hw->napi); | ||
1886 | |||
1857 | sky2_phy_power_down(hw, port); | 1887 | sky2_phy_power_down(hw, port); |
1858 | 1888 | ||
1859 | /* turn off LED's */ | 1889 | /* turn off LED's */ |
@@ -2343,11 +2373,45 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last) | |||
2343 | } | 2373 | } |
2344 | } | 2374 | } |
2345 | 2375 | ||
2376 | static inline void sky2_skb_rx(const struct sky2_port *sky2, | ||
2377 | u32 status, struct sk_buff *skb) | ||
2378 | { | ||
2379 | #ifdef SKY2_VLAN_TAG_USED | ||
2380 | u16 vlan_tag = be16_to_cpu(sky2->rx_tag); | ||
2381 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) { | ||
2382 | if (skb->ip_summed == CHECKSUM_NONE) | ||
2383 | vlan_hwaccel_receive_skb(skb, sky2->vlgrp, vlan_tag); | ||
2384 | else | ||
2385 | vlan_gro_receive(&sky2->hw->napi, sky2->vlgrp, | ||
2386 | vlan_tag, skb); | ||
2387 | return; | ||
2388 | } | ||
2389 | #endif | ||
2390 | if (skb->ip_summed == CHECKSUM_NONE) | ||
2391 | netif_receive_skb(skb); | ||
2392 | else | ||
2393 | napi_gro_receive(&sky2->hw->napi, skb); | ||
2394 | } | ||
2395 | |||
2396 | static inline void sky2_rx_done(struct sky2_hw *hw, unsigned port, | ||
2397 | unsigned packets, unsigned bytes) | ||
2398 | { | ||
2399 | if (packets) { | ||
2400 | struct net_device *dev = hw->dev[port]; | ||
2401 | |||
2402 | dev->stats.rx_packets += packets; | ||
2403 | dev->stats.rx_bytes += bytes; | ||
2404 | dev->last_rx = jiffies; | ||
2405 | sky2_rx_update(netdev_priv(dev), rxqaddr[port]); | ||
2406 | } | ||
2407 | } | ||
2408 | |||
2346 | /* Process status response ring */ | 2409 | /* Process status response ring */ |
2347 | static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | 2410 | static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) |
2348 | { | 2411 | { |
2349 | int work_done = 0; | 2412 | int work_done = 0; |
2350 | unsigned rx[2] = { 0, 0 }; | 2413 | unsigned int total_bytes[2] = { 0 }; |
2414 | unsigned int total_packets[2] = { 0 }; | ||
2351 | 2415 | ||
2352 | rmb(); | 2416 | rmb(); |
2353 | do { | 2417 | do { |
@@ -2374,7 +2438,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
2374 | le->opcode = 0; | 2438 | le->opcode = 0; |
2375 | switch (opcode & ~HW_OWNER) { | 2439 | switch (opcode & ~HW_OWNER) { |
2376 | case OP_RXSTAT: | 2440 | case OP_RXSTAT: |
2377 | ++rx[port]; | 2441 | total_packets[port]++; |
2442 | total_bytes[port] += length; | ||
2378 | skb = sky2_receive(dev, length, status); | 2443 | skb = sky2_receive(dev, length, status); |
2379 | if (unlikely(!skb)) { | 2444 | if (unlikely(!skb)) { |
2380 | dev->stats.rx_dropped++; | 2445 | dev->stats.rx_dropped++; |
@@ -2392,18 +2457,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
2392 | } | 2457 | } |
2393 | 2458 | ||
2394 | skb->protocol = eth_type_trans(skb, dev); | 2459 | skb->protocol = eth_type_trans(skb, dev); |
2395 | dev->stats.rx_packets++; | ||
2396 | dev->stats.rx_bytes += skb->len; | ||
2397 | dev->last_rx = jiffies; | ||
2398 | 2460 | ||
2399 | #ifdef SKY2_VLAN_TAG_USED | 2461 | sky2_skb_rx(sky2, status, skb); |
2400 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) { | ||
2401 | vlan_hwaccel_receive_skb(skb, | ||
2402 | sky2->vlgrp, | ||
2403 | be16_to_cpu(sky2->rx_tag)); | ||
2404 | } else | ||
2405 | #endif | ||
2406 | netif_receive_skb(skb); | ||
2407 | 2462 | ||
2408 | /* Stop after net poll weight */ | 2463 | /* Stop after net poll weight */ |
2409 | if (++work_done >= to_do) | 2464 | if (++work_done >= to_do) |
@@ -2473,11 +2528,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
2473 | sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); | 2528 | sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ); |
2474 | 2529 | ||
2475 | exit_loop: | 2530 | exit_loop: |
2476 | if (rx[0]) | 2531 | sky2_rx_done(hw, 0, total_packets[0], total_bytes[0]); |
2477 | sky2_rx_update(netdev_priv(hw->dev[0]), Q_R1); | 2532 | sky2_rx_done(hw, 1, total_packets[1], total_bytes[1]); |
2478 | |||
2479 | if (rx[1]) | ||
2480 | sky2_rx_update(netdev_priv(hw->dev[1]), Q_R2); | ||
2481 | 2533 | ||
2482 | return work_done; | 2534 | return work_done; |
2483 | } | 2535 | } |
@@ -4364,6 +4416,22 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4364 | goto err_out; | 4416 | goto err_out; |
4365 | } | 4417 | } |
4366 | 4418 | ||
4419 | /* Get configuration information | ||
4420 | * Note: only regular PCI config access once to test for HW issues | ||
4421 | * other PCI access through shared memory for speed and to | ||
4422 | * avoid MMCONFIG problems. | ||
4423 | */ | ||
4424 | err = pci_read_config_dword(pdev, PCI_DEV_REG2, ®); | ||
4425 | if (err) { | ||
4426 | dev_err(&pdev->dev, "PCI read config failed\n"); | ||
4427 | goto err_out; | ||
4428 | } | ||
4429 | |||
4430 | if (~reg == 0) { | ||
4431 | dev_err(&pdev->dev, "PCI configuration read error\n"); | ||
4432 | goto err_out; | ||
4433 | } | ||
4434 | |||
4367 | err = pci_request_regions(pdev, DRV_NAME); | 4435 | err = pci_request_regions(pdev, DRV_NAME); |
4368 | if (err) { | 4436 | if (err) { |
4369 | dev_err(&pdev->dev, "cannot obtain PCI resources\n"); | 4437 | dev_err(&pdev->dev, "cannot obtain PCI resources\n"); |
@@ -4389,21 +4457,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4389 | } | 4457 | } |
4390 | } | 4458 | } |
4391 | 4459 | ||
4392 | /* Get configuration information | ||
4393 | * Note: only regular PCI config access once to test for HW issues | ||
4394 | * other PCI access through shared memory for speed and to | ||
4395 | * avoid MMCONFIG problems. | ||
4396 | */ | ||
4397 | err = pci_read_config_dword(pdev, PCI_DEV_REG2, ®); | ||
4398 | if (err) { | ||
4399 | dev_err(&pdev->dev, "PCI read config failed\n"); | ||
4400 | goto err_out_free_regions; | ||
4401 | } | ||
4402 | |||
4403 | /* size of available VPD, only impact sysfs */ | ||
4404 | err = pci_vpd_truncate(pdev, 1ul << (((reg & PCI_VPD_ROM_SZ) >> 14) + 8)); | ||
4405 | if (err) | ||
4406 | dev_warn(&pdev->dev, "Can't set VPD size\n"); | ||
4407 | 4460 | ||
4408 | #ifdef __BIG_ENDIAN | 4461 | #ifdef __BIG_ENDIAN |
4409 | /* The sk98lin vendor driver uses hardware byte swapping but | 4462 | /* The sk98lin vendor driver uses hardware byte swapping but |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 92fb24b27d45..b5549c9e5107 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -2028,6 +2028,7 @@ struct sky2_port { | |||
2028 | u16 rx_pending; | 2028 | u16 rx_pending; |
2029 | u16 rx_data_size; | 2029 | u16 rx_data_size; |
2030 | u16 rx_nfrags; | 2030 | u16 rx_nfrags; |
2031 | struct sk_buff_head rx_recycle; | ||
2031 | 2032 | ||
2032 | #ifdef SKY2_VLAN_TAG_USED | 2033 | #ifdef SKY2_VLAN_TAG_USED |
2033 | u16 rx_tag; | 2034 | u16 rx_tag; |
diff --git a/drivers/net/sonic.c b/drivers/net/sonic.c index e4255d829380..753a1fba4609 100644 --- a/drivers/net/sonic.c +++ b/drivers/net/sonic.c | |||
@@ -223,7 +223,7 @@ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
223 | if (!laddr) { | 223 | if (!laddr) { |
224 | printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); | 224 | printk(KERN_ERR "%s: failed to map tx DMA buffer.\n", dev->name); |
225 | dev_kfree_skb(skb); | 225 | dev_kfree_skb(skb); |
226 | return NETDEV_TX_BUSY | 226 | return NETDEV_TX_BUSY; |
227 | } | 227 | } |
228 | 228 | ||
229 | sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ | 229 | sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0); /* clear status */ |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index e2f2e91cfdd2..40c6eba775ce 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -65,8 +65,6 @@ | |||
65 | 65 | ||
66 | static DEFINE_SPINLOCK(ugeth_lock); | 66 | static DEFINE_SPINLOCK(ugeth_lock); |
67 | 67 | ||
68 | static void uec_configure_serdes(struct net_device *dev); | ||
69 | |||
70 | static struct { | 68 | static struct { |
71 | u32 msg_enable; | 69 | u32 msg_enable; |
72 | } debug = { -1 }; | 70 | } debug = { -1 }; |
@@ -1536,6 +1534,49 @@ static void adjust_link(struct net_device *dev) | |||
1536 | spin_unlock_irqrestore(&ugeth->lock, flags); | 1534 | spin_unlock_irqrestore(&ugeth->lock, flags); |
1537 | } | 1535 | } |
1538 | 1536 | ||
1537 | /* Initialize TBI PHY interface for communicating with the | ||
1538 | * SERDES lynx PHY on the chip. We communicate with this PHY | ||
1539 | * through the MDIO bus on each controller, treating it as a | ||
1540 | * "normal" PHY at the address found in the UTBIPA register. We assume | ||
1541 | * that the UTBIPA register is valid. Either the MDIO bus code will set | ||
1542 | * it to a value that doesn't conflict with other PHYs on the bus, or the | ||
1543 | * value doesn't matter, as there are no other PHYs on the bus. | ||
1544 | */ | ||
1545 | static void uec_configure_serdes(struct net_device *dev) | ||
1546 | { | ||
1547 | struct ucc_geth_private *ugeth = netdev_priv(dev); | ||
1548 | struct ucc_geth_info *ug_info = ugeth->ug_info; | ||
1549 | struct phy_device *tbiphy; | ||
1550 | |||
1551 | if (!ug_info->tbi_node) { | ||
1552 | dev_warn(&dev->dev, "SGMII mode requires that the device " | ||
1553 | "tree specify a tbi-handle\n"); | ||
1554 | return; | ||
1555 | } | ||
1556 | |||
1557 | tbiphy = of_phy_find_device(ug_info->tbi_node); | ||
1558 | if (!tbiphy) { | ||
1559 | dev_err(&dev->dev, "error: Could not get TBI device\n"); | ||
1560 | return; | ||
1561 | } | ||
1562 | |||
1563 | /* | ||
1564 | * If the link is already up, we must already be ok, and don't need to | ||
1565 | * configure and reset the TBI<->SerDes link. Maybe U-Boot configured | ||
1566 | * everything for us? Resetting it takes the link down and requires | ||
1567 | * several seconds for it to come back. | ||
1568 | */ | ||
1569 | if (phy_read(tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) | ||
1570 | return; | ||
1571 | |||
1572 | /* Single clk mode, mii mode off(for serdes communication) */ | ||
1573 | phy_write(tbiphy, ENET_TBI_MII_ANA, TBIANA_SETTINGS); | ||
1574 | |||
1575 | phy_write(tbiphy, ENET_TBI_MII_TBICON, TBICON_CLK_SELECT); | ||
1576 | |||
1577 | phy_write(tbiphy, ENET_TBI_MII_CR, TBICR_SETTINGS); | ||
1578 | } | ||
1579 | |||
1539 | /* Configure the PHY for dev. | 1580 | /* Configure the PHY for dev. |
1540 | * returns 0 if success. -1 if failure | 1581 | * returns 0 if success. -1 if failure |
1541 | */ | 1582 | */ |
@@ -1577,41 +1618,7 @@ static int init_phy(struct net_device *dev) | |||
1577 | return 0; | 1618 | return 0; |
1578 | } | 1619 | } |
1579 | 1620 | ||
1580 | /* Initialize TBI PHY interface for communicating with the | ||
1581 | * SERDES lynx PHY on the chip. We communicate with this PHY | ||
1582 | * through the MDIO bus on each controller, treating it as a | ||
1583 | * "normal" PHY at the address found in the UTBIPA register. We assume | ||
1584 | * that the UTBIPA register is valid. Either the MDIO bus code will set | ||
1585 | * it to a value that doesn't conflict with other PHYs on the bus, or the | ||
1586 | * value doesn't matter, as there are no other PHYs on the bus. | ||
1587 | */ | ||
1588 | static void uec_configure_serdes(struct net_device *dev) | ||
1589 | { | ||
1590 | struct ucc_geth_private *ugeth = netdev_priv(dev); | ||
1591 | |||
1592 | if (!ugeth->tbiphy) { | ||
1593 | printk(KERN_WARNING "SGMII mode requires that the device " | ||
1594 | "tree specify a tbi-handle\n"); | ||
1595 | return; | ||
1596 | } | ||
1597 | 1621 | ||
1598 | /* | ||
1599 | * If the link is already up, we must already be ok, and don't need to | ||
1600 | * configure and reset the TBI<->SerDes link. Maybe U-Boot configured | ||
1601 | * everything for us? Resetting it takes the link down and requires | ||
1602 | * several seconds for it to come back. | ||
1603 | */ | ||
1604 | if (phy_read(ugeth->tbiphy, ENET_TBI_MII_SR) & TBISR_LSTATUS) | ||
1605 | return; | ||
1606 | |||
1607 | /* Single clk mode, mii mode off(for serdes communication) */ | ||
1608 | phy_write(ugeth->tbiphy, ENET_TBI_MII_ANA, TBIANA_SETTINGS); | ||
1609 | |||
1610 | phy_write(ugeth->tbiphy, ENET_TBI_MII_TBICON, TBICON_CLK_SELECT); | ||
1611 | |||
1612 | phy_write(ugeth->tbiphy, ENET_TBI_MII_CR, TBICR_SETTINGS); | ||
1613 | |||
1614 | } | ||
1615 | 1622 | ||
1616 | static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth) | 1623 | static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth) |
1617 | { | 1624 | { |
@@ -3711,6 +3718,9 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3711 | } | 3718 | } |
3712 | ug_info->phy_node = phy; | 3719 | ug_info->phy_node = phy; |
3713 | 3720 | ||
3721 | /* Find the TBI PHY node. If it's not there, we don't support SGMII */ | ||
3722 | ug_info->tbi_node = of_parse_phandle(np, "tbi-handle", 0); | ||
3723 | |||
3714 | /* get the phy interface type, or default to MII */ | 3724 | /* get the phy interface type, or default to MII */ |
3715 | prop = of_get_property(np, "phy-connection-type", NULL); | 3725 | prop = of_get_property(np, "phy-connection-type", NULL); |
3716 | if (!prop) { | 3726 | if (!prop) { |
@@ -3818,37 +3828,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3818 | ugeth->ndev = dev; | 3828 | ugeth->ndev = dev; |
3819 | ugeth->node = np; | 3829 | ugeth->node = np; |
3820 | 3830 | ||
3821 | /* Find the TBI PHY. If it's not there, we don't support SGMII */ | ||
3822 | ph = of_get_property(np, "tbi-handle", NULL); | ||
3823 | if (ph) { | ||
3824 | struct device_node *tbi = of_find_node_by_phandle(*ph); | ||
3825 | struct of_device *ofdev; | ||
3826 | struct mii_bus *bus; | ||
3827 | const unsigned int *id; | ||
3828 | |||
3829 | if (!tbi) | ||
3830 | return 0; | ||
3831 | |||
3832 | mdio = of_get_parent(tbi); | ||
3833 | if (!mdio) | ||
3834 | return 0; | ||
3835 | |||
3836 | ofdev = of_find_device_by_node(mdio); | ||
3837 | |||
3838 | of_node_put(mdio); | ||
3839 | |||
3840 | id = of_get_property(tbi, "reg", NULL); | ||
3841 | if (!id) | ||
3842 | return 0; | ||
3843 | of_node_put(tbi); | ||
3844 | |||
3845 | bus = dev_get_drvdata(&ofdev->dev); | ||
3846 | if (!bus) | ||
3847 | return 0; | ||
3848 | |||
3849 | ugeth->tbiphy = bus->phy_map[*id]; | ||
3850 | } | ||
3851 | |||
3852 | return 0; | 3831 | return 0; |
3853 | } | 3832 | } |
3854 | 3833 | ||
diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 5beba4c14532..195ab267ead7 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h | |||
@@ -1125,6 +1125,7 @@ struct ucc_geth_info { | |||
1125 | u16 pausePeriod; | 1125 | u16 pausePeriod; |
1126 | u16 extensionField; | 1126 | u16 extensionField; |
1127 | struct device_node *phy_node; | 1127 | struct device_node *phy_node; |
1128 | struct device_node *tbi_node; | ||
1128 | u8 weightfactor[NUM_TX_QUEUES]; | 1129 | u8 weightfactor[NUM_TX_QUEUES]; |
1129 | u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; | 1130 | u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES]; |
1130 | u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; | 1131 | u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; |
@@ -1213,7 +1214,6 @@ struct ucc_geth_private { | |||
1213 | 1214 | ||
1214 | struct ugeth_mii_info *mii_info; | 1215 | struct ugeth_mii_info *mii_info; |
1215 | struct phy_device *phydev; | 1216 | struct phy_device *phydev; |
1216 | struct phy_device *tbiphy; | ||
1217 | phy_interface_t phy_interface; | 1217 | phy_interface_t phy_interface; |
1218 | int max_speed; | 1218 | int max_speed; |
1219 | uint32_t msg_enable; | 1219 | uint32_t msg_enable; |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index e2a7725e567e..b02f7adff5dc 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
@@ -989,8 +989,10 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi | |||
989 | if (ret < 0) | 989 | if (ret < 0) |
990 | goto err_iounmap; | 990 | goto err_iounmap; |
991 | 991 | ||
992 | if (velocity_get_link(dev)) | 992 | if (!velocity_get_link(dev)) { |
993 | netif_carrier_off(dev); | 993 | netif_carrier_off(dev); |
994 | vptr->mii_status |= VELOCITY_LINK_FAIL; | ||
995 | } | ||
994 | 996 | ||
995 | velocity_print_info(vptr); | 997 | velocity_print_info(vptr); |
996 | pci_set_drvdata(pdev, dev); | 998 | pci_set_drvdata(pdev, dev); |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 52198f6797a4..2a6e81d5b579 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -709,7 +709,7 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
709 | allmulti ? "en" : "dis"); | 709 | allmulti ? "en" : "dis"); |
710 | 710 | ||
711 | /* MAC filter - use one buffer for both lists */ | 711 | /* MAC filter - use one buffer for both lists */ |
712 | mac_data = buf = kzalloc(((dev->uc_count + dev->mc_count) * ETH_ALEN) + | 712 | mac_data = buf = kzalloc(((dev->uc.count + dev->mc_count) * ETH_ALEN) + |
713 | (2 * sizeof(mac_data->entries)), GFP_ATOMIC); | 713 | (2 * sizeof(mac_data->entries)), GFP_ATOMIC); |
714 | if (!buf) { | 714 | if (!buf) { |
715 | dev_warn(&dev->dev, "No memory for MAC address buffer\n"); | 715 | dev_warn(&dev->dev, "No memory for MAC address buffer\n"); |
@@ -719,16 +719,16 @@ static void virtnet_set_rx_mode(struct net_device *dev) | |||
719 | sg_init_table(sg, 2); | 719 | sg_init_table(sg, 2); |
720 | 720 | ||
721 | /* Store the unicast list and count in the front of the buffer */ | 721 | /* Store the unicast list and count in the front of the buffer */ |
722 | mac_data->entries = dev->uc_count; | 722 | mac_data->entries = dev->uc.count; |
723 | i = 0; | 723 | i = 0; |
724 | list_for_each_entry(ha, &dev->uc_list, list) | 724 | list_for_each_entry(ha, &dev->uc.list, list) |
725 | memcpy(&mac_data->macs[i++][0], ha->addr, ETH_ALEN); | 725 | memcpy(&mac_data->macs[i++][0], ha->addr, ETH_ALEN); |
726 | 726 | ||
727 | sg_set_buf(&sg[0], mac_data, | 727 | sg_set_buf(&sg[0], mac_data, |
728 | sizeof(mac_data->entries) + (dev->uc_count * ETH_ALEN)); | 728 | sizeof(mac_data->entries) + (dev->uc.count * ETH_ALEN)); |
729 | 729 | ||
730 | /* multicast list and count fill the end */ | 730 | /* multicast list and count fill the end */ |
731 | mac_data = (void *)&mac_data->macs[dev->uc_count][0]; | 731 | mac_data = (void *)&mac_data->macs[dev->uc.count][0]; |
732 | 732 | ||
733 | mac_data->entries = dev->mc_count; | 733 | mac_data->entries = dev->mc_count; |
734 | addr = dev->mc_list; | 734 | addr = dev->mc_list; |
diff --git a/drivers/net/vxge/vxge-config.c b/drivers/net/vxge/vxge-config.c index 26cde573af43..58d2551c78ed 100644 --- a/drivers/net/vxge/vxge-config.c +++ b/drivers/net/vxge/vxge-config.c | |||
@@ -454,7 +454,7 @@ __vxge_hw_verify_pci_e_info(struct __vxge_hw_device *hldev) | |||
454 | return VXGE_HW_OK; | 454 | return VXGE_HW_OK; |
455 | } | 455 | } |
456 | 456 | ||
457 | static enum vxge_hw_status | 457 | enum vxge_hw_status |
458 | __vxge_hw_device_is_privilaged(struct __vxge_hw_device *hldev) | 458 | __vxge_hw_device_is_privilaged(struct __vxge_hw_device *hldev) |
459 | { | 459 | { |
460 | if ((hldev->host_type == VXGE_HW_NO_MR_NO_SR_NORMAL_FUNCTION || | 460 | if ((hldev->host_type == VXGE_HW_NO_MR_NO_SR_NORMAL_FUNCTION || |
@@ -676,10 +676,12 @@ enum vxge_hw_status __vxge_hw_device_initialize(struct __vxge_hw_device *hldev) | |||
676 | { | 676 | { |
677 | enum vxge_hw_status status = VXGE_HW_OK; | 677 | enum vxge_hw_status status = VXGE_HW_OK; |
678 | 678 | ||
679 | /* Validate the pci-e link width and speed */ | 679 | if (VXGE_HW_OK == __vxge_hw_device_is_privilaged(hldev)) { |
680 | status = __vxge_hw_verify_pci_e_info(hldev); | 680 | /* Validate the pci-e link width and speed */ |
681 | if (status != VXGE_HW_OK) | 681 | status = __vxge_hw_verify_pci_e_info(hldev); |
682 | goto exit; | 682 | if (status != VXGE_HW_OK) |
683 | goto exit; | ||
684 | } | ||
683 | 685 | ||
684 | vxge_hw_wrr_rebalance(hldev); | 686 | vxge_hw_wrr_rebalance(hldev); |
685 | exit: | 687 | exit: |
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index 6c838b3e063a..6034497536a4 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c | |||
@@ -4203,6 +4203,16 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
4203 | max_vpath_supported++; | 4203 | max_vpath_supported++; |
4204 | } | 4204 | } |
4205 | 4205 | ||
4206 | /* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */ | ||
4207 | if ((VXGE_HW_FUNCTION_MODE_SRIOV == | ||
4208 | ll_config.device_hw_info.function_mode) && | ||
4209 | (max_config_dev > 1) && (pdev->is_physfn)) { | ||
4210 | ret = pci_enable_sriov(pdev, max_config_dev - 1); | ||
4211 | if (ret) | ||
4212 | vxge_debug_ll_config(VXGE_ERR, | ||
4213 | "Failed to enable SRIOV: %d \n", ret); | ||
4214 | } | ||
4215 | |||
4206 | /* | 4216 | /* |
4207 | * Configure vpaths and get driver configured number of vpaths | 4217 | * Configure vpaths and get driver configured number of vpaths |
4208 | * which is less than or equal to the maximum vpaths per function. | 4218 | * which is less than or equal to the maximum vpaths per function. |
@@ -4366,6 +4376,7 @@ _exit6: | |||
4366 | 4376 | ||
4367 | vxge_device_unregister(hldev); | 4377 | vxge_device_unregister(hldev); |
4368 | _exit5: | 4378 | _exit5: |
4379 | pci_disable_sriov(pdev); | ||
4369 | vxge_hw_device_terminate(hldev); | 4380 | vxge_hw_device_terminate(hldev); |
4370 | _exit4: | 4381 | _exit4: |
4371 | iounmap(attr.bar1); | 4382 | iounmap(attr.bar1); |
@@ -4429,6 +4440,8 @@ vxge_remove(struct pci_dev *pdev) | |||
4429 | iounmap(vdev->bar0); | 4440 | iounmap(vdev->bar0); |
4430 | iounmap(vdev->bar1); | 4441 | iounmap(vdev->bar1); |
4431 | 4442 | ||
4443 | pci_disable_sriov(pdev); | ||
4444 | |||
4432 | /* we are safe to free it now */ | 4445 | /* we are safe to free it now */ |
4433 | free_netdev(dev); | 4446 | free_netdev(dev); |
4434 | 4447 | ||
diff --git a/drivers/net/vxge/vxge-version.h b/drivers/net/vxge/vxge-version.h index 7da02c545ed5..82786ffb7dd9 100644 --- a/drivers/net/vxge/vxge-version.h +++ b/drivers/net/vxge/vxge-version.h | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | #define VXGE_VERSION_MAJOR "2" | 18 | #define VXGE_VERSION_MAJOR "2" |
19 | #define VXGE_VERSION_MINOR "0" | 19 | #define VXGE_VERSION_MINOR "0" |
20 | #define VXGE_VERSION_FIX "1" | 20 | #define VXGE_VERSION_FIX "4" |
21 | #define VXGE_VERSION_BUILD "17129" | 21 | #define VXGE_VERSION_BUILD "17795" |
22 | #define VXGE_VERSION_FOR "k" | 22 | #define VXGE_VERSION_FOR "k" |
23 | #endif | 23 | #endif |
diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c index 2dd78d20eb05..aff4f6bdf3d5 100644 --- a/drivers/net/wan/lapbether.c +++ b/drivers/net/wan/lapbether.c | |||
@@ -149,46 +149,40 @@ static int lapbeth_data_indication(struct net_device *dev, struct sk_buff *skb) | |||
149 | */ | 149 | */ |
150 | static int lapbeth_xmit(struct sk_buff *skb, struct net_device *dev) | 150 | static int lapbeth_xmit(struct sk_buff *skb, struct net_device *dev) |
151 | { | 151 | { |
152 | int err = -ENODEV; | 152 | int err; |
153 | 153 | ||
154 | /* | 154 | /* |
155 | * Just to be *really* sure not to send anything if the interface | 155 | * Just to be *really* sure not to send anything if the interface |
156 | * is down, the ethernet device may have gone. | 156 | * is down, the ethernet device may have gone. |
157 | */ | 157 | */ |
158 | if (!netif_running(dev)) { | 158 | if (!netif_running(dev)) |
159 | goto drop; | 159 | goto drop; |
160 | } | ||
161 | 160 | ||
162 | switch (skb->data[0]) { | 161 | switch (skb->data[0]) { |
163 | case 0x00: | 162 | case 0x00: |
164 | err = 0; | ||
165 | break; | 163 | break; |
166 | case 0x01: | 164 | case 0x01: |
167 | if ((err = lapb_connect_request(dev)) != LAPB_OK) | 165 | if ((err = lapb_connect_request(dev)) != LAPB_OK) |
168 | printk(KERN_ERR "lapbeth: lapb_connect_request " | 166 | printk(KERN_ERR "lapbeth: lapb_connect_request " |
169 | "error: %d\n", err); | 167 | "error: %d\n", err); |
170 | goto drop_ok; | 168 | goto drop; |
171 | case 0x02: | 169 | case 0x02: |
172 | if ((err = lapb_disconnect_request(dev)) != LAPB_OK) | 170 | if ((err = lapb_disconnect_request(dev)) != LAPB_OK) |
173 | printk(KERN_ERR "lapbeth: lapb_disconnect_request " | 171 | printk(KERN_ERR "lapbeth: lapb_disconnect_request " |
174 | "err: %d\n", err); | 172 | "err: %d\n", err); |
175 | /* Fall thru */ | 173 | /* Fall thru */ |
176 | default: | 174 | default: |
177 | goto drop_ok; | 175 | goto drop; |
178 | } | 176 | } |
179 | 177 | ||
180 | skb_pull(skb, 1); | 178 | skb_pull(skb, 1); |
181 | 179 | ||
182 | if ((err = lapb_data_request(dev, skb)) != LAPB_OK) { | 180 | if ((err = lapb_data_request(dev, skb)) != LAPB_OK) { |
183 | printk(KERN_ERR "lapbeth: lapb_data_request error - %d\n", err); | 181 | printk(KERN_ERR "lapbeth: lapb_data_request error - %d\n", err); |
184 | err = -ENOMEM; | ||
185 | goto drop; | 182 | goto drop; |
186 | } | 183 | } |
187 | err = 0; | ||
188 | out: | 184 | out: |
189 | return err; | 185 | return NETDEV_TX_OK; |
190 | drop_ok: | ||
191 | err = 0; | ||
192 | drop: | 186 | drop: |
193 | kfree_skb(skb); | 187 | kfree_skb(skb); |
194 | goto out; | 188 | goto out; |
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c index ec35503f6a40..2942f13c9c4a 100644 --- a/drivers/net/wireless/ath/ath5k/pcu.c +++ b/drivers/net/wireless/ath/ath5k/pcu.c | |||
@@ -733,8 +733,9 @@ void ath5k_hw_init_beacon(struct ath5k_hw *ah, u32 next_beacon, u32 interval) | |||
733 | /* | 733 | /* |
734 | * Set the beacon register and enable all timers. | 734 | * Set the beacon register and enable all timers. |
735 | */ | 735 | */ |
736 | /* When in AP mode zero timer0 to start TSF */ | 736 | /* When in AP or Mesh Point mode zero timer0 to start TSF */ |
737 | if (ah->ah_op_mode == NL80211_IFTYPE_AP) | 737 | if (ah->ah_op_mode == NL80211_IFTYPE_AP || |
738 | ah->ah_op_mode == NL80211_IFTYPE_MESH_POINT) | ||
738 | ath5k_hw_reg_write(ah, 0, AR5K_TIMER0); | 739 | ath5k_hw_reg_write(ah, 0, AR5K_TIMER0); |
739 | 740 | ||
740 | ath5k_hw_reg_write(ah, next_beacon, AR5K_TIMER0); | 741 | ath5k_hw_reg_write(ah, next_beacon, AR5K_TIMER0); |
diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig index 0ed1ac312aa6..2d79610bce12 100644 --- a/drivers/net/wireless/ath/ath9k/Kconfig +++ b/drivers/net/wireless/ath/ath9k/Kconfig | |||
@@ -1,7 +1,6 @@ | |||
1 | config ATH9K | 1 | config ATH9K |
2 | tristate "Atheros 802.11n wireless cards support" | 2 | tristate "Atheros 802.11n wireless cards support" |
3 | depends on PCI && MAC80211 && WLAN_80211 | 3 | depends on PCI && MAC80211 && WLAN_80211 |
4 | depends on RFKILL || RFKILL=n | ||
5 | select ATH_COMMON | 4 | select ATH_COMMON |
6 | select MAC80211_LEDS | 5 | select MAC80211_LEDS |
7 | select LEDS_CLASS | 6 | select LEDS_CLASS |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 515880aa2116..5efc9345ca0d 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/device.h> | 21 | #include <linux/device.h> |
22 | #include <net/mac80211.h> | 22 | #include <net/mac80211.h> |
23 | #include <linux/leds.h> | 23 | #include <linux/leds.h> |
24 | #include <linux/rfkill.h> | ||
25 | 24 | ||
26 | #include "hw.h" | 25 | #include "hw.h" |
27 | #include "rc.h" | 26 | #include "rc.h" |
@@ -460,12 +459,6 @@ struct ath_led { | |||
460 | bool registered; | 459 | bool registered; |
461 | }; | 460 | }; |
462 | 461 | ||
463 | struct ath_rfkill { | ||
464 | struct rfkill *rfkill; | ||
465 | struct rfkill_ops ops; | ||
466 | char rfkill_name[32]; | ||
467 | }; | ||
468 | |||
469 | /********************/ | 462 | /********************/ |
470 | /* Main driver core */ | 463 | /* Main driver core */ |
471 | /********************/ | 464 | /********************/ |
@@ -505,7 +498,6 @@ struct ath_rfkill { | |||
505 | #define SC_OP_PROTECT_ENABLE BIT(6) | 498 | #define SC_OP_PROTECT_ENABLE BIT(6) |
506 | #define SC_OP_RXFLUSH BIT(7) | 499 | #define SC_OP_RXFLUSH BIT(7) |
507 | #define SC_OP_LED_ASSOCIATED BIT(8) | 500 | #define SC_OP_LED_ASSOCIATED BIT(8) |
508 | #define SC_OP_RFKILL_REGISTERED BIT(9) | ||
509 | #define SC_OP_WAIT_FOR_BEACON BIT(12) | 501 | #define SC_OP_WAIT_FOR_BEACON BIT(12) |
510 | #define SC_OP_LED_ON BIT(13) | 502 | #define SC_OP_LED_ON BIT(13) |
511 | #define SC_OP_SCANNING BIT(14) | 503 | #define SC_OP_SCANNING BIT(14) |
@@ -591,7 +583,6 @@ struct ath_softc { | |||
591 | 583 | ||
592 | int beacon_interval; | 584 | int beacon_interval; |
593 | 585 | ||
594 | struct ath_rfkill rf_kill; | ||
595 | struct ath_ani ani; | 586 | struct ath_ani ani; |
596 | struct ath9k_node_stats nodestats; | 587 | struct ath9k_node_stats nodestats; |
597 | #ifdef CONFIG_ATH9K_DEBUG | 588 | #ifdef CONFIG_ATH9K_DEBUG |
@@ -677,6 +668,7 @@ static inline void ath9k_ps_restore(struct ath_softc *sc) | |||
677 | if (atomic_dec_and_test(&sc->ps_usecount)) | 668 | if (atomic_dec_and_test(&sc->ps_usecount)) |
678 | if ((sc->hw->conf.flags & IEEE80211_CONF_PS) && | 669 | if ((sc->hw->conf.flags & IEEE80211_CONF_PS) && |
679 | !(sc->sc_flags & (SC_OP_WAIT_FOR_BEACON | | 670 | !(sc->sc_flags & (SC_OP_WAIT_FOR_BEACON | |
671 | SC_OP_WAIT_FOR_CAB | | ||
680 | SC_OP_WAIT_FOR_PSPOLL_DATA | | 672 | SC_OP_WAIT_FOR_PSPOLL_DATA | |
681 | SC_OP_WAIT_FOR_TX_ACK))) | 673 | SC_OP_WAIT_FOR_TX_ACK))) |
682 | ath9k_hw_setpower(sc->sc_ah, | 674 | ath9k_hw_setpower(sc->sc_ah, |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 1579c9407ed5..34935a8ee59d 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -2186,6 +2186,18 @@ static void ath9k_hw_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan | |||
2186 | REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); | 2186 | REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); |
2187 | } | 2187 | } |
2188 | 2188 | ||
2189 | static void ath9k_enable_rfkill(struct ath_hw *ah) | ||
2190 | { | ||
2191 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, | ||
2192 | AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); | ||
2193 | |||
2194 | REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, | ||
2195 | AR_GPIO_INPUT_MUX2_RFSILENT); | ||
2196 | |||
2197 | ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); | ||
2198 | REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); | ||
2199 | } | ||
2200 | |||
2189 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | 2201 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, |
2190 | bool bChannelChange) | 2202 | bool bChannelChange) |
2191 | { | 2203 | { |
@@ -2313,10 +2325,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
2313 | ath9k_hw_init_interrupt_masks(ah, ah->opmode); | 2325 | ath9k_hw_init_interrupt_masks(ah, ah->opmode); |
2314 | ath9k_hw_init_qos(ah); | 2326 | ath9k_hw_init_qos(ah); |
2315 | 2327 | ||
2316 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
2317 | if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) | 2328 | if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) |
2318 | ath9k_enable_rfkill(ah); | 2329 | ath9k_enable_rfkill(ah); |
2319 | #endif | 2330 | |
2320 | ath9k_hw_init_user_settings(ah); | 2331 | ath9k_hw_init_user_settings(ah); |
2321 | 2332 | ||
2322 | REG_WRITE(ah, AR_STA_ID1, | 2333 | REG_WRITE(ah, AR_STA_ID1, |
@@ -3613,20 +3624,6 @@ void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val) | |||
3613 | AR_GPIO_BIT(gpio)); | 3624 | AR_GPIO_BIT(gpio)); |
3614 | } | 3625 | } |
3615 | 3626 | ||
3616 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
3617 | void ath9k_enable_rfkill(struct ath_hw *ah) | ||
3618 | { | ||
3619 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, | ||
3620 | AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); | ||
3621 | |||
3622 | REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, | ||
3623 | AR_GPIO_INPUT_MUX2_RFSILENT); | ||
3624 | |||
3625 | ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); | ||
3626 | REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); | ||
3627 | } | ||
3628 | #endif | ||
3629 | |||
3630 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah) | 3627 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah) |
3631 | { | 3628 | { |
3632 | return REG_READ(ah, AR_DEF_ANTENNA) & 0x7; | 3629 | return REG_READ(ah, AR_DEF_ANTENNA) & 0x7; |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index dd8508ef6e05..9d0b31ad4603 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -565,9 +565,6 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio); | |||
565 | void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio, | 565 | void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio, |
566 | u32 ah_signal_type); | 566 | u32 ah_signal_type); |
567 | void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val); | 567 | void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val); |
568 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
569 | void ath9k_enable_rfkill(struct ath_hw *ah); | ||
570 | #endif | ||
571 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah); | 568 | u32 ath9k_hw_getdefantenna(struct ath_hw *ah); |
572 | void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna); | 569 | void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna); |
573 | bool ath9k_hw_setantennaswitch(struct ath_hw *ah, | 570 | bool ath9k_hw_setantennaswitch(struct ath_hw *ah, |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index f7baa406918b..9f49a3251d4d 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -231,6 +231,19 @@ static void ath_setup_rates(struct ath_softc *sc, enum ieee80211_band band) | |||
231 | } | 231 | } |
232 | } | 232 | } |
233 | 233 | ||
234 | static struct ath9k_channel *ath_get_curchannel(struct ath_softc *sc, | ||
235 | struct ieee80211_hw *hw) | ||
236 | { | ||
237 | struct ieee80211_channel *curchan = hw->conf.channel; | ||
238 | struct ath9k_channel *channel; | ||
239 | u8 chan_idx; | ||
240 | |||
241 | chan_idx = curchan->hw_value; | ||
242 | channel = &sc->sc_ah->channels[chan_idx]; | ||
243 | ath9k_update_ichannel(sc, hw, channel); | ||
244 | return channel; | ||
245 | } | ||
246 | |||
234 | /* | 247 | /* |
235 | * Set/change channels. If the channel is really being changed, it's done | 248 | * Set/change channels. If the channel is really being changed, it's done |
236 | * by reseting the chip. To accomplish this we must first cleanup any pending | 249 | * by reseting the chip. To accomplish this we must first cleanup any pending |
@@ -283,7 +296,7 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, | |||
283 | "reset status %d\n", | 296 | "reset status %d\n", |
284 | channel->center_freq, r); | 297 | channel->center_freq, r); |
285 | spin_unlock_bh(&sc->sc_resetlock); | 298 | spin_unlock_bh(&sc->sc_resetlock); |
286 | return r; | 299 | goto ps_restore; |
287 | } | 300 | } |
288 | spin_unlock_bh(&sc->sc_resetlock); | 301 | spin_unlock_bh(&sc->sc_resetlock); |
289 | 302 | ||
@@ -292,14 +305,17 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, | |||
292 | if (ath_startrecv(sc) != 0) { | 305 | if (ath_startrecv(sc) != 0) { |
293 | DPRINTF(sc, ATH_DBG_FATAL, | 306 | DPRINTF(sc, ATH_DBG_FATAL, |
294 | "Unable to restart recv logic\n"); | 307 | "Unable to restart recv logic\n"); |
295 | return -EIO; | 308 | r = -EIO; |
309 | goto ps_restore; | ||
296 | } | 310 | } |
297 | 311 | ||
298 | ath_cache_conf_rate(sc, &hw->conf); | 312 | ath_cache_conf_rate(sc, &hw->conf); |
299 | ath_update_txpow(sc); | 313 | ath_update_txpow(sc); |
300 | ath9k_hw_set_interrupts(ah, sc->imask); | 314 | ath9k_hw_set_interrupts(ah, sc->imask); |
315 | |||
316 | ps_restore: | ||
301 | ath9k_ps_restore(sc); | 317 | ath9k_ps_restore(sc); |
302 | return 0; | 318 | return r; |
303 | } | 319 | } |
304 | 320 | ||
305 | /* | 321 | /* |
@@ -1110,6 +1126,9 @@ void ath_radio_enable(struct ath_softc *sc) | |||
1110 | ath9k_ps_wakeup(sc); | 1126 | ath9k_ps_wakeup(sc); |
1111 | ath9k_hw_configpcipowersave(ah, 0); | 1127 | ath9k_hw_configpcipowersave(ah, 0); |
1112 | 1128 | ||
1129 | if (!ah->curchan) | ||
1130 | ah->curchan = ath_get_curchannel(sc, sc->hw); | ||
1131 | |||
1113 | spin_lock_bh(&sc->sc_resetlock); | 1132 | spin_lock_bh(&sc->sc_resetlock); |
1114 | r = ath9k_hw_reset(ah, ah->curchan, false); | 1133 | r = ath9k_hw_reset(ah, ah->curchan, false); |
1115 | if (r) { | 1134 | if (r) { |
@@ -1162,6 +1181,9 @@ void ath_radio_disable(struct ath_softc *sc) | |||
1162 | ath_stoprecv(sc); /* turn off frame recv */ | 1181 | ath_stoprecv(sc); /* turn off frame recv */ |
1163 | ath_flushrecv(sc); /* flush recv queue */ | 1182 | ath_flushrecv(sc); /* flush recv queue */ |
1164 | 1183 | ||
1184 | if (!ah->curchan) | ||
1185 | ah->curchan = ath_get_curchannel(sc, sc->hw); | ||
1186 | |||
1165 | spin_lock_bh(&sc->sc_resetlock); | 1187 | spin_lock_bh(&sc->sc_resetlock); |
1166 | r = ath9k_hw_reset(ah, ah->curchan, false); | 1188 | r = ath9k_hw_reset(ah, ah->curchan, false); |
1167 | if (r) { | 1189 | if (r) { |
@@ -1178,8 +1200,6 @@ void ath_radio_disable(struct ath_softc *sc) | |||
1178 | ath9k_ps_restore(sc); | 1200 | ath9k_ps_restore(sc); |
1179 | } | 1201 | } |
1180 | 1202 | ||
1181 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
1182 | |||
1183 | /*******************/ | 1203 | /*******************/ |
1184 | /* Rfkill */ | 1204 | /* Rfkill */ |
1185 | /*******************/ | 1205 | /*******************/ |
@@ -1192,81 +1212,27 @@ static bool ath_is_rfkill_set(struct ath_softc *sc) | |||
1192 | ah->rfkill_polarity; | 1212 | ah->rfkill_polarity; |
1193 | } | 1213 | } |
1194 | 1214 | ||
1195 | /* s/w rfkill handlers */ | 1215 | static void ath9k_rfkill_poll_state(struct ieee80211_hw *hw) |
1196 | static int ath_rfkill_set_block(void *data, bool blocked) | ||
1197 | { | 1216 | { |
1198 | struct ath_softc *sc = data; | 1217 | struct ath_wiphy *aphy = hw->priv; |
1199 | 1218 | struct ath_softc *sc = aphy->sc; | |
1200 | if (blocked) | ||
1201 | ath_radio_disable(sc); | ||
1202 | else | ||
1203 | ath_radio_enable(sc); | ||
1204 | |||
1205 | return 0; | ||
1206 | } | ||
1207 | |||
1208 | static void ath_rfkill_poll_state(struct rfkill *rfkill, void *data) | ||
1209 | { | ||
1210 | struct ath_softc *sc = data; | ||
1211 | bool blocked = !!ath_is_rfkill_set(sc); | 1219 | bool blocked = !!ath_is_rfkill_set(sc); |
1212 | 1220 | ||
1213 | if (rfkill_set_hw_state(rfkill, blocked)) | 1221 | wiphy_rfkill_set_hw_state(hw->wiphy, blocked); |
1222 | |||
1223 | if (blocked) | ||
1214 | ath_radio_disable(sc); | 1224 | ath_radio_disable(sc); |
1215 | else | 1225 | else |
1216 | ath_radio_enable(sc); | 1226 | ath_radio_enable(sc); |
1217 | } | 1227 | } |
1218 | 1228 | ||
1219 | /* Init s/w rfkill */ | 1229 | static void ath_start_rfkill_poll(struct ath_softc *sc) |
1220 | static int ath_init_sw_rfkill(struct ath_softc *sc) | ||
1221 | { | ||
1222 | sc->rf_kill.ops.set_block = ath_rfkill_set_block; | ||
1223 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) | ||
1224 | sc->rf_kill.ops.poll = ath_rfkill_poll_state; | ||
1225 | |||
1226 | snprintf(sc->rf_kill.rfkill_name, sizeof(sc->rf_kill.rfkill_name), | ||
1227 | "ath9k-%s::rfkill", wiphy_name(sc->hw->wiphy)); | ||
1228 | |||
1229 | sc->rf_kill.rfkill = rfkill_alloc(sc->rf_kill.rfkill_name, | ||
1230 | wiphy_dev(sc->hw->wiphy), | ||
1231 | RFKILL_TYPE_WLAN, | ||
1232 | &sc->rf_kill.ops, sc); | ||
1233 | if (!sc->rf_kill.rfkill) { | ||
1234 | DPRINTF(sc, ATH_DBG_FATAL, "Failed to allocate rfkill\n"); | ||
1235 | return -ENOMEM; | ||
1236 | } | ||
1237 | |||
1238 | return 0; | ||
1239 | } | ||
1240 | |||
1241 | /* Deinitialize rfkill */ | ||
1242 | static void ath_deinit_rfkill(struct ath_softc *sc) | ||
1243 | { | ||
1244 | if (sc->sc_flags & SC_OP_RFKILL_REGISTERED) { | ||
1245 | rfkill_unregister(sc->rf_kill.rfkill); | ||
1246 | rfkill_destroy(sc->rf_kill.rfkill); | ||
1247 | sc->sc_flags &= ~SC_OP_RFKILL_REGISTERED; | ||
1248 | } | ||
1249 | } | ||
1250 | |||
1251 | static int ath_start_rfkill_poll(struct ath_softc *sc) | ||
1252 | { | 1230 | { |
1253 | if (!(sc->sc_flags & SC_OP_RFKILL_REGISTERED)) { | 1231 | struct ath_hw *ah = sc->sc_ah; |
1254 | if (rfkill_register(sc->rf_kill.rfkill)) { | ||
1255 | DPRINTF(sc, ATH_DBG_FATAL, | ||
1256 | "Unable to register rfkill\n"); | ||
1257 | rfkill_destroy(sc->rf_kill.rfkill); | ||
1258 | |||
1259 | /* Deinitialize the device */ | ||
1260 | ath_cleanup(sc); | ||
1261 | return -EIO; | ||
1262 | } else { | ||
1263 | sc->sc_flags |= SC_OP_RFKILL_REGISTERED; | ||
1264 | } | ||
1265 | } | ||
1266 | 1232 | ||
1267 | return 0; | 1233 | if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT) |
1234 | wiphy_rfkill_start_polling(sc->hw->wiphy); | ||
1268 | } | 1235 | } |
1269 | #endif /* CONFIG_RFKILL */ | ||
1270 | 1236 | ||
1271 | void ath_cleanup(struct ath_softc *sc) | 1237 | void ath_cleanup(struct ath_softc *sc) |
1272 | { | 1238 | { |
@@ -1286,9 +1252,6 @@ void ath_detach(struct ath_softc *sc) | |||
1286 | 1252 | ||
1287 | DPRINTF(sc, ATH_DBG_CONFIG, "Detach ATH hw\n"); | 1253 | DPRINTF(sc, ATH_DBG_CONFIG, "Detach ATH hw\n"); |
1288 | 1254 | ||
1289 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
1290 | ath_deinit_rfkill(sc); | ||
1291 | #endif | ||
1292 | ath_deinit_leds(sc); | 1255 | ath_deinit_leds(sc); |
1293 | cancel_work_sync(&sc->chan_work); | 1256 | cancel_work_sync(&sc->chan_work); |
1294 | cancel_delayed_work_sync(&sc->wiphy_work); | 1257 | cancel_delayed_work_sync(&sc->wiphy_work); |
@@ -1626,13 +1589,6 @@ int ath_attach(u16 devid, struct ath_softc *sc) | |||
1626 | if (error != 0) | 1589 | if (error != 0) |
1627 | goto error_attach; | 1590 | goto error_attach; |
1628 | 1591 | ||
1629 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
1630 | /* Initialize s/w rfkill */ | ||
1631 | error = ath_init_sw_rfkill(sc); | ||
1632 | if (error) | ||
1633 | goto error_attach; | ||
1634 | #endif | ||
1635 | |||
1636 | INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work); | 1592 | INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work); |
1637 | INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work); | 1593 | INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work); |
1638 | sc->wiphy_scheduler_int = msecs_to_jiffies(500); | 1594 | sc->wiphy_scheduler_int = msecs_to_jiffies(500); |
@@ -1648,6 +1604,7 @@ int ath_attach(u16 devid, struct ath_softc *sc) | |||
1648 | /* Initialize LED control */ | 1604 | /* Initialize LED control */ |
1649 | ath_init_leds(sc); | 1605 | ath_init_leds(sc); |
1650 | 1606 | ||
1607 | ath_start_rfkill_poll(sc); | ||
1651 | 1608 | ||
1652 | return 0; | 1609 | return 0; |
1653 | 1610 | ||
@@ -1920,7 +1877,7 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
1920 | struct ath_softc *sc = aphy->sc; | 1877 | struct ath_softc *sc = aphy->sc; |
1921 | struct ieee80211_channel *curchan = hw->conf.channel; | 1878 | struct ieee80211_channel *curchan = hw->conf.channel; |
1922 | struct ath9k_channel *init_channel; | 1879 | struct ath9k_channel *init_channel; |
1923 | int r, pos; | 1880 | int r; |
1924 | 1881 | ||
1925 | DPRINTF(sc, ATH_DBG_CONFIG, "Starting driver with " | 1882 | DPRINTF(sc, ATH_DBG_CONFIG, "Starting driver with " |
1926 | "initial channel: %d MHz\n", curchan->center_freq); | 1883 | "initial channel: %d MHz\n", curchan->center_freq); |
@@ -1950,11 +1907,9 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
1950 | 1907 | ||
1951 | /* setup initial channel */ | 1908 | /* setup initial channel */ |
1952 | 1909 | ||
1953 | pos = curchan->hw_value; | 1910 | sc->chan_idx = curchan->hw_value; |
1954 | 1911 | ||
1955 | sc->chan_idx = pos; | 1912 | init_channel = ath_get_curchannel(sc, hw); |
1956 | init_channel = &sc->sc_ah->channels[pos]; | ||
1957 | ath9k_update_ichannel(sc, hw, init_channel); | ||
1958 | 1913 | ||
1959 | /* Reset SERDES registers */ | 1914 | /* Reset SERDES registers */ |
1960 | ath9k_hw_configpcipowersave(sc->sc_ah, 0); | 1915 | ath9k_hw_configpcipowersave(sc->sc_ah, 0); |
@@ -2018,10 +1973,6 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
2018 | 1973 | ||
2019 | ieee80211_wake_queues(hw); | 1974 | ieee80211_wake_queues(hw); |
2020 | 1975 | ||
2021 | #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) | ||
2022 | r = ath_start_rfkill_poll(sc); | ||
2023 | #endif | ||
2024 | |||
2025 | mutex_unlock: | 1976 | mutex_unlock: |
2026 | mutex_unlock(&sc->mutex); | 1977 | mutex_unlock(&sc->mutex); |
2027 | 1978 | ||
@@ -2159,7 +2110,7 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
2159 | } else | 2110 | } else |
2160 | sc->rx.rxlink = NULL; | 2111 | sc->rx.rxlink = NULL; |
2161 | 2112 | ||
2162 | rfkill_pause_polling(sc->rf_kill.rfkill); | 2113 | wiphy_rfkill_stop_polling(sc->hw->wiphy); |
2163 | 2114 | ||
2164 | /* disable HAL and put h/w to sleep */ | 2115 | /* disable HAL and put h/w to sleep */ |
2165 | ath9k_hw_disable(sc->sc_ah); | 2116 | ath9k_hw_disable(sc->sc_ah); |
@@ -2765,6 +2716,7 @@ struct ieee80211_ops ath9k_ops = { | |||
2765 | .ampdu_action = ath9k_ampdu_action, | 2716 | .ampdu_action = ath9k_ampdu_action, |
2766 | .sw_scan_start = ath9k_sw_scan_start, | 2717 | .sw_scan_start = ath9k_sw_scan_start, |
2767 | .sw_scan_complete = ath9k_sw_scan_complete, | 2718 | .sw_scan_complete = ath9k_sw_scan_complete, |
2719 | .rfkill_poll = ath9k_rfkill_poll_state, | ||
2768 | }; | 2720 | }; |
2769 | 2721 | ||
2770 | static struct { | 2722 | static struct { |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 5014a19b0f75..f99f3a76df3f 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -817,6 +817,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
817 | } | 817 | } |
818 | 818 | ||
819 | if (unlikely(sc->sc_flags & (SC_OP_WAIT_FOR_BEACON | | 819 | if (unlikely(sc->sc_flags & (SC_OP_WAIT_FOR_BEACON | |
820 | SC_OP_WAIT_FOR_CAB | | ||
820 | SC_OP_WAIT_FOR_PSPOLL_DATA))) | 821 | SC_OP_WAIT_FOR_PSPOLL_DATA))) |
821 | ath_rx_ps(sc, skb); | 822 | ath_rx_ps(sc, skb); |
822 | 823 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index a5637c4aa85d..6d1519e1f011 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2152,7 +2152,6 @@ static int iwl_mac_start(struct ieee80211_hw *hw) | |||
2152 | /* we should be verifying the device is ready to be opened */ | 2152 | /* we should be verifying the device is ready to be opened */ |
2153 | mutex_lock(&priv->mutex); | 2153 | mutex_lock(&priv->mutex); |
2154 | 2154 | ||
2155 | memset(&priv->staging_rxon, 0, sizeof(struct iwl_rxon_cmd)); | ||
2156 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | 2155 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... |
2157 | * ucode filename and max sizes are card-specific. */ | 2156 | * ucode filename and max sizes are card-specific. */ |
2158 | 2157 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index f9d16ca5b3d9..6ab07165ea28 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -629,13 +629,9 @@ u8 iwl_is_fat_tx_allowed(struct iwl_priv *priv, | |||
629 | if (!sta_ht_inf->ht_supported) | 629 | if (!sta_ht_inf->ht_supported) |
630 | return 0; | 630 | return 0; |
631 | } | 631 | } |
632 | 632 | return iwl_is_channel_extension(priv, priv->band, | |
633 | if (iwl_ht_conf->ht_protection & IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) | 633 | le16_to_cpu(priv->staging_rxon.channel), |
634 | return 1; | 634 | iwl_ht_conf->extension_chan_offset); |
635 | else | ||
636 | return iwl_is_channel_extension(priv, priv->band, | ||
637 | le16_to_cpu(priv->staging_rxon.channel), | ||
638 | iwl_ht_conf->extension_chan_offset); | ||
639 | } | 635 | } |
640 | EXPORT_SYMBOL(iwl_is_fat_tx_allowed); | 636 | EXPORT_SYMBOL(iwl_is_fat_tx_allowed); |
641 | 637 | ||
@@ -826,9 +822,18 @@ void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info) | |||
826 | RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK); | 822 | RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK); |
827 | if (iwl_is_fat_tx_allowed(priv, NULL)) { | 823 | if (iwl_is_fat_tx_allowed(priv, NULL)) { |
828 | /* pure 40 fat */ | 824 | /* pure 40 fat */ |
829 | if (rxon->flags & RXON_FLG_FAT_PROT_MSK) | 825 | if (ht_info->ht_protection == IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) { |
830 | rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40; | 826 | rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40; |
831 | else { | 827 | /* Note: control channel is opposite of extension channel */ |
828 | switch (ht_info->extension_chan_offset) { | ||
829 | case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: | ||
830 | rxon->flags &= ~RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; | ||
831 | break; | ||
832 | case IEEE80211_HT_PARAM_CHA_SEC_BELOW: | ||
833 | rxon->flags |= RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; | ||
834 | break; | ||
835 | } | ||
836 | } else { | ||
832 | /* Note: control channel is opposite of extension channel */ | 837 | /* Note: control channel is opposite of extension channel */ |
833 | switch (ht_info->extension_chan_offset) { | 838 | switch (ht_info->extension_chan_offset) { |
834 | case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: | 839 | case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: |
@@ -2390,39 +2395,46 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2390 | priv->ibss_beacon = ieee80211_beacon_get(hw, vif); | 2395 | priv->ibss_beacon = ieee80211_beacon_get(hw, vif); |
2391 | } | 2396 | } |
2392 | 2397 | ||
2393 | if ((changes & BSS_CHANGED_BSSID) && !iwl_is_rfkill(priv)) { | 2398 | if (changes & BSS_CHANGED_BEACON_INT) { |
2394 | /* If there is currently a HW scan going on in the background | 2399 | priv->beacon_int = bss_conf->beacon_int; |
2395 | * then we need to cancel it else the RXON below will fail. */ | 2400 | /* TODO: in AP mode, do something to make this take effect */ |
2401 | } | ||
2402 | |||
2403 | if (changes & BSS_CHANGED_BSSID) { | ||
2404 | IWL_DEBUG_MAC80211(priv, "BSSID %pM\n", bss_conf->bssid); | ||
2405 | |||
2406 | /* | ||
2407 | * If there is currently a HW scan going on in the | ||
2408 | * background then we need to cancel it else the RXON | ||
2409 | * below/in post_associate will fail. | ||
2410 | */ | ||
2396 | if (iwl_scan_cancel_timeout(priv, 100)) { | 2411 | if (iwl_scan_cancel_timeout(priv, 100)) { |
2397 | IWL_WARN(priv, "Aborted scan still in progress " | 2412 | IWL_WARN(priv, "Aborted scan still in progress after 100ms\n"); |
2398 | "after 100ms\n"); | ||
2399 | IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n"); | 2413 | IWL_DEBUG_MAC80211(priv, "leaving - scan abort failed.\n"); |
2400 | mutex_unlock(&priv->mutex); | 2414 | mutex_unlock(&priv->mutex); |
2401 | return; | 2415 | return; |
2402 | } | 2416 | } |
2403 | memcpy(priv->staging_rxon.bssid_addr, | 2417 | |
2404 | bss_conf->bssid, ETH_ALEN); | 2418 | /* mac80211 only sets assoc when in STATION mode */ |
2405 | 2419 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC || | |
2406 | /* TODO: Audit driver for usage of these members and see | 2420 | bss_conf->assoc) { |
2407 | * if mac80211 deprecates them (priv->bssid looks like it | 2421 | memcpy(priv->staging_rxon.bssid_addr, |
2408 | * shouldn't be there, but I haven't scanned the IBSS code | 2422 | bss_conf->bssid, ETH_ALEN); |
2409 | * to verify) - jpk */ | 2423 | |
2410 | memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN); | 2424 | /* currently needed in a few places */ |
2411 | 2425 | memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN); | |
2412 | if (priv->iw_mode == NL80211_IFTYPE_AP) | 2426 | } else { |
2413 | iwlcore_config_ap(priv); | 2427 | priv->staging_rxon.filter_flags &= |
2414 | else { | 2428 | ~RXON_FILTER_ASSOC_MSK; |
2415 | int rc = iwlcore_commit_rxon(priv); | ||
2416 | if ((priv->iw_mode == NL80211_IFTYPE_STATION) && rc) | ||
2417 | iwl_rxon_add_station( | ||
2418 | priv, priv->active_rxon.bssid_addr, 1); | ||
2419 | } | 2429 | } |
2420 | } else if (!iwl_is_rfkill(priv)) { | 2430 | |
2421 | iwl_scan_cancel_timeout(priv, 100); | ||
2422 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | ||
2423 | iwlcore_commit_rxon(priv); | ||
2424 | } | 2431 | } |
2425 | 2432 | ||
2433 | /* | ||
2434 | * This needs to be after setting the BSSID in case | ||
2435 | * mac80211 decides to do both changes at once because | ||
2436 | * it will invoke post_associate. | ||
2437 | */ | ||
2426 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC && | 2438 | if (priv->iw_mode == NL80211_IFTYPE_ADHOC && |
2427 | changes & BSS_CHANGED_BEACON) { | 2439 | changes & BSS_CHANGED_BEACON) { |
2428 | struct sk_buff *beacon = ieee80211_beacon_get(hw, vif); | 2440 | struct sk_buff *beacon = ieee80211_beacon_get(hw, vif); |
@@ -2431,8 +2443,6 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2431 | iwl_mac_beacon_update(hw, beacon); | 2443 | iwl_mac_beacon_update(hw, beacon); |
2432 | } | 2444 | } |
2433 | 2445 | ||
2434 | mutex_unlock(&priv->mutex); | ||
2435 | |||
2436 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { | 2446 | if (changes & BSS_CHANGED_ERP_PREAMBLE) { |
2437 | IWL_DEBUG_MAC80211(priv, "ERP_PREAMBLE %d\n", | 2447 | IWL_DEBUG_MAC80211(priv, "ERP_PREAMBLE %d\n", |
2438 | bss_conf->use_short_preamble); | 2448 | bss_conf->use_short_preamble); |
@@ -2450,6 +2460,23 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2450 | priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK; | 2460 | priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK; |
2451 | } | 2461 | } |
2452 | 2462 | ||
2463 | if (changes & BSS_CHANGED_BASIC_RATES) { | ||
2464 | /* XXX use this information | ||
2465 | * | ||
2466 | * To do that, remove code from iwl_set_rate() and put something | ||
2467 | * like this here: | ||
2468 | * | ||
2469 | if (A-band) | ||
2470 | priv->staging_rxon.ofdm_basic_rates = | ||
2471 | bss_conf->basic_rates; | ||
2472 | else | ||
2473 | priv->staging_rxon.ofdm_basic_rates = | ||
2474 | bss_conf->basic_rates >> 4; | ||
2475 | priv->staging_rxon.cck_basic_rates = | ||
2476 | bss_conf->basic_rates & 0xF; | ||
2477 | */ | ||
2478 | } | ||
2479 | |||
2453 | if (changes & BSS_CHANGED_HT) { | 2480 | if (changes & BSS_CHANGED_HT) { |
2454 | iwl_ht_conf(priv, bss_conf); | 2481 | iwl_ht_conf(priv, bss_conf); |
2455 | 2482 | ||
@@ -2459,10 +2486,6 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2459 | 2486 | ||
2460 | if (changes & BSS_CHANGED_ASSOC) { | 2487 | if (changes & BSS_CHANGED_ASSOC) { |
2461 | IWL_DEBUG_MAC80211(priv, "ASSOC %d\n", bss_conf->assoc); | 2488 | IWL_DEBUG_MAC80211(priv, "ASSOC %d\n", bss_conf->assoc); |
2462 | /* This should never happen as this function should | ||
2463 | * never be called from interrupt context. */ | ||
2464 | if (WARN_ON_ONCE(in_interrupt())) | ||
2465 | return; | ||
2466 | if (bss_conf->assoc) { | 2489 | if (bss_conf->assoc) { |
2467 | priv->assoc_id = bss_conf->aid; | 2490 | priv->assoc_id = bss_conf->aid; |
2468 | priv->beacon_int = bss_conf->beacon_int; | 2491 | priv->beacon_int = bss_conf->beacon_int; |
@@ -2470,27 +2493,35 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2470 | priv->timestamp = bss_conf->timestamp; | 2493 | priv->timestamp = bss_conf->timestamp; |
2471 | priv->assoc_capability = bss_conf->assoc_capability; | 2494 | priv->assoc_capability = bss_conf->assoc_capability; |
2472 | 2495 | ||
2473 | /* we have just associated, don't start scan too early | 2496 | /* |
2474 | * leave time for EAPOL exchange to complete | 2497 | * We have just associated, don't start scan too early |
2498 | * leave time for EAPOL exchange to complete. | ||
2499 | * | ||
2500 | * XXX: do this in mac80211 | ||
2475 | */ | 2501 | */ |
2476 | priv->next_scan_jiffies = jiffies + | 2502 | priv->next_scan_jiffies = jiffies + |
2477 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; | 2503 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; |
2478 | mutex_lock(&priv->mutex); | 2504 | if (!iwl_is_rfkill(priv)) |
2479 | priv->cfg->ops->lib->post_associate(priv); | 2505 | priv->cfg->ops->lib->post_associate(priv); |
2480 | mutex_unlock(&priv->mutex); | 2506 | } else |
2481 | } else { | ||
2482 | priv->assoc_id = 0; | 2507 | priv->assoc_id = 0; |
2483 | IWL_DEBUG_MAC80211(priv, "DISASSOC %d\n", bss_conf->assoc); | 2508 | |
2509 | } | ||
2510 | |||
2511 | if (changes && iwl_is_associated(priv) && priv->assoc_id) { | ||
2512 | IWL_DEBUG_MAC80211(priv, "Changes (%#x) while associated\n", | ||
2513 | changes); | ||
2514 | ret = iwl_send_rxon_assoc(priv); | ||
2515 | if (!ret) { | ||
2516 | /* Sync active_rxon with latest change. */ | ||
2517 | memcpy((void *)&priv->active_rxon, | ||
2518 | &priv->staging_rxon, | ||
2519 | sizeof(struct iwl_rxon_cmd)); | ||
2484 | } | 2520 | } |
2485 | } else if (changes && iwl_is_associated(priv) && priv->assoc_id) { | ||
2486 | IWL_DEBUG_MAC80211(priv, "Associated Changes %d\n", changes); | ||
2487 | ret = iwl_send_rxon_assoc(priv); | ||
2488 | if (!ret) | ||
2489 | /* Sync active_rxon with latest change. */ | ||
2490 | memcpy((void *)&priv->active_rxon, | ||
2491 | &priv->staging_rxon, | ||
2492 | sizeof(struct iwl_rxon_cmd)); | ||
2493 | } | 2521 | } |
2522 | |||
2523 | mutex_unlock(&priv->mutex); | ||
2524 | |||
2494 | IWL_DEBUG_MAC80211(priv, "leave\n"); | 2525 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
2495 | } | 2526 | } |
2496 | EXPORT_SYMBOL(iwl_bss_info_changed); | 2527 | EXPORT_SYMBOL(iwl_bss_info_changed); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 83d31606dd00..cb9bd4c8f25e 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -2498,8 +2498,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv) | |||
2498 | struct iwl3945_rxon_cmd *active_rxon = | 2498 | struct iwl3945_rxon_cmd *active_rxon = |
2499 | (struct iwl3945_rxon_cmd *)(&priv->active_rxon); | 2499 | (struct iwl3945_rxon_cmd *)(&priv->active_rxon); |
2500 | 2500 | ||
2501 | memcpy(&priv->staging_rxon, &priv->active_rxon, | 2501 | priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK; |
2502 | sizeof(priv->staging_rxon)); | ||
2503 | active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 2502 | active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; |
2504 | } else { | 2503 | } else { |
2505 | /* Initialize our rx_config data */ | 2504 | /* Initialize our rx_config data */ |
@@ -3147,7 +3146,6 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw) | |||
3147 | /* we should be verifying the device is ready to be opened */ | 3146 | /* we should be verifying the device is ready to be opened */ |
3148 | mutex_lock(&priv->mutex); | 3147 | mutex_lock(&priv->mutex); |
3149 | 3148 | ||
3150 | memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon)); | ||
3151 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | 3149 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... |
3152 | * ucode filename and max sizes are card-specific. */ | 3150 | * ucode filename and max sizes are card-specific. */ |
3153 | 3151 | ||
diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c index 06a46d7b3d6c..6564282ce476 100644 --- a/drivers/net/wireless/libertas/if_spi.c +++ b/drivers/net/wireless/libertas/if_spi.c | |||
@@ -812,7 +812,6 @@ out: | |||
812 | static void if_spi_e2h(struct if_spi_card *card) | 812 | static void if_spi_e2h(struct if_spi_card *card) |
813 | { | 813 | { |
814 | int err = 0; | 814 | int err = 0; |
815 | unsigned long flags; | ||
816 | u32 cause; | 815 | u32 cause; |
817 | struct lbs_private *priv = card->priv; | 816 | struct lbs_private *priv = card->priv; |
818 | 817 | ||
@@ -827,10 +826,7 @@ static void if_spi_e2h(struct if_spi_card *card) | |||
827 | /* generate a card interrupt */ | 826 | /* generate a card interrupt */ |
828 | spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT); | 827 | spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT); |
829 | 828 | ||
830 | spin_lock_irqsave(&priv->driver_lock, flags); | ||
831 | lbs_queue_event(priv, cause & 0xff); | 829 | lbs_queue_event(priv, cause & 0xff); |
832 | spin_unlock_irqrestore(&priv->driver_lock, flags); | ||
833 | |||
834 | out: | 830 | out: |
835 | if (err) | 831 | if (err) |
836 | lbs_pr_err("%s: error %d\n", __func__, err); | 832 | lbs_pr_err("%s: error %d\n", __func__, err); |
@@ -875,7 +871,12 @@ static int lbs_spi_thread(void *data) | |||
875 | err = if_spi_c2h_data(card); | 871 | err = if_spi_c2h_data(card); |
876 | if (err) | 872 | if (err) |
877 | goto err; | 873 | goto err; |
878 | if (hiStatus & IF_SPI_HIST_CMD_DOWNLOAD_RDY) { | 874 | |
875 | /* workaround: in PS mode, the card does not set the Command | ||
876 | * Download Ready bit, but it sets TX Download Ready. */ | ||
877 | if (hiStatus & IF_SPI_HIST_CMD_DOWNLOAD_RDY || | ||
878 | (card->priv->psstate != PS_STATE_FULL_POWER && | ||
879 | (hiStatus & IF_SPI_HIST_TX_DOWNLOAD_RDY))) { | ||
879 | /* This means two things. First of all, | 880 | /* This means two things. First of all, |
880 | * if there was a previous command sent, the card has | 881 | * if there was a previous command sent, the card has |
881 | * successfully received it. | 882 | * successfully received it. |