diff options
author | David S. Miller <davem@davemloft.net> | 2009-10-12 02:15:47 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-10-12 02:15:47 -0400 |
commit | 7fe13c5733790ef582769a54693fa6a5abf3c032 (patch) | |
tree | 567eb4394b642ddc81ff05521329d75d1cf47b88 | |
parent | 8aa0f64ac3835a6daf84d0b0e07c4c01d7d8eddc (diff) | |
parent | 10c435f18b8cb78a5870c08d52955594f5ec9c31 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
37 files changed, 464 insertions, 260 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 09a2028bab7f..c57c2e6c8d27 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -3643,6 +3643,13 @@ F: Documentation/blockdev/nbd.txt | |||
3643 | F: drivers/block/nbd.c | 3643 | F: drivers/block/nbd.c |
3644 | F: include/linux/nbd.h | 3644 | F: include/linux/nbd.h |
3645 | 3645 | ||
3646 | NETWORK DROP MONITOR | ||
3647 | M: Neil Horman <nhorman@tuxdriver.com> | ||
3648 | L: netdev@vger.kernel.org | ||
3649 | S: Maintained | ||
3650 | W: https://fedorahosted.org/dropwatch/ | ||
3651 | F: net/core/drop_monitor.c | ||
3652 | |||
3646 | NETWORKING [GENERAL] | 3653 | NETWORKING [GENERAL] |
3647 | M: "David S. Miller" <davem@davemloft.net> | 3654 | M: "David S. Miller" <davem@davemloft.net> |
3648 | L: netdev@vger.kernel.org | 3655 | L: netdev@vger.kernel.org |
diff --git a/drivers/net/Makefile b/drivers/net/Makefile index d866b8cf65d1..48d82e901aad 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile | |||
@@ -2,6 +2,10 @@ | |||
2 | # Makefile for the Linux network (ethercard) device drivers. | 2 | # Makefile for the Linux network (ethercard) device drivers. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-$(CONFIG_MII) += mii.o | ||
6 | obj-$(CONFIG_MDIO) += mdio.o | ||
7 | obj-$(CONFIG_PHYLIB) += phy/ | ||
8 | |||
5 | obj-$(CONFIG_TI_DAVINCI_EMAC) += davinci_emac.o | 9 | obj-$(CONFIG_TI_DAVINCI_EMAC) += davinci_emac.o |
6 | 10 | ||
7 | obj-$(CONFIG_E1000) += e1000/ | 11 | obj-$(CONFIG_E1000) += e1000/ |
@@ -100,10 +104,6 @@ obj-$(CONFIG_SH_ETH) += sh_eth.o | |||
100 | # end link order section | 104 | # end link order section |
101 | # | 105 | # |
102 | 106 | ||
103 | obj-$(CONFIG_MII) += mii.o | ||
104 | obj-$(CONFIG_MDIO) += mdio.o | ||
105 | obj-$(CONFIG_PHYLIB) += phy/ | ||
106 | |||
107 | obj-$(CONFIG_SUNDANCE) += sundance.o | 107 | obj-$(CONFIG_SUNDANCE) += sundance.o |
108 | obj-$(CONFIG_HAMACHI) += hamachi.o | 108 | obj-$(CONFIG_HAMACHI) += hamachi.o |
109 | obj-$(CONFIG_NET) += Space.o loopback.o | 109 | obj-$(CONFIG_NET) += Space.o loopback.o |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index fdf5937233fc..04f63c77071d 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
@@ -721,7 +721,7 @@ static inline void update_rx_stats(struct net_device *dev, u32 status) | |||
721 | ps->rx_errors++; | 721 | ps->rx_errors++; |
722 | if (status & RX_MISSED_FRAME) | 722 | if (status & RX_MISSED_FRAME) |
723 | ps->rx_missed_errors++; | 723 | ps->rx_missed_errors++; |
724 | if (status & (RX_OVERLEN | RX_OVERLEN | RX_LEN_ERROR)) | 724 | if (status & (RX_OVERLEN | RX_RUNT | RX_LEN_ERROR)) |
725 | ps->rx_length_errors++; | 725 | ps->rx_length_errors++; |
726 | if (status & RX_CRC_ERROR) | 726 | if (status & RX_CRC_ERROR) |
727 | ps->rx_crc_errors++; | 727 | ps->rx_crc_errors++; |
@@ -794,8 +794,6 @@ static int au1000_rx(struct net_device *dev) | |||
794 | printk("rx len error\n"); | 794 | printk("rx len error\n"); |
795 | if (status & RX_U_CNTRL_FRAME) | 795 | if (status & RX_U_CNTRL_FRAME) |
796 | printk("rx u control frame\n"); | 796 | printk("rx u control frame\n"); |
797 | if (status & RX_MISSED_FRAME) | ||
798 | printk("rx miss\n"); | ||
799 | } | 797 | } |
800 | } | 798 | } |
801 | prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE); | 799 | prxd->buff_stat = (u32)(pDB->dma_addr | RX_DMA_ENABLE); |
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index b7311bc00258..34d0c69e67f7 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c | |||
@@ -19,6 +19,10 @@ | |||
19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
20 | #include <net/ethoc.h> | 20 | #include <net/ethoc.h> |
21 | 21 | ||
22 | static int buffer_size = 0x8000; /* 32 KBytes */ | ||
23 | module_param(buffer_size, int, 0); | ||
24 | MODULE_PARM_DESC(buffer_size, "DMA buffer allocation size"); | ||
25 | |||
22 | /* register offsets */ | 26 | /* register offsets */ |
23 | #define MODER 0x00 | 27 | #define MODER 0x00 |
24 | #define INT_SOURCE 0x04 | 28 | #define INT_SOURCE 0x04 |
@@ -167,6 +171,7 @@ | |||
167 | * struct ethoc - driver-private device structure | 171 | * struct ethoc - driver-private device structure |
168 | * @iobase: pointer to I/O memory region | 172 | * @iobase: pointer to I/O memory region |
169 | * @membase: pointer to buffer memory region | 173 | * @membase: pointer to buffer memory region |
174 | * @dma_alloc: dma allocated buffer size | ||
170 | * @num_tx: number of send buffers | 175 | * @num_tx: number of send buffers |
171 | * @cur_tx: last send buffer written | 176 | * @cur_tx: last send buffer written |
172 | * @dty_tx: last buffer actually sent | 177 | * @dty_tx: last buffer actually sent |
@@ -185,6 +190,7 @@ | |||
185 | struct ethoc { | 190 | struct ethoc { |
186 | void __iomem *iobase; | 191 | void __iomem *iobase; |
187 | void __iomem *membase; | 192 | void __iomem *membase; |
193 | int dma_alloc; | ||
188 | 194 | ||
189 | unsigned int num_tx; | 195 | unsigned int num_tx; |
190 | unsigned int cur_tx; | 196 | unsigned int cur_tx; |
@@ -284,7 +290,7 @@ static int ethoc_init_ring(struct ethoc *dev) | |||
284 | dev->cur_rx = 0; | 290 | dev->cur_rx = 0; |
285 | 291 | ||
286 | /* setup transmission buffers */ | 292 | /* setup transmission buffers */ |
287 | bd.addr = 0; | 293 | bd.addr = virt_to_phys(dev->membase); |
288 | bd.stat = TX_BD_IRQ | TX_BD_CRC; | 294 | bd.stat = TX_BD_IRQ | TX_BD_CRC; |
289 | 295 | ||
290 | for (i = 0; i < dev->num_tx; i++) { | 296 | for (i = 0; i < dev->num_tx; i++) { |
@@ -295,7 +301,6 @@ static int ethoc_init_ring(struct ethoc *dev) | |||
295 | bd.addr += ETHOC_BUFSIZ; | 301 | bd.addr += ETHOC_BUFSIZ; |
296 | } | 302 | } |
297 | 303 | ||
298 | bd.addr = dev->num_tx * ETHOC_BUFSIZ; | ||
299 | bd.stat = RX_BD_EMPTY | RX_BD_IRQ; | 304 | bd.stat = RX_BD_EMPTY | RX_BD_IRQ; |
300 | 305 | ||
301 | for (i = 0; i < dev->num_rx; i++) { | 306 | for (i = 0; i < dev->num_rx; i++) { |
@@ -400,8 +405,12 @@ static int ethoc_rx(struct net_device *dev, int limit) | |||
400 | if (ethoc_update_rx_stats(priv, &bd) == 0) { | 405 | if (ethoc_update_rx_stats(priv, &bd) == 0) { |
401 | int size = bd.stat >> 16; | 406 | int size = bd.stat >> 16; |
402 | struct sk_buff *skb = netdev_alloc_skb(dev, size); | 407 | struct sk_buff *skb = netdev_alloc_skb(dev, size); |
408 | |||
409 | size -= 4; /* strip the CRC */ | ||
410 | skb_reserve(skb, 2); /* align TCP/IP header */ | ||
411 | |||
403 | if (likely(skb)) { | 412 | if (likely(skb)) { |
404 | void *src = priv->membase + bd.addr; | 413 | void *src = phys_to_virt(bd.addr); |
405 | memcpy_fromio(skb_put(skb, size), src, size); | 414 | memcpy_fromio(skb_put(skb, size), src, size); |
406 | skb->protocol = eth_type_trans(skb, dev); | 415 | skb->protocol = eth_type_trans(skb, dev); |
407 | priv->stats.rx_packets++; | 416 | priv->stats.rx_packets++; |
@@ -653,9 +662,9 @@ static int ethoc_open(struct net_device *dev) | |||
653 | if (ret) | 662 | if (ret) |
654 | return ret; | 663 | return ret; |
655 | 664 | ||
656 | /* calculate the number of TX/RX buffers */ | 665 | /* calculate the number of TX/RX buffers, maximum 128 supported */ |
657 | num_bd = (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ; | 666 | num_bd = min(128, (dev->mem_end - dev->mem_start + 1) / ETHOC_BUFSIZ); |
658 | priv->num_tx = min(min_tx, num_bd / 4); | 667 | priv->num_tx = max(min_tx, num_bd / 4); |
659 | priv->num_rx = num_bd - priv->num_tx; | 668 | priv->num_rx = num_bd - priv->num_tx; |
660 | ethoc_write(priv, TX_BD_NUM, priv->num_tx); | 669 | ethoc_write(priv, TX_BD_NUM, priv->num_tx); |
661 | 670 | ||
@@ -823,7 +832,7 @@ static netdev_tx_t ethoc_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
823 | else | 832 | else |
824 | bd.stat &= ~TX_BD_PAD; | 833 | bd.stat &= ~TX_BD_PAD; |
825 | 834 | ||
826 | dest = priv->membase + bd.addr; | 835 | dest = phys_to_virt(bd.addr); |
827 | memcpy_toio(dest, skb->data, skb->len); | 836 | memcpy_toio(dest, skb->data, skb->len); |
828 | 837 | ||
829 | bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK); | 838 | bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK); |
@@ -903,22 +912,19 @@ static int ethoc_probe(struct platform_device *pdev) | |||
903 | 912 | ||
904 | /* obtain buffer memory space */ | 913 | /* obtain buffer memory space */ |
905 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 914 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
906 | if (!res) { | 915 | if (res) { |
907 | dev_err(&pdev->dev, "cannot obtain memory space\n"); | 916 | mem = devm_request_mem_region(&pdev->dev, res->start, |
908 | ret = -ENXIO; | ||
909 | goto free; | ||
910 | } | ||
911 | |||
912 | mem = devm_request_mem_region(&pdev->dev, res->start, | ||
913 | res->end - res->start + 1, res->name); | 917 | res->end - res->start + 1, res->name); |
914 | if (!mem) { | 918 | if (!mem) { |
915 | dev_err(&pdev->dev, "cannot request memory space\n"); | 919 | dev_err(&pdev->dev, "cannot request memory space\n"); |
916 | ret = -ENXIO; | 920 | ret = -ENXIO; |
917 | goto free; | 921 | goto free; |
922 | } | ||
923 | |||
924 | netdev->mem_start = mem->start; | ||
925 | netdev->mem_end = mem->end; | ||
918 | } | 926 | } |
919 | 927 | ||
920 | netdev->mem_start = mem->start; | ||
921 | netdev->mem_end = mem->end; | ||
922 | 928 | ||
923 | /* obtain device IRQ number */ | 929 | /* obtain device IRQ number */ |
924 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 930 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
@@ -933,6 +939,7 @@ static int ethoc_probe(struct platform_device *pdev) | |||
933 | /* setup driver-private data */ | 939 | /* setup driver-private data */ |
934 | priv = netdev_priv(netdev); | 940 | priv = netdev_priv(netdev); |
935 | priv->netdev = netdev; | 941 | priv->netdev = netdev; |
942 | priv->dma_alloc = 0; | ||
936 | 943 | ||
937 | priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr, | 944 | priv->iobase = devm_ioremap_nocache(&pdev->dev, netdev->base_addr, |
938 | mmio->end - mmio->start + 1); | 945 | mmio->end - mmio->start + 1); |
@@ -942,12 +949,27 @@ static int ethoc_probe(struct platform_device *pdev) | |||
942 | goto error; | 949 | goto error; |
943 | } | 950 | } |
944 | 951 | ||
945 | priv->membase = devm_ioremap_nocache(&pdev->dev, netdev->mem_start, | 952 | if (netdev->mem_end) { |
946 | mem->end - mem->start + 1); | 953 | priv->membase = devm_ioremap_nocache(&pdev->dev, |
947 | if (!priv->membase) { | 954 | netdev->mem_start, mem->end - mem->start + 1); |
948 | dev_err(&pdev->dev, "cannot remap memory space\n"); | 955 | if (!priv->membase) { |
949 | ret = -ENXIO; | 956 | dev_err(&pdev->dev, "cannot remap memory space\n"); |
950 | goto error; | 957 | ret = -ENXIO; |
958 | goto error; | ||
959 | } | ||
960 | } else { | ||
961 | /* Allocate buffer memory */ | ||
962 | priv->membase = dma_alloc_coherent(NULL, | ||
963 | buffer_size, (void *)&netdev->mem_start, | ||
964 | GFP_KERNEL); | ||
965 | if (!priv->membase) { | ||
966 | dev_err(&pdev->dev, "cannot allocate %dB buffer\n", | ||
967 | buffer_size); | ||
968 | ret = -ENOMEM; | ||
969 | goto error; | ||
970 | } | ||
971 | netdev->mem_end = netdev->mem_start + buffer_size; | ||
972 | priv->dma_alloc = buffer_size; | ||
951 | } | 973 | } |
952 | 974 | ||
953 | /* Allow the platform setup code to pass in a MAC address. */ | 975 | /* Allow the platform setup code to pass in a MAC address. */ |
@@ -1034,6 +1056,9 @@ free_mdio: | |||
1034 | kfree(priv->mdio->irq); | 1056 | kfree(priv->mdio->irq); |
1035 | mdiobus_free(priv->mdio); | 1057 | mdiobus_free(priv->mdio); |
1036 | free: | 1058 | free: |
1059 | if (priv->dma_alloc) | ||
1060 | dma_free_coherent(NULL, priv->dma_alloc, priv->membase, | ||
1061 | netdev->mem_start); | ||
1037 | free_netdev(netdev); | 1062 | free_netdev(netdev); |
1038 | out: | 1063 | out: |
1039 | return ret; | 1064 | return ret; |
@@ -1059,7 +1084,9 @@ static int ethoc_remove(struct platform_device *pdev) | |||
1059 | kfree(priv->mdio->irq); | 1084 | kfree(priv->mdio->irq); |
1060 | mdiobus_free(priv->mdio); | 1085 | mdiobus_free(priv->mdio); |
1061 | } | 1086 | } |
1062 | 1087 | if (priv->dma_alloc) | |
1088 | dma_free_coherent(NULL, priv->dma_alloc, priv->membase, | ||
1089 | netdev->mem_start); | ||
1063 | unregister_netdev(netdev); | 1090 | unregister_netdev(netdev); |
1064 | free_netdev(netdev); | 1091 | free_netdev(netdev); |
1065 | } | 1092 | } |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 0fa21a936d13..c5d92ec176d0 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
@@ -443,7 +443,7 @@ static u32 __emac_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_s | |||
443 | ret |= EMAC_MR1_TFS_2K; | 443 | ret |= EMAC_MR1_TFS_2K; |
444 | break; | 444 | break; |
445 | default: | 445 | default: |
446 | printk(KERN_WARNING "%s: Unknown Rx FIFO size %d\n", | 446 | printk(KERN_WARNING "%s: Unknown Tx FIFO size %d\n", |
447 | dev->ndev->name, tx_size); | 447 | dev->ndev->name, tx_size); |
448 | } | 448 | } |
449 | 449 | ||
@@ -470,6 +470,9 @@ static u32 __emac4_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_ | |||
470 | DBG2(dev, "__emac4_calc_base_mr1" NL); | 470 | DBG2(dev, "__emac4_calc_base_mr1" NL); |
471 | 471 | ||
472 | switch(tx_size) { | 472 | switch(tx_size) { |
473 | case 16384: | ||
474 | ret |= EMAC4_MR1_TFS_16K; | ||
475 | break; | ||
473 | case 4096: | 476 | case 4096: |
474 | ret |= EMAC4_MR1_TFS_4K; | 477 | ret |= EMAC4_MR1_TFS_4K; |
475 | break; | 478 | break; |
@@ -477,7 +480,7 @@ static u32 __emac4_calc_base_mr1(struct emac_instance *dev, int tx_size, int rx_ | |||
477 | ret |= EMAC4_MR1_TFS_2K; | 480 | ret |= EMAC4_MR1_TFS_2K; |
478 | break; | 481 | break; |
479 | default: | 482 | default: |
480 | printk(KERN_WARNING "%s: Unknown Rx FIFO size %d\n", | 483 | printk(KERN_WARNING "%s: Unknown Tx FIFO size %d\n", |
481 | dev->ndev->name, tx_size); | 484 | dev->ndev->name, tx_size); |
482 | } | 485 | } |
483 | 486 | ||
diff --git a/drivers/net/ibm_newemac/emac.h b/drivers/net/ibm_newemac/emac.h index 0afc2cf5c52b..d34adf99fc6a 100644 --- a/drivers/net/ibm_newemac/emac.h +++ b/drivers/net/ibm_newemac/emac.h | |||
@@ -153,6 +153,7 @@ struct emac_regs { | |||
153 | #define EMAC4_MR1_RFS_16K 0x00280000 | 153 | #define EMAC4_MR1_RFS_16K 0x00280000 |
154 | #define EMAC4_MR1_TFS_2K 0x00020000 | 154 | #define EMAC4_MR1_TFS_2K 0x00020000 |
155 | #define EMAC4_MR1_TFS_4K 0x00030000 | 155 | #define EMAC4_MR1_TFS_4K 0x00030000 |
156 | #define EMAC4_MR1_TFS_16K 0x00050000 | ||
156 | #define EMAC4_MR1_TR 0x00008000 | 157 | #define EMAC4_MR1_TR 0x00008000 |
157 | #define EMAC4_MR1_MWSW_001 0x00001000 | 158 | #define EMAC4_MR1_MWSW_001 0x00001000 |
158 | #define EMAC4_MR1_JPSM 0x00000800 | 159 | #define EMAC4_MR1_JPSM 0x00000800 |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 0039b85d4d53..302675a972e8 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -1714,7 +1714,7 @@ netxen_nic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1714 | /* 4 fragments per cmd des */ | 1714 | /* 4 fragments per cmd des */ |
1715 | no_of_desc = (frag_count + 3) >> 2; | 1715 | no_of_desc = (frag_count + 3) >> 2; |
1716 | 1716 | ||
1717 | if (unlikely(no_of_desc + 2) > netxen_tx_avail(tx_ring)) { | 1717 | if (unlikely(no_of_desc + 2 > netxen_tx_avail(tx_ring))) { |
1718 | netif_stop_queue(netdev); | 1718 | netif_stop_queue(netdev); |
1719 | return NETDEV_TX_BUSY; | 1719 | return NETDEV_TX_BUSY; |
1720 | } | 1720 | } |
diff --git a/drivers/net/pasemi_mac_ethtool.c b/drivers/net/pasemi_mac_ethtool.c index 064a4fe1dd90..28a86224879d 100644 --- a/drivers/net/pasemi_mac_ethtool.c +++ b/drivers/net/pasemi_mac_ethtool.c | |||
@@ -71,6 +71,9 @@ pasemi_mac_ethtool_get_settings(struct net_device *netdev, | |||
71 | struct pasemi_mac *mac = netdev_priv(netdev); | 71 | struct pasemi_mac *mac = netdev_priv(netdev); |
72 | struct phy_device *phydev = mac->phydev; | 72 | struct phy_device *phydev = mac->phydev; |
73 | 73 | ||
74 | if (!phydev) | ||
75 | return -EOPNOTSUPP; | ||
76 | |||
74 | return phy_ethtool_gset(phydev, cmd); | 77 | return phy_ethtool_gset(phydev, cmd); |
75 | } | 78 | } |
76 | 79 | ||
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index 9e53ca9c3b43..f6bd22495f55 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
@@ -803,6 +803,12 @@ enum { | |||
803 | MB_CMD_SET_PORT_CFG = 0x00000122, | 803 | MB_CMD_SET_PORT_CFG = 0x00000122, |
804 | MB_CMD_GET_PORT_CFG = 0x00000123, | 804 | MB_CMD_GET_PORT_CFG = 0x00000123, |
805 | MB_CMD_GET_LINK_STS = 0x00000124, | 805 | MB_CMD_GET_LINK_STS = 0x00000124, |
806 | MB_CMD_SET_MGMNT_TFK_CTL = 0x00000160, /* Set Mgmnt Traffic Control */ | ||
807 | MB_SET_MPI_TFK_STOP = (1 << 0), | ||
808 | MB_SET_MPI_TFK_RESUME = (1 << 1), | ||
809 | MB_CMD_GET_MGMNT_TFK_CTL = 0x00000161, /* Get Mgmnt Traffic Control */ | ||
810 | MB_GET_MPI_TFK_STOPPED = (1 << 0), | ||
811 | MB_GET_MPI_TFK_FIFO_EMPTY = (1 << 1), | ||
806 | 812 | ||
807 | /* Mailbox Command Status. */ | 813 | /* Mailbox Command Status. */ |
808 | MB_CMD_STS_GOOD = 0x00004000, /* Success. */ | 814 | MB_CMD_STS_GOOD = 0x00004000, /* Success. */ |
@@ -1168,7 +1174,7 @@ struct ricb { | |||
1168 | #define RSS_RI6 0x40 | 1174 | #define RSS_RI6 0x40 |
1169 | #define RSS_RT6 0x80 | 1175 | #define RSS_RT6 0x80 |
1170 | __le16 mask; | 1176 | __le16 mask; |
1171 | __le32 hash_cq_id[256]; | 1177 | u8 hash_cq_id[1024]; |
1172 | __le32 ipv6_hash_key[10]; | 1178 | __le32 ipv6_hash_key[10]; |
1173 | __le32 ipv4_hash_key[4]; | 1179 | __le32 ipv4_hash_key[4]; |
1174 | } __attribute((packed)); | 1180 | } __attribute((packed)); |
@@ -1605,6 +1611,8 @@ int ql_read_mpi_reg(struct ql_adapter *qdev, u32 reg, u32 *data); | |||
1605 | int ql_mb_about_fw(struct ql_adapter *qdev); | 1611 | int ql_mb_about_fw(struct ql_adapter *qdev); |
1606 | void ql_link_on(struct ql_adapter *qdev); | 1612 | void ql_link_on(struct ql_adapter *qdev); |
1607 | void ql_link_off(struct ql_adapter *qdev); | 1613 | void ql_link_off(struct ql_adapter *qdev); |
1614 | int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control); | ||
1615 | int ql_wait_fifo_empty(struct ql_adapter *qdev); | ||
1608 | 1616 | ||
1609 | #if 1 | 1617 | #if 1 |
1610 | #define QL_ALL_DUMP | 1618 | #define QL_ALL_DUMP |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index fde5af0d5b46..cd093db29ada 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -320,6 +320,37 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, | |||
320 | 320 | ||
321 | switch (type) { | 321 | switch (type) { |
322 | case MAC_ADDR_TYPE_MULTI_MAC: | 322 | case MAC_ADDR_TYPE_MULTI_MAC: |
323 | { | ||
324 | u32 upper = (addr[0] << 8) | addr[1]; | ||
325 | u32 lower = (addr[2] << 24) | (addr[3] << 16) | | ||
326 | (addr[4] << 8) | (addr[5]); | ||
327 | |||
328 | status = | ||
329 | ql_wait_reg_rdy(qdev, | ||
330 | MAC_ADDR_IDX, MAC_ADDR_MW, 0); | ||
331 | if (status) | ||
332 | goto exit; | ||
333 | ql_write32(qdev, MAC_ADDR_IDX, (offset++) | | ||
334 | (index << MAC_ADDR_IDX_SHIFT) | | ||
335 | type | MAC_ADDR_E); | ||
336 | ql_write32(qdev, MAC_ADDR_DATA, lower); | ||
337 | status = | ||
338 | ql_wait_reg_rdy(qdev, | ||
339 | MAC_ADDR_IDX, MAC_ADDR_MW, 0); | ||
340 | if (status) | ||
341 | goto exit; | ||
342 | ql_write32(qdev, MAC_ADDR_IDX, (offset++) | | ||
343 | (index << MAC_ADDR_IDX_SHIFT) | | ||
344 | type | MAC_ADDR_E); | ||
345 | |||
346 | ql_write32(qdev, MAC_ADDR_DATA, upper); | ||
347 | status = | ||
348 | ql_wait_reg_rdy(qdev, | ||
349 | MAC_ADDR_IDX, MAC_ADDR_MW, 0); | ||
350 | if (status) | ||
351 | goto exit; | ||
352 | break; | ||
353 | } | ||
323 | case MAC_ADDR_TYPE_CAM_MAC: | 354 | case MAC_ADDR_TYPE_CAM_MAC: |
324 | { | 355 | { |
325 | u32 cam_output; | 356 | u32 cam_output; |
@@ -365,16 +396,14 @@ static int ql_set_mac_addr_reg(struct ql_adapter *qdev, u8 *addr, u32 type, | |||
365 | and possibly the function id. Right now we hardcode | 396 | and possibly the function id. Right now we hardcode |
366 | the route field to NIC core. | 397 | the route field to NIC core. |
367 | */ | 398 | */ |
368 | if (type == MAC_ADDR_TYPE_CAM_MAC) { | 399 | cam_output = (CAM_OUT_ROUTE_NIC | |
369 | cam_output = (CAM_OUT_ROUTE_NIC | | 400 | (qdev-> |
370 | (qdev-> | 401 | func << CAM_OUT_FUNC_SHIFT) | |
371 | func << CAM_OUT_FUNC_SHIFT) | | 402 | (0 << CAM_OUT_CQ_ID_SHIFT)); |
372 | (0 << CAM_OUT_CQ_ID_SHIFT)); | 403 | if (qdev->vlgrp) |
373 | if (qdev->vlgrp) | 404 | cam_output |= CAM_OUT_RV; |
374 | cam_output |= CAM_OUT_RV; | 405 | /* route to NIC core */ |
375 | /* route to NIC core */ | 406 | ql_write32(qdev, MAC_ADDR_DATA, cam_output); |
376 | ql_write32(qdev, MAC_ADDR_DATA, cam_output); | ||
377 | } | ||
378 | break; | 407 | break; |
379 | } | 408 | } |
380 | case MAC_ADDR_TYPE_VLAN: | 409 | case MAC_ADDR_TYPE_VLAN: |
@@ -546,14 +575,14 @@ static int ql_set_routing_reg(struct ql_adapter *qdev, u32 index, u32 mask, | |||
546 | } | 575 | } |
547 | case RT_IDX_MCAST: /* Pass up All Multicast frames. */ | 576 | case RT_IDX_MCAST: /* Pass up All Multicast frames. */ |
548 | { | 577 | { |
549 | value = RT_IDX_DST_CAM_Q | /* dest */ | 578 | value = RT_IDX_DST_DFLT_Q | /* dest */ |
550 | RT_IDX_TYPE_NICQ | /* type */ | 579 | RT_IDX_TYPE_NICQ | /* type */ |
551 | (RT_IDX_ALLMULTI_SLOT << RT_IDX_IDX_SHIFT);/* index */ | 580 | (RT_IDX_ALLMULTI_SLOT << RT_IDX_IDX_SHIFT);/* index */ |
552 | break; | 581 | break; |
553 | } | 582 | } |
554 | case RT_IDX_MCAST_MATCH: /* Pass up matched Multicast frames. */ | 583 | case RT_IDX_MCAST_MATCH: /* Pass up matched Multicast frames. */ |
555 | { | 584 | { |
556 | value = RT_IDX_DST_CAM_Q | /* dest */ | 585 | value = RT_IDX_DST_DFLT_Q | /* dest */ |
557 | RT_IDX_TYPE_NICQ | /* type */ | 586 | RT_IDX_TYPE_NICQ | /* type */ |
558 | (RT_IDX_MCAST_MATCH_SLOT << RT_IDX_IDX_SHIFT);/* index */ | 587 | (RT_IDX_MCAST_MATCH_SLOT << RT_IDX_IDX_SHIFT);/* index */ |
559 | break; | 588 | break; |
@@ -3078,6 +3107,12 @@ err_irq: | |||
3078 | 3107 | ||
3079 | static int ql_start_rss(struct ql_adapter *qdev) | 3108 | static int ql_start_rss(struct ql_adapter *qdev) |
3080 | { | 3109 | { |
3110 | u8 init_hash_seed[] = {0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, | ||
3111 | 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, | ||
3112 | 0xb0, 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, | ||
3113 | 0x30, 0xb4, 0x77, 0xcb, 0x2d, 0xa3, 0x80, | ||
3114 | 0x30, 0xf2, 0x0c, 0x6a, 0x42, 0xb7, 0x3b, | ||
3115 | 0xbe, 0xac, 0x01, 0xfa}; | ||
3081 | struct ricb *ricb = &qdev->ricb; | 3116 | struct ricb *ricb = &qdev->ricb; |
3082 | int status = 0; | 3117 | int status = 0; |
3083 | int i; | 3118 | int i; |
@@ -3087,21 +3122,17 @@ static int ql_start_rss(struct ql_adapter *qdev) | |||
3087 | 3122 | ||
3088 | ricb->base_cq = RSS_L4K; | 3123 | ricb->base_cq = RSS_L4K; |
3089 | ricb->flags = | 3124 | ricb->flags = |
3090 | (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 | | 3125 | (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RT4 | RSS_RT6); |
3091 | RSS_RT6); | 3126 | ricb->mask = cpu_to_le16((u16)(0x3ff)); |
3092 | ricb->mask = cpu_to_le16(qdev->rss_ring_count - 1); | ||
3093 | 3127 | ||
3094 | /* | 3128 | /* |
3095 | * Fill out the Indirection Table. | 3129 | * Fill out the Indirection Table. |
3096 | */ | 3130 | */ |
3097 | for (i = 0; i < 256; i++) | 3131 | for (i = 0; i < 1024; i++) |
3098 | hash_id[i] = i & (qdev->rss_ring_count - 1); | 3132 | hash_id[i] = (i & (qdev->rss_ring_count - 1)); |
3099 | 3133 | ||
3100 | /* | 3134 | memcpy((void *)&ricb->ipv6_hash_key[0], init_hash_seed, 40); |
3101 | * Random values for the IPv6 and IPv4 Hash Keys. | 3135 | memcpy((void *)&ricb->ipv4_hash_key[0], init_hash_seed, 16); |
3102 | */ | ||
3103 | get_random_bytes((void *)&ricb->ipv6_hash_key[0], 40); | ||
3104 | get_random_bytes((void *)&ricb->ipv4_hash_key[0], 16); | ||
3105 | 3136 | ||
3106 | QPRINTK(qdev, IFUP, DEBUG, "Initializing RSS.\n"); | 3137 | QPRINTK(qdev, IFUP, DEBUG, "Initializing RSS.\n"); |
3107 | 3138 | ||
@@ -3240,6 +3271,13 @@ static int ql_adapter_initialize(struct ql_adapter *qdev) | |||
3240 | ql_write32(qdev, SPLT_HDR, SPLT_HDR_EP | | 3271 | ql_write32(qdev, SPLT_HDR, SPLT_HDR_EP | |
3241 | min(SMALL_BUFFER_SIZE, MAX_SPLIT_SIZE)); | 3272 | min(SMALL_BUFFER_SIZE, MAX_SPLIT_SIZE)); |
3242 | 3273 | ||
3274 | /* Set RX packet routing to use port/pci function on which the | ||
3275 | * packet arrived on in addition to usual frame routing. | ||
3276 | * This is helpful on bonding where both interfaces can have | ||
3277 | * the same MAC address. | ||
3278 | */ | ||
3279 | ql_write32(qdev, RST_FO, RST_FO_RR_MASK | RST_FO_RR_RCV_FUNC_CQ); | ||
3280 | |||
3243 | /* Start up the rx queues. */ | 3281 | /* Start up the rx queues. */ |
3244 | for (i = 0; i < qdev->rx_ring_count; i++) { | 3282 | for (i = 0; i < qdev->rx_ring_count; i++) { |
3245 | status = ql_start_rx_ring(qdev, &qdev->rx_ring[i]); | 3283 | status = ql_start_rx_ring(qdev, &qdev->rx_ring[i]); |
@@ -3312,6 +3350,13 @@ static int ql_adapter_reset(struct ql_adapter *qdev) | |||
3312 | 3350 | ||
3313 | end_jiffies = jiffies + | 3351 | end_jiffies = jiffies + |
3314 | max((unsigned long)1, usecs_to_jiffies(30)); | 3352 | max((unsigned long)1, usecs_to_jiffies(30)); |
3353 | |||
3354 | /* Stop management traffic. */ | ||
3355 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_STOP); | ||
3356 | |||
3357 | /* Wait for the NIC and MGMNT FIFOs to empty. */ | ||
3358 | ql_wait_fifo_empty(qdev); | ||
3359 | |||
3315 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); | 3360 | ql_write32(qdev, RST_FO, (RST_FO_FR << 16) | RST_FO_FR); |
3316 | 3361 | ||
3317 | do { | 3362 | do { |
@@ -3327,6 +3372,8 @@ static int ql_adapter_reset(struct ql_adapter *qdev) | |||
3327 | status = -ETIMEDOUT; | 3372 | status = -ETIMEDOUT; |
3328 | } | 3373 | } |
3329 | 3374 | ||
3375 | /* Resume management traffic. */ | ||
3376 | ql_mb_set_mgmnt_traffic_ctl(qdev, MB_SET_MPI_TFK_RESUME); | ||
3330 | return status; | 3377 | return status; |
3331 | } | 3378 | } |
3332 | 3379 | ||
@@ -3704,6 +3751,12 @@ static void ql_asic_reset_work(struct work_struct *work) | |||
3704 | status = ql_adapter_up(qdev); | 3751 | status = ql_adapter_up(qdev); |
3705 | if (status) | 3752 | if (status) |
3706 | goto error; | 3753 | goto error; |
3754 | |||
3755 | /* Restore rx mode. */ | ||
3756 | clear_bit(QL_ALLMULTI, &qdev->flags); | ||
3757 | clear_bit(QL_PROMISCUOUS, &qdev->flags); | ||
3758 | qlge_set_multicast_list(qdev->ndev); | ||
3759 | |||
3707 | rtnl_unlock(); | 3760 | rtnl_unlock(); |
3708 | return; | 3761 | return; |
3709 | error: | 3762 | error: |
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index c2e43073047e..99e58e3f8e22 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
@@ -768,6 +768,95 @@ static int ql_idc_wait(struct ql_adapter *qdev) | |||
768 | return status; | 768 | return status; |
769 | } | 769 | } |
770 | 770 | ||
771 | int ql_mb_set_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 control) | ||
772 | { | ||
773 | struct mbox_params mbc; | ||
774 | struct mbox_params *mbcp = &mbc; | ||
775 | int status; | ||
776 | |||
777 | memset(mbcp, 0, sizeof(struct mbox_params)); | ||
778 | |||
779 | mbcp->in_count = 1; | ||
780 | mbcp->out_count = 2; | ||
781 | |||
782 | mbcp->mbox_in[0] = MB_CMD_SET_MGMNT_TFK_CTL; | ||
783 | mbcp->mbox_in[1] = control; | ||
784 | |||
785 | status = ql_mailbox_command(qdev, mbcp); | ||
786 | if (status) | ||
787 | return status; | ||
788 | |||
789 | if (mbcp->mbox_out[0] == MB_CMD_STS_GOOD) | ||
790 | return status; | ||
791 | |||
792 | if (mbcp->mbox_out[0] == MB_CMD_STS_INVLD_CMD) { | ||
793 | QPRINTK(qdev, DRV, ERR, | ||
794 | "Command not supported by firmware.\n"); | ||
795 | status = -EINVAL; | ||
796 | } else if (mbcp->mbox_out[0] == MB_CMD_STS_ERR) { | ||
797 | /* This indicates that the firmware is | ||
798 | * already in the state we are trying to | ||
799 | * change it to. | ||
800 | */ | ||
801 | QPRINTK(qdev, DRV, ERR, | ||
802 | "Command parameters make no change.\n"); | ||
803 | } | ||
804 | return status; | ||
805 | } | ||
806 | |||
807 | /* Returns a negative error code or the mailbox command status. */ | ||
808 | static int ql_mb_get_mgmnt_traffic_ctl(struct ql_adapter *qdev, u32 *control) | ||
809 | { | ||
810 | struct mbox_params mbc; | ||
811 | struct mbox_params *mbcp = &mbc; | ||
812 | int status; | ||
813 | |||
814 | memset(mbcp, 0, sizeof(struct mbox_params)); | ||
815 | *control = 0; | ||
816 | |||
817 | mbcp->in_count = 1; | ||
818 | mbcp->out_count = 1; | ||
819 | |||
820 | mbcp->mbox_in[0] = MB_CMD_GET_MGMNT_TFK_CTL; | ||
821 | |||
822 | status = ql_mailbox_command(qdev, mbcp); | ||
823 | if (status) | ||
824 | return status; | ||
825 | |||
826 | if (mbcp->mbox_out[0] == MB_CMD_STS_GOOD) { | ||
827 | *control = mbcp->mbox_in[1]; | ||
828 | return status; | ||
829 | } | ||
830 | |||
831 | if (mbcp->mbox_out[0] == MB_CMD_STS_INVLD_CMD) { | ||
832 | QPRINTK(qdev, DRV, ERR, | ||
833 | "Command not supported by firmware.\n"); | ||
834 | status = -EINVAL; | ||
835 | } else if (mbcp->mbox_out[0] == MB_CMD_STS_ERR) { | ||
836 | QPRINTK(qdev, DRV, ERR, | ||
837 | "Failed to get MPI traffic control.\n"); | ||
838 | status = -EIO; | ||
839 | } | ||
840 | return status; | ||
841 | } | ||
842 | |||
843 | int ql_wait_fifo_empty(struct ql_adapter *qdev) | ||
844 | { | ||
845 | int count = 5; | ||
846 | u32 mgmnt_fifo_empty; | ||
847 | u32 nic_fifo_empty; | ||
848 | |||
849 | do { | ||
850 | nic_fifo_empty = ql_read32(qdev, STS) & STS_NFE; | ||
851 | ql_mb_get_mgmnt_traffic_ctl(qdev, &mgmnt_fifo_empty); | ||
852 | mgmnt_fifo_empty &= MB_GET_MPI_TFK_FIFO_EMPTY; | ||
853 | if (nic_fifo_empty && mgmnt_fifo_empty) | ||
854 | return 0; | ||
855 | msleep(100); | ||
856 | } while (count-- > 0); | ||
857 | return -ETIMEDOUT; | ||
858 | } | ||
859 | |||
771 | /* API called in work thread context to set new TX/RX | 860 | /* API called in work thread context to set new TX/RX |
772 | * maximum frame size values to match MTU. | 861 | * maximum frame size values to match MTU. |
773 | */ | 862 | */ |
@@ -876,6 +965,8 @@ void ql_mpi_work(struct work_struct *work) | |||
876 | int err = 0; | 965 | int err = 0; |
877 | 966 | ||
878 | rtnl_lock(); | 967 | rtnl_lock(); |
968 | /* Begin polled mode for MPI */ | ||
969 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); | ||
879 | 970 | ||
880 | while (ql_read32(qdev, STS) & STS_PI) { | 971 | while (ql_read32(qdev, STS) & STS_PI) { |
881 | memset(mbcp, 0, sizeof(struct mbox_params)); | 972 | memset(mbcp, 0, sizeof(struct mbox_params)); |
@@ -888,6 +979,8 @@ void ql_mpi_work(struct work_struct *work) | |||
888 | break; | 979 | break; |
889 | } | 980 | } |
890 | 981 | ||
982 | /* End polled mode for MPI */ | ||
983 | ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16) | INTR_MASK_PI); | ||
891 | rtnl_unlock(); | 984 | rtnl_unlock(); |
892 | ql_enable_completion_interrupt(qdev, 0); | 985 | ql_enable_completion_interrupt(qdev, 0); |
893 | } | 986 | } |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index f09bc5dfe8b2..ba5d3fe753b6 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -902,11 +902,12 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) | |||
902 | struct tg3 *tp = bp->priv; | 902 | struct tg3 *tp = bp->priv; |
903 | u32 val; | 903 | u32 val; |
904 | 904 | ||
905 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) | 905 | spin_lock_bh(&tp->lock); |
906 | return -EAGAIN; | ||
907 | 906 | ||
908 | if (tg3_readphy(tp, reg, &val)) | 907 | if (tg3_readphy(tp, reg, &val)) |
909 | return -EIO; | 908 | val = -EIO; |
909 | |||
910 | spin_unlock_bh(&tp->lock); | ||
910 | 911 | ||
911 | return val; | 912 | return val; |
912 | } | 913 | } |
@@ -914,14 +915,16 @@ static int tg3_mdio_read(struct mii_bus *bp, int mii_id, int reg) | |||
914 | static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) | 915 | static int tg3_mdio_write(struct mii_bus *bp, int mii_id, int reg, u16 val) |
915 | { | 916 | { |
916 | struct tg3 *tp = bp->priv; | 917 | struct tg3 *tp = bp->priv; |
918 | u32 ret = 0; | ||
917 | 919 | ||
918 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_PAUSED) | 920 | spin_lock_bh(&tp->lock); |
919 | return -EAGAIN; | ||
920 | 921 | ||
921 | if (tg3_writephy(tp, reg, val)) | 922 | if (tg3_writephy(tp, reg, val)) |
922 | return -EIO; | 923 | ret = -EIO; |
923 | 924 | ||
924 | return 0; | 925 | spin_unlock_bh(&tp->lock); |
926 | |||
927 | return ret; | ||
925 | } | 928 | } |
926 | 929 | ||
927 | static int tg3_mdio_reset(struct mii_bus *bp) | 930 | static int tg3_mdio_reset(struct mii_bus *bp) |
@@ -1011,12 +1014,6 @@ static void tg3_mdio_config_5785(struct tg3 *tp) | |||
1011 | 1014 | ||
1012 | static void tg3_mdio_start(struct tg3 *tp) | 1015 | static void tg3_mdio_start(struct tg3 *tp) |
1013 | { | 1016 | { |
1014 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { | ||
1015 | mutex_lock(&tp->mdio_bus->mdio_lock); | ||
1016 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; | ||
1017 | mutex_unlock(&tp->mdio_bus->mdio_lock); | ||
1018 | } | ||
1019 | |||
1020 | tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; | 1017 | tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; |
1021 | tw32_f(MAC_MI_MODE, tp->mi_mode); | 1018 | tw32_f(MAC_MI_MODE, tp->mi_mode); |
1022 | udelay(80); | 1019 | udelay(80); |
@@ -1041,15 +1038,6 @@ static void tg3_mdio_start(struct tg3 *tp) | |||
1041 | tg3_mdio_config_5785(tp); | 1038 | tg3_mdio_config_5785(tp); |
1042 | } | 1039 | } |
1043 | 1040 | ||
1044 | static void tg3_mdio_stop(struct tg3 *tp) | ||
1045 | { | ||
1046 | if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { | ||
1047 | mutex_lock(&tp->mdio_bus->mdio_lock); | ||
1048 | tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED; | ||
1049 | mutex_unlock(&tp->mdio_bus->mdio_lock); | ||
1050 | } | ||
1051 | } | ||
1052 | |||
1053 | static int tg3_mdio_init(struct tg3 *tp) | 1041 | static int tg3_mdio_init(struct tg3 *tp) |
1054 | { | 1042 | { |
1055 | int i; | 1043 | int i; |
@@ -1141,7 +1129,6 @@ static void tg3_mdio_fini(struct tg3 *tp) | |||
1141 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; | 1129 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; |
1142 | mdiobus_unregister(tp->mdio_bus); | 1130 | mdiobus_unregister(tp->mdio_bus); |
1143 | mdiobus_free(tp->mdio_bus); | 1131 | mdiobus_free(tp->mdio_bus); |
1144 | tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; | ||
1145 | } | 1132 | } |
1146 | } | 1133 | } |
1147 | 1134 | ||
@@ -1363,7 +1350,7 @@ static void tg3_adjust_link(struct net_device *dev) | |||
1363 | struct tg3 *tp = netdev_priv(dev); | 1350 | struct tg3 *tp = netdev_priv(dev); |
1364 | struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; | 1351 | struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; |
1365 | 1352 | ||
1366 | spin_lock(&tp->lock); | 1353 | spin_lock_bh(&tp->lock); |
1367 | 1354 | ||
1368 | mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK | | 1355 | mac_mode = tp->mac_mode & ~(MAC_MODE_PORT_MODE_MASK | |
1369 | MAC_MODE_HALF_DUPLEX); | 1356 | MAC_MODE_HALF_DUPLEX); |
@@ -1431,7 +1418,7 @@ static void tg3_adjust_link(struct net_device *dev) | |||
1431 | tp->link_config.active_speed = phydev->speed; | 1418 | tp->link_config.active_speed = phydev->speed; |
1432 | tp->link_config.active_duplex = phydev->duplex; | 1419 | tp->link_config.active_duplex = phydev->duplex; |
1433 | 1420 | ||
1434 | spin_unlock(&tp->lock); | 1421 | spin_unlock_bh(&tp->lock); |
1435 | 1422 | ||
1436 | if (linkmesg) | 1423 | if (linkmesg) |
1437 | tg3_link_report(tp); | 1424 | tg3_link_report(tp); |
@@ -6392,8 +6379,6 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
6392 | 6379 | ||
6393 | tg3_nvram_lock(tp); | 6380 | tg3_nvram_lock(tp); |
6394 | 6381 | ||
6395 | tg3_mdio_stop(tp); | ||
6396 | |||
6397 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); | 6382 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); |
6398 | 6383 | ||
6399 | /* No matching tg3_nvram_unlock() after this because | 6384 | /* No matching tg3_nvram_unlock() after this because |
@@ -8698,6 +8683,8 @@ static int tg3_close(struct net_device *dev) | |||
8698 | 8683 | ||
8699 | del_timer_sync(&tp->timer); | 8684 | del_timer_sync(&tp->timer); |
8700 | 8685 | ||
8686 | tg3_phy_stop(tp); | ||
8687 | |||
8701 | tg3_full_lock(tp, 1); | 8688 | tg3_full_lock(tp, 1); |
8702 | #if 0 | 8689 | #if 0 |
8703 | tg3_dump_state(tp); | 8690 | tg3_dump_state(tp); |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 524691cd9896..bab7940158e6 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2748,7 +2748,6 @@ struct tg3 { | |||
2748 | #define TG3_FLG3_5701_DMA_BUG 0x00000008 | 2748 | #define TG3_FLG3_5701_DMA_BUG 0x00000008 |
2749 | #define TG3_FLG3_USE_PHYLIB 0x00000010 | 2749 | #define TG3_FLG3_USE_PHYLIB 0x00000010 |
2750 | #define TG3_FLG3_MDIOBUS_INITED 0x00000020 | 2750 | #define TG3_FLG3_MDIOBUS_INITED 0x00000020 |
2751 | #define TG3_FLG3_MDIOBUS_PAUSED 0x00000040 | ||
2752 | #define TG3_FLG3_PHY_CONNECTED 0x00000080 | 2751 | #define TG3_FLG3_PHY_CONNECTED 0x00000080 |
2753 | #define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 | 2752 | #define TG3_FLG3_RGMII_STD_IBND_DISABLE 0x00000100 |
2754 | #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 | 2753 | #define TG3_FLG3_RGMII_EXT_IBND_RX_EN 0x00000200 |
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index d032bba9bc4c..0caa8008c51c 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -418,6 +418,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
418 | goto halt_fail_and_release; | 418 | goto halt_fail_and_release; |
419 | } | 419 | } |
420 | memcpy(net->dev_addr, bp, ETH_ALEN); | 420 | memcpy(net->dev_addr, bp, ETH_ALEN); |
421 | memcpy(net->perm_addr, bp, ETH_ALEN); | ||
421 | 422 | ||
422 | /* set a nonzero filter to enable data transfers */ | 423 | /* set a nonzero filter to enable data transfers */ |
423 | memset(u.set, 0, sizeof *u.set); | 424 | memset(u.set, 0, sizeof *u.set); |
diff --git a/drivers/net/wireless/adm8211.h b/drivers/net/wireless/adm8211.h index 4f6ab1322189..b07e4d3a6b4d 100644 --- a/drivers/net/wireless/adm8211.h +++ b/drivers/net/wireless/adm8211.h | |||
@@ -266,7 +266,7 @@ do { \ | |||
266 | #define ADM8211_SYNCTL_CS1 (1 << 28) | 266 | #define ADM8211_SYNCTL_CS1 (1 << 28) |
267 | #define ADM8211_SYNCTL_CAL (1 << 27) | 267 | #define ADM8211_SYNCTL_CAL (1 << 27) |
268 | #define ADM8211_SYNCTL_SELCAL (1 << 26) | 268 | #define ADM8211_SYNCTL_SELCAL (1 << 26) |
269 | #define ADM8211_SYNCTL_RFtype ((1 << 24) || (1 << 23) || (1 << 22)) | 269 | #define ADM8211_SYNCTL_RFtype ((1 << 24) | (1 << 23) | (1 << 22)) |
270 | #define ADM8211_SYNCTL_RFMD (1 << 22) | 270 | #define ADM8211_SYNCTL_RFMD (1 << 22) |
271 | #define ADM8211_SYNCTL_GENERAL (0x7 << 22) | 271 | #define ADM8211_SYNCTL_GENERAL (0x7 << 22) |
272 | /* SYNCTL 21:0 Data (Si4126: 18-bit data, 4-bit address) */ | 272 | /* SYNCTL 21:0 Data (Si4126: 18-bit data, 4-bit address) */ |
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index fa1549a03c71..660716214d49 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
@@ -607,82 +607,7 @@ struct b43_qos_params { | |||
607 | struct ieee80211_tx_queue_params p; | 607 | struct ieee80211_tx_queue_params p; |
608 | }; | 608 | }; |
609 | 609 | ||
610 | struct b43_wldev; | 610 | struct b43_wl; |
611 | |||
612 | /* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */ | ||
613 | struct b43_wl { | ||
614 | /* Pointer to the active wireless device on this chip */ | ||
615 | struct b43_wldev *current_dev; | ||
616 | /* Pointer to the ieee80211 hardware data structure */ | ||
617 | struct ieee80211_hw *hw; | ||
618 | |||
619 | /* Global driver mutex. Every operation must run with this mutex locked. */ | ||
620 | struct mutex mutex; | ||
621 | /* Hard-IRQ spinlock. This lock protects things used in the hard-IRQ | ||
622 | * handler, only. This basically is just the IRQ mask register. */ | ||
623 | spinlock_t hardirq_lock; | ||
624 | |||
625 | /* The number of queues that were registered with the mac80211 subsystem | ||
626 | * initially. This is a backup copy of hw->queues in case hw->queues has | ||
627 | * to be dynamically lowered at runtime (Firmware does not support QoS). | ||
628 | * hw->queues has to be restored to the original value before unregistering | ||
629 | * from the mac80211 subsystem. */ | ||
630 | u16 mac80211_initially_registered_queues; | ||
631 | |||
632 | /* We can only have one operating interface (802.11 core) | ||
633 | * at a time. General information about this interface follows. | ||
634 | */ | ||
635 | |||
636 | struct ieee80211_vif *vif; | ||
637 | /* The MAC address of the operating interface. */ | ||
638 | u8 mac_addr[ETH_ALEN]; | ||
639 | /* Current BSSID */ | ||
640 | u8 bssid[ETH_ALEN]; | ||
641 | /* Interface type. (NL80211_IFTYPE_XXX) */ | ||
642 | int if_type; | ||
643 | /* Is the card operating in AP, STA or IBSS mode? */ | ||
644 | bool operating; | ||
645 | /* filter flags */ | ||
646 | unsigned int filter_flags; | ||
647 | /* Stats about the wireless interface */ | ||
648 | struct ieee80211_low_level_stats ieee_stats; | ||
649 | |||
650 | #ifdef CONFIG_B43_HWRNG | ||
651 | struct hwrng rng; | ||
652 | bool rng_initialized; | ||
653 | char rng_name[30 + 1]; | ||
654 | #endif /* CONFIG_B43_HWRNG */ | ||
655 | |||
656 | /* List of all wireless devices on this chip */ | ||
657 | struct list_head devlist; | ||
658 | u8 nr_devs; | ||
659 | |||
660 | bool radiotap_enabled; | ||
661 | bool radio_enabled; | ||
662 | |||
663 | /* The beacon we are currently using (AP or IBSS mode). */ | ||
664 | struct sk_buff *current_beacon; | ||
665 | bool beacon0_uploaded; | ||
666 | bool beacon1_uploaded; | ||
667 | bool beacon_templates_virgin; /* Never wrote the templates? */ | ||
668 | struct work_struct beacon_update_trigger; | ||
669 | |||
670 | /* The current QOS parameters for the 4 queues. */ | ||
671 | struct b43_qos_params qos_params[4]; | ||
672 | |||
673 | /* Work for adjustment of the transmission power. | ||
674 | * This is scheduled when we determine that the actual TX output | ||
675 | * power doesn't match what we want. */ | ||
676 | struct work_struct txpower_adjust_work; | ||
677 | |||
678 | /* Packet transmit work */ | ||
679 | struct work_struct tx_work; | ||
680 | /* Queue of packets to be transmitted. */ | ||
681 | struct sk_buff_head tx_queue; | ||
682 | |||
683 | /* The device LEDs. */ | ||
684 | struct b43_leds leds; | ||
685 | }; | ||
686 | 611 | ||
687 | /* The type of the firmware file. */ | 612 | /* The type of the firmware file. */ |
688 | enum b43_firmware_file_type { | 613 | enum b43_firmware_file_type { |
@@ -824,6 +749,97 @@ struct b43_wldev { | |||
824 | #endif | 749 | #endif |
825 | }; | 750 | }; |
826 | 751 | ||
752 | /* | ||
753 | * Include goes here to avoid a dependency problem. | ||
754 | * A better fix would be to integrate xmit.h into b43.h. | ||
755 | */ | ||
756 | #include "xmit.h" | ||
757 | |||
758 | /* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */ | ||
759 | struct b43_wl { | ||
760 | /* Pointer to the active wireless device on this chip */ | ||
761 | struct b43_wldev *current_dev; | ||
762 | /* Pointer to the ieee80211 hardware data structure */ | ||
763 | struct ieee80211_hw *hw; | ||
764 | |||
765 | /* Global driver mutex. Every operation must run with this mutex locked. */ | ||
766 | struct mutex mutex; | ||
767 | /* Hard-IRQ spinlock. This lock protects things used in the hard-IRQ | ||
768 | * handler, only. This basically is just the IRQ mask register. */ | ||
769 | spinlock_t hardirq_lock; | ||
770 | |||
771 | /* The number of queues that were registered with the mac80211 subsystem | ||
772 | * initially. This is a backup copy of hw->queues in case hw->queues has | ||
773 | * to be dynamically lowered at runtime (Firmware does not support QoS). | ||
774 | * hw->queues has to be restored to the original value before unregistering | ||
775 | * from the mac80211 subsystem. */ | ||
776 | u16 mac80211_initially_registered_queues; | ||
777 | |||
778 | /* We can only have one operating interface (802.11 core) | ||
779 | * at a time. General information about this interface follows. | ||
780 | */ | ||
781 | |||
782 | struct ieee80211_vif *vif; | ||
783 | /* The MAC address of the operating interface. */ | ||
784 | u8 mac_addr[ETH_ALEN]; | ||
785 | /* Current BSSID */ | ||
786 | u8 bssid[ETH_ALEN]; | ||
787 | /* Interface type. (NL80211_IFTYPE_XXX) */ | ||
788 | int if_type; | ||
789 | /* Is the card operating in AP, STA or IBSS mode? */ | ||
790 | bool operating; | ||
791 | /* filter flags */ | ||
792 | unsigned int filter_flags; | ||
793 | /* Stats about the wireless interface */ | ||
794 | struct ieee80211_low_level_stats ieee_stats; | ||
795 | |||
796 | #ifdef CONFIG_B43_HWRNG | ||
797 | struct hwrng rng; | ||
798 | bool rng_initialized; | ||
799 | char rng_name[30 + 1]; | ||
800 | #endif /* CONFIG_B43_HWRNG */ | ||
801 | |||
802 | /* List of all wireless devices on this chip */ | ||
803 | struct list_head devlist; | ||
804 | u8 nr_devs; | ||
805 | |||
806 | bool radiotap_enabled; | ||
807 | bool radio_enabled; | ||
808 | |||
809 | /* The beacon we are currently using (AP or IBSS mode). */ | ||
810 | struct sk_buff *current_beacon; | ||
811 | bool beacon0_uploaded; | ||
812 | bool beacon1_uploaded; | ||
813 | bool beacon_templates_virgin; /* Never wrote the templates? */ | ||
814 | struct work_struct beacon_update_trigger; | ||
815 | |||
816 | /* The current QOS parameters for the 4 queues. */ | ||
817 | struct b43_qos_params qos_params[4]; | ||
818 | |||
819 | /* Work for adjustment of the transmission power. | ||
820 | * This is scheduled when we determine that the actual TX output | ||
821 | * power doesn't match what we want. */ | ||
822 | struct work_struct txpower_adjust_work; | ||
823 | |||
824 | /* Packet transmit work */ | ||
825 | struct work_struct tx_work; | ||
826 | /* Queue of packets to be transmitted. */ | ||
827 | struct sk_buff_head tx_queue; | ||
828 | |||
829 | /* The device LEDs. */ | ||
830 | struct b43_leds leds; | ||
831 | |||
832 | #ifdef CONFIG_B43_PIO | ||
833 | /* | ||
834 | * RX/TX header/tail buffers used by the frame transmit functions. | ||
835 | */ | ||
836 | struct b43_rxhdr_fw4 rxhdr; | ||
837 | struct b43_txhdr txhdr; | ||
838 | u8 rx_tail[4]; | ||
839 | u8 tx_tail[4]; | ||
840 | #endif /* CONFIG_B43_PIO */ | ||
841 | }; | ||
842 | |||
827 | static inline struct b43_wl *hw_to_b43_wl(struct ieee80211_hw *hw) | 843 | static inline struct b43_wl *hw_to_b43_wl(struct ieee80211_hw *hw) |
828 | { | 844 | { |
829 | return hw->priv; | 845 | return hw->priv; |
diff --git a/drivers/net/wireless/b43/leds.c b/drivers/net/wireless/b43/leds.c index fbe3d4f62ce2..1e8dba488004 100644 --- a/drivers/net/wireless/b43/leds.c +++ b/drivers/net/wireless/b43/leds.c | |||
@@ -348,9 +348,9 @@ void b43_leds_register(struct b43_wldev *dev) | |||
348 | } | 348 | } |
349 | } | 349 | } |
350 | 350 | ||
351 | void b43_leds_unregister(struct b43_wldev *dev) | 351 | void b43_leds_unregister(struct b43_wl *wl) |
352 | { | 352 | { |
353 | struct b43_leds *leds = &dev->wl->leds; | 353 | struct b43_leds *leds = &wl->leds; |
354 | 354 | ||
355 | b43_unregister_led(&leds->led_tx); | 355 | b43_unregister_led(&leds->led_tx); |
356 | b43_unregister_led(&leds->led_rx); | 356 | b43_unregister_led(&leds->led_rx); |
diff --git a/drivers/net/wireless/b43/leds.h b/drivers/net/wireless/b43/leds.h index 9592e4c5a5f5..4c56187810fc 100644 --- a/drivers/net/wireless/b43/leds.h +++ b/drivers/net/wireless/b43/leds.h | |||
@@ -60,7 +60,7 @@ enum b43_led_behaviour { | |||
60 | }; | 60 | }; |
61 | 61 | ||
62 | void b43_leds_register(struct b43_wldev *dev); | 62 | void b43_leds_register(struct b43_wldev *dev); |
63 | void b43_leds_unregister(struct b43_wldev *dev); | 63 | void b43_leds_unregister(struct b43_wl *wl); |
64 | void b43_leds_init(struct b43_wldev *dev); | 64 | void b43_leds_init(struct b43_wldev *dev); |
65 | void b43_leds_exit(struct b43_wldev *dev); | 65 | void b43_leds_exit(struct b43_wldev *dev); |
66 | void b43_leds_stop(struct b43_wldev *dev); | 66 | void b43_leds_stop(struct b43_wldev *dev); |
@@ -76,7 +76,7 @@ struct b43_leds { | |||
76 | static inline void b43_leds_register(struct b43_wldev *dev) | 76 | static inline void b43_leds_register(struct b43_wldev *dev) |
77 | { | 77 | { |
78 | } | 78 | } |
79 | static inline void b43_leds_unregister(struct b43_wldev *dev) | 79 | static inline void b43_leds_unregister(struct b43_wl *wl) |
80 | { | 80 | { |
81 | } | 81 | } |
82 | static inline void b43_leds_init(struct b43_wldev *dev) | 82 | static inline void b43_leds_init(struct b43_wldev *dev) |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 9b907a36bb8c..df6b26a0c05e 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -3874,6 +3874,7 @@ static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev) | |||
3874 | { | 3874 | { |
3875 | struct b43_wl *wl = dev->wl; | 3875 | struct b43_wl *wl = dev->wl; |
3876 | struct b43_wldev *orig_dev; | 3876 | struct b43_wldev *orig_dev; |
3877 | u32 mask; | ||
3877 | 3878 | ||
3878 | redo: | 3879 | redo: |
3879 | if (!dev || b43_status(dev) < B43_STAT_STARTED) | 3880 | if (!dev || b43_status(dev) < B43_STAT_STARTED) |
@@ -3920,7 +3921,8 @@ redo: | |||
3920 | goto redo; | 3921 | goto redo; |
3921 | return dev; | 3922 | return dev; |
3922 | } | 3923 | } |
3923 | B43_WARN_ON(b43_read32(dev, B43_MMIO_GEN_IRQ_MASK)); | 3924 | mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); |
3925 | B43_WARN_ON(mask != 0xFFFFFFFF && mask); | ||
3924 | 3926 | ||
3925 | /* Drain the TX queue */ | 3927 | /* Drain the TX queue */ |
3926 | while (skb_queue_len(&wl->tx_queue)) | 3928 | while (skb_queue_len(&wl->tx_queue)) |
@@ -4499,6 +4501,7 @@ static void b43_op_stop(struct ieee80211_hw *hw) | |||
4499 | 4501 | ||
4500 | cancel_work_sync(&(wl->beacon_update_trigger)); | 4502 | cancel_work_sync(&(wl->beacon_update_trigger)); |
4501 | 4503 | ||
4504 | wiphy_rfkill_stop_polling(hw->wiphy); | ||
4502 | mutex_lock(&wl->mutex); | 4505 | mutex_lock(&wl->mutex); |
4503 | if (b43_status(dev) >= B43_STAT_STARTED) { | 4506 | if (b43_status(dev) >= B43_STAT_STARTED) { |
4504 | dev = b43_wireless_core_stop(dev); | 4507 | dev = b43_wireless_core_stop(dev); |
@@ -4997,7 +5000,7 @@ static void b43_remove(struct ssb_device *dev) | |||
4997 | 5000 | ||
4998 | if (list_empty(&wl->devlist)) { | 5001 | if (list_empty(&wl->devlist)) { |
4999 | b43_rng_exit(wl); | 5002 | b43_rng_exit(wl); |
5000 | b43_leds_unregister(wldev); | 5003 | b43_leds_unregister(wl); |
5001 | /* Last core on the chip unregistered. | 5004 | /* Last core on the chip unregistered. |
5002 | * We can destroy common struct b43_wl. | 5005 | * We can destroy common struct b43_wl. |
5003 | */ | 5006 | */ |
diff --git a/drivers/net/wireless/b43/pio.c b/drivers/net/wireless/b43/pio.c index 9c1397996e0a..dbbf0d11e18e 100644 --- a/drivers/net/wireless/b43/pio.c +++ b/drivers/net/wireless/b43/pio.c | |||
@@ -331,6 +331,7 @@ static u16 tx_write_2byte_queue(struct b43_pio_txqueue *q, | |||
331 | unsigned int data_len) | 331 | unsigned int data_len) |
332 | { | 332 | { |
333 | struct b43_wldev *dev = q->dev; | 333 | struct b43_wldev *dev = q->dev; |
334 | struct b43_wl *wl = dev->wl; | ||
334 | const u8 *data = _data; | 335 | const u8 *data = _data; |
335 | 336 | ||
336 | ctl |= B43_PIO_TXCTL_WRITELO | B43_PIO_TXCTL_WRITEHI; | 337 | ctl |= B43_PIO_TXCTL_WRITELO | B43_PIO_TXCTL_WRITEHI; |
@@ -340,13 +341,12 @@ static u16 tx_write_2byte_queue(struct b43_pio_txqueue *q, | |||
340 | q->mmio_base + B43_PIO_TXDATA, | 341 | q->mmio_base + B43_PIO_TXDATA, |
341 | sizeof(u16)); | 342 | sizeof(u16)); |
342 | if (data_len & 1) { | 343 | if (data_len & 1) { |
343 | u8 tail[2] = { 0, }; | ||
344 | |||
345 | /* Write the last byte. */ | 344 | /* Write the last byte. */ |
346 | ctl &= ~B43_PIO_TXCTL_WRITEHI; | 345 | ctl &= ~B43_PIO_TXCTL_WRITEHI; |
347 | b43_piotx_write16(q, B43_PIO_TXCTL, ctl); | 346 | b43_piotx_write16(q, B43_PIO_TXCTL, ctl); |
348 | tail[0] = data[data_len - 1]; | 347 | wl->tx_tail[0] = data[data_len - 1]; |
349 | ssb_block_write(dev->dev, tail, 2, | 348 | wl->tx_tail[1] = 0; |
349 | ssb_block_write(dev->dev, wl->tx_tail, 2, | ||
350 | q->mmio_base + B43_PIO_TXDATA, | 350 | q->mmio_base + B43_PIO_TXDATA, |
351 | sizeof(u16)); | 351 | sizeof(u16)); |
352 | } | 352 | } |
@@ -381,6 +381,7 @@ static u32 tx_write_4byte_queue(struct b43_pio_txqueue *q, | |||
381 | unsigned int data_len) | 381 | unsigned int data_len) |
382 | { | 382 | { |
383 | struct b43_wldev *dev = q->dev; | 383 | struct b43_wldev *dev = q->dev; |
384 | struct b43_wl *wl = dev->wl; | ||
384 | const u8 *data = _data; | 385 | const u8 *data = _data; |
385 | 386 | ||
386 | ctl |= B43_PIO8_TXCTL_0_7 | B43_PIO8_TXCTL_8_15 | | 387 | ctl |= B43_PIO8_TXCTL_0_7 | B43_PIO8_TXCTL_8_15 | |
@@ -391,29 +392,31 @@ static u32 tx_write_4byte_queue(struct b43_pio_txqueue *q, | |||
391 | q->mmio_base + B43_PIO8_TXDATA, | 392 | q->mmio_base + B43_PIO8_TXDATA, |
392 | sizeof(u32)); | 393 | sizeof(u32)); |
393 | if (data_len & 3) { | 394 | if (data_len & 3) { |
394 | u8 tail[4] = { 0, }; | 395 | wl->tx_tail[3] = 0; |
395 | |||
396 | /* Write the last few bytes. */ | 396 | /* Write the last few bytes. */ |
397 | ctl &= ~(B43_PIO8_TXCTL_8_15 | B43_PIO8_TXCTL_16_23 | | 397 | ctl &= ~(B43_PIO8_TXCTL_8_15 | B43_PIO8_TXCTL_16_23 | |
398 | B43_PIO8_TXCTL_24_31); | 398 | B43_PIO8_TXCTL_24_31); |
399 | switch (data_len & 3) { | 399 | switch (data_len & 3) { |
400 | case 3: | 400 | case 3: |
401 | ctl |= B43_PIO8_TXCTL_16_23 | B43_PIO8_TXCTL_8_15; | 401 | ctl |= B43_PIO8_TXCTL_16_23 | B43_PIO8_TXCTL_8_15; |
402 | tail[0] = data[data_len - 3]; | 402 | wl->tx_tail[0] = data[data_len - 3]; |
403 | tail[1] = data[data_len - 2]; | 403 | wl->tx_tail[1] = data[data_len - 2]; |
404 | tail[2] = data[data_len - 1]; | 404 | wl->tx_tail[2] = data[data_len - 1]; |
405 | break; | 405 | break; |
406 | case 2: | 406 | case 2: |
407 | ctl |= B43_PIO8_TXCTL_8_15; | 407 | ctl |= B43_PIO8_TXCTL_8_15; |
408 | tail[0] = data[data_len - 2]; | 408 | wl->tx_tail[0] = data[data_len - 2]; |
409 | tail[1] = data[data_len - 1]; | 409 | wl->tx_tail[1] = data[data_len - 1]; |
410 | wl->tx_tail[2] = 0; | ||
410 | break; | 411 | break; |
411 | case 1: | 412 | case 1: |
412 | tail[0] = data[data_len - 1]; | 413 | wl->tx_tail[0] = data[data_len - 1]; |
414 | wl->tx_tail[1] = 0; | ||
415 | wl->tx_tail[2] = 0; | ||
413 | break; | 416 | break; |
414 | } | 417 | } |
415 | b43_piotx_write32(q, B43_PIO8_TXCTL, ctl); | 418 | b43_piotx_write32(q, B43_PIO8_TXCTL, ctl); |
416 | ssb_block_write(dev->dev, tail, 4, | 419 | ssb_block_write(dev->dev, wl->tx_tail, 4, |
417 | q->mmio_base + B43_PIO8_TXDATA, | 420 | q->mmio_base + B43_PIO8_TXDATA, |
418 | sizeof(u32)); | 421 | sizeof(u32)); |
419 | } | 422 | } |
@@ -445,8 +448,9 @@ static void pio_tx_frame_4byte_queue(struct b43_pio_txpacket *pack, | |||
445 | static int pio_tx_frame(struct b43_pio_txqueue *q, | 448 | static int pio_tx_frame(struct b43_pio_txqueue *q, |
446 | struct sk_buff *skb) | 449 | struct sk_buff *skb) |
447 | { | 450 | { |
451 | struct b43_wldev *dev = q->dev; | ||
452 | struct b43_wl *wl = dev->wl; | ||
448 | struct b43_pio_txpacket *pack; | 453 | struct b43_pio_txpacket *pack; |
449 | struct b43_txhdr txhdr; | ||
450 | u16 cookie; | 454 | u16 cookie; |
451 | int err; | 455 | int err; |
452 | unsigned int hdrlen; | 456 | unsigned int hdrlen; |
@@ -457,8 +461,8 @@ static int pio_tx_frame(struct b43_pio_txqueue *q, | |||
457 | struct b43_pio_txpacket, list); | 461 | struct b43_pio_txpacket, list); |
458 | 462 | ||
459 | cookie = generate_cookie(q, pack); | 463 | cookie = generate_cookie(q, pack); |
460 | hdrlen = b43_txhdr_size(q->dev); | 464 | hdrlen = b43_txhdr_size(dev); |
461 | err = b43_generate_txhdr(q->dev, (u8 *)&txhdr, skb, | 465 | err = b43_generate_txhdr(dev, (u8 *)&wl->txhdr, skb, |
462 | info, cookie); | 466 | info, cookie); |
463 | if (err) | 467 | if (err) |
464 | return err; | 468 | return err; |
@@ -466,15 +470,15 @@ static int pio_tx_frame(struct b43_pio_txqueue *q, | |||
466 | if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) { | 470 | if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) { |
467 | /* Tell the firmware about the cookie of the last | 471 | /* Tell the firmware about the cookie of the last |
468 | * mcast frame, so it can clear the more-data bit in it. */ | 472 | * mcast frame, so it can clear the more-data bit in it. */ |
469 | b43_shm_write16(q->dev, B43_SHM_SHARED, | 473 | b43_shm_write16(dev, B43_SHM_SHARED, |
470 | B43_SHM_SH_MCASTCOOKIE, cookie); | 474 | B43_SHM_SH_MCASTCOOKIE, cookie); |
471 | } | 475 | } |
472 | 476 | ||
473 | pack->skb = skb; | 477 | pack->skb = skb; |
474 | if (q->rev >= 8) | 478 | if (q->rev >= 8) |
475 | pio_tx_frame_4byte_queue(pack, (const u8 *)&txhdr, hdrlen); | 479 | pio_tx_frame_4byte_queue(pack, (const u8 *)&wl->txhdr, hdrlen); |
476 | else | 480 | else |
477 | pio_tx_frame_2byte_queue(pack, (const u8 *)&txhdr, hdrlen); | 481 | pio_tx_frame_2byte_queue(pack, (const u8 *)&wl->txhdr, hdrlen); |
478 | 482 | ||
479 | /* Remove it from the list of available packet slots. | 483 | /* Remove it from the list of available packet slots. |
480 | * It will be put back when we receive the status report. */ | 484 | * It will be put back when we receive the status report. */ |
@@ -614,14 +618,14 @@ void b43_pio_get_tx_stats(struct b43_wldev *dev, | |||
614 | static bool pio_rx_frame(struct b43_pio_rxqueue *q) | 618 | static bool pio_rx_frame(struct b43_pio_rxqueue *q) |
615 | { | 619 | { |
616 | struct b43_wldev *dev = q->dev; | 620 | struct b43_wldev *dev = q->dev; |
617 | struct b43_rxhdr_fw4 rxhdr; | 621 | struct b43_wl *wl = dev->wl; |
618 | u16 len; | 622 | u16 len; |
619 | u32 macstat; | 623 | u32 macstat; |
620 | unsigned int i, padding; | 624 | unsigned int i, padding; |
621 | struct sk_buff *skb; | 625 | struct sk_buff *skb; |
622 | const char *err_msg = NULL; | 626 | const char *err_msg = NULL; |
623 | 627 | ||
624 | memset(&rxhdr, 0, sizeof(rxhdr)); | 628 | memset(&wl->rxhdr, 0, sizeof(wl->rxhdr)); |
625 | 629 | ||
626 | /* Check if we have data and wait for it to get ready. */ | 630 | /* Check if we have data and wait for it to get ready. */ |
627 | if (q->rev >= 8) { | 631 | if (q->rev >= 8) { |
@@ -659,16 +663,16 @@ data_ready: | |||
659 | 663 | ||
660 | /* Get the preamble (RX header) */ | 664 | /* Get the preamble (RX header) */ |
661 | if (q->rev >= 8) { | 665 | if (q->rev >= 8) { |
662 | ssb_block_read(dev->dev, &rxhdr, sizeof(rxhdr), | 666 | ssb_block_read(dev->dev, &wl->rxhdr, sizeof(wl->rxhdr), |
663 | q->mmio_base + B43_PIO8_RXDATA, | 667 | q->mmio_base + B43_PIO8_RXDATA, |
664 | sizeof(u32)); | 668 | sizeof(u32)); |
665 | } else { | 669 | } else { |
666 | ssb_block_read(dev->dev, &rxhdr, sizeof(rxhdr), | 670 | ssb_block_read(dev->dev, &wl->rxhdr, sizeof(wl->rxhdr), |
667 | q->mmio_base + B43_PIO_RXDATA, | 671 | q->mmio_base + B43_PIO_RXDATA, |
668 | sizeof(u16)); | 672 | sizeof(u16)); |
669 | } | 673 | } |
670 | /* Sanity checks. */ | 674 | /* Sanity checks. */ |
671 | len = le16_to_cpu(rxhdr.frame_len); | 675 | len = le16_to_cpu(wl->rxhdr.frame_len); |
672 | if (unlikely(len > 0x700)) { | 676 | if (unlikely(len > 0x700)) { |
673 | err_msg = "len > 0x700"; | 677 | err_msg = "len > 0x700"; |
674 | goto rx_error; | 678 | goto rx_error; |
@@ -678,7 +682,7 @@ data_ready: | |||
678 | goto rx_error; | 682 | goto rx_error; |
679 | } | 683 | } |
680 | 684 | ||
681 | macstat = le32_to_cpu(rxhdr.mac_status); | 685 | macstat = le32_to_cpu(wl->rxhdr.mac_status); |
682 | if (macstat & B43_RX_MAC_FCSERR) { | 686 | if (macstat & B43_RX_MAC_FCSERR) { |
683 | if (!(q->dev->wl->filter_flags & FIF_FCSFAIL)) { | 687 | if (!(q->dev->wl->filter_flags & FIF_FCSFAIL)) { |
684 | /* Drop frames with failed FCS. */ | 688 | /* Drop frames with failed FCS. */ |
@@ -703,24 +707,22 @@ data_ready: | |||
703 | q->mmio_base + B43_PIO8_RXDATA, | 707 | q->mmio_base + B43_PIO8_RXDATA, |
704 | sizeof(u32)); | 708 | sizeof(u32)); |
705 | if (len & 3) { | 709 | if (len & 3) { |
706 | u8 tail[4] = { 0, }; | ||
707 | |||
708 | /* Read the last few bytes. */ | 710 | /* Read the last few bytes. */ |
709 | ssb_block_read(dev->dev, tail, 4, | 711 | ssb_block_read(dev->dev, wl->rx_tail, 4, |
710 | q->mmio_base + B43_PIO8_RXDATA, | 712 | q->mmio_base + B43_PIO8_RXDATA, |
711 | sizeof(u32)); | 713 | sizeof(u32)); |
712 | switch (len & 3) { | 714 | switch (len & 3) { |
713 | case 3: | 715 | case 3: |
714 | skb->data[len + padding - 3] = tail[0]; | 716 | skb->data[len + padding - 3] = wl->rx_tail[0]; |
715 | skb->data[len + padding - 2] = tail[1]; | 717 | skb->data[len + padding - 2] = wl->rx_tail[1]; |
716 | skb->data[len + padding - 1] = tail[2]; | 718 | skb->data[len + padding - 1] = wl->rx_tail[2]; |
717 | break; | 719 | break; |
718 | case 2: | 720 | case 2: |
719 | skb->data[len + padding - 2] = tail[0]; | 721 | skb->data[len + padding - 2] = wl->rx_tail[0]; |
720 | skb->data[len + padding - 1] = tail[1]; | 722 | skb->data[len + padding - 1] = wl->rx_tail[1]; |
721 | break; | 723 | break; |
722 | case 1: | 724 | case 1: |
723 | skb->data[len + padding - 1] = tail[0]; | 725 | skb->data[len + padding - 1] = wl->rx_tail[0]; |
724 | break; | 726 | break; |
725 | } | 727 | } |
726 | } | 728 | } |
@@ -729,17 +731,15 @@ data_ready: | |||
729 | q->mmio_base + B43_PIO_RXDATA, | 731 | q->mmio_base + B43_PIO_RXDATA, |
730 | sizeof(u16)); | 732 | sizeof(u16)); |
731 | if (len & 1) { | 733 | if (len & 1) { |
732 | u8 tail[2] = { 0, }; | ||
733 | |||
734 | /* Read the last byte. */ | 734 | /* Read the last byte. */ |
735 | ssb_block_read(dev->dev, tail, 2, | 735 | ssb_block_read(dev->dev, wl->rx_tail, 2, |
736 | q->mmio_base + B43_PIO_RXDATA, | 736 | q->mmio_base + B43_PIO_RXDATA, |
737 | sizeof(u16)); | 737 | sizeof(u16)); |
738 | skb->data[len + padding - 1] = tail[0]; | 738 | skb->data[len + padding - 1] = wl->rx_tail[0]; |
739 | } | 739 | } |
740 | } | 740 | } |
741 | 741 | ||
742 | b43_rx(q->dev, skb, &rxhdr); | 742 | b43_rx(q->dev, skb, &wl->rxhdr); |
743 | 743 | ||
744 | return 1; | 744 | return 1; |
745 | 745 | ||
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index ac9f600995e4..892573b27d50 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "xmit.h" | 30 | #include "b43.h" |
31 | #include "phy_common.h" | 31 | #include "phy_common.h" |
32 | #include "dma.h" | 32 | #include "dma.h" |
33 | #include "pio.h" | 33 | #include "pio.h" |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index a16bd4147eac..cbb0585083a9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c | |||
@@ -702,7 +702,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, | |||
702 | u8 sta_id = iwl_find_station(priv, hdr->addr1); | 702 | u8 sta_id = iwl_find_station(priv, hdr->addr1); |
703 | 703 | ||
704 | if (sta_id == IWL_INVALID_STATION) { | 704 | if (sta_id == IWL_INVALID_STATION) { |
705 | IWL_DEBUG_RATE(priv, "LQ: ADD station %pm\n", | 705 | IWL_DEBUG_RATE(priv, "LQ: ADD station %pM\n", |
706 | hdr->addr1); | 706 | hdr->addr1); |
707 | sta_id = iwl_add_station(priv, hdr->addr1, false, | 707 | sta_id = iwl_add_station(priv, hdr->addr1, false, |
708 | CMD_ASYNC, NULL); | 708 | CMD_ASYNC, NULL); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index ced0e33e44b2..4115672e2338 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -607,7 +607,7 @@ static void iwl3945_rx_reply_rx(struct iwl_priv *priv, | |||
607 | if (rx_status.band == IEEE80211_BAND_5GHZ) | 607 | if (rx_status.band == IEEE80211_BAND_5GHZ) |
608 | rx_status.rate_idx -= IWL_FIRST_OFDM_RATE; | 608 | rx_status.rate_idx -= IWL_FIRST_OFDM_RATE; |
609 | 609 | ||
610 | rx_status.antenna = le16_to_cpu(rx_hdr->phy_flags & | 610 | rx_status.antenna = (le16_to_cpu(rx_hdr->phy_flags) & |
611 | RX_RES_PHY_FLAGS_ANTENNA_MSK) >> 4; | 611 | RX_RES_PHY_FLAGS_ANTENNA_MSK) >> 4; |
612 | 612 | ||
613 | /* set the preamble flag if appropriate */ | 613 | /* set the preamble flag if appropriate */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 98baf8af6da8..8cc3d50e7f59 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -283,7 +283,7 @@ static void iwl5000_gain_computation(struct iwl_priv *priv, | |||
283 | (s32)average_noise[i])) / 1500; | 283 | (s32)average_noise[i])) / 1500; |
284 | /* bound gain by 2 bits value max, 3rd bit is sign */ | 284 | /* bound gain by 2 bits value max, 3rd bit is sign */ |
285 | data->delta_gain_code[i] = | 285 | data->delta_gain_code[i] = |
286 | min(abs(delta_g), CHAIN_NOISE_MAX_DELTA_GAIN_CODE); | 286 | min(abs(delta_g), (long) CHAIN_NOISE_MAX_DELTA_GAIN_CODE); |
287 | 287 | ||
288 | if (delta_g < 0) | 288 | if (delta_g < 0) |
289 | /* set negative sign */ | 289 | /* set negative sign */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index e5f40f35dc3f..ba3e4c837d87 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -1164,7 +1164,7 @@ struct iwl_wep_cmd { | |||
1164 | #define RX_RES_PHY_FLAGS_MOD_CCK_MSK cpu_to_le16(1 << 1) | 1164 | #define RX_RES_PHY_FLAGS_MOD_CCK_MSK cpu_to_le16(1 << 1) |
1165 | #define RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK cpu_to_le16(1 << 2) | 1165 | #define RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK cpu_to_le16(1 << 2) |
1166 | #define RX_RES_PHY_FLAGS_NARROW_BAND_MSK cpu_to_le16(1 << 3) | 1166 | #define RX_RES_PHY_FLAGS_NARROW_BAND_MSK cpu_to_le16(1 << 3) |
1167 | #define RX_RES_PHY_FLAGS_ANTENNA_MSK cpu_to_le16(0xf0) | 1167 | #define RX_RES_PHY_FLAGS_ANTENNA_MSK 0xf0 |
1168 | #define RX_RES_PHY_FLAGS_ANTENNA_POS 4 | 1168 | #define RX_RES_PHY_FLAGS_ANTENNA_POS 4 |
1169 | 1169 | ||
1170 | #define RX_RES_STATUS_SEC_TYPE_MSK (0x7 << 8) | 1170 | #define RX_RES_STATUS_SEC_TYPE_MSK (0x7 << 8) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index e3dbd79cd13e..2e8c40576d22 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -436,7 +436,6 @@ static int iwl_find_otp_image(struct iwl_priv *priv, | |||
436 | u16 *validblockaddr) | 436 | u16 *validblockaddr) |
437 | { | 437 | { |
438 | u16 next_link_addr = 0, link_value = 0, valid_addr; | 438 | u16 next_link_addr = 0, link_value = 0, valid_addr; |
439 | int ret = 0; | ||
440 | int usedblocks = 0; | 439 | int usedblocks = 0; |
441 | 440 | ||
442 | /* set addressing mode to absolute to traverse the link list */ | 441 | /* set addressing mode to absolute to traverse the link list */ |
@@ -456,29 +455,29 @@ static int iwl_find_otp_image(struct iwl_priv *priv, | |||
456 | * check for more block on the link list | 455 | * check for more block on the link list |
457 | */ | 456 | */ |
458 | valid_addr = next_link_addr; | 457 | valid_addr = next_link_addr; |
459 | next_link_addr = link_value; | 458 | next_link_addr = link_value * sizeof(u16); |
460 | IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n", | 459 | IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n", |
461 | usedblocks, next_link_addr); | 460 | usedblocks, next_link_addr); |
462 | if (iwl_read_otp_word(priv, next_link_addr, &link_value)) | 461 | if (iwl_read_otp_word(priv, next_link_addr, &link_value)) |
463 | return -EINVAL; | 462 | return -EINVAL; |
464 | if (!link_value) { | 463 | if (!link_value) { |
465 | /* | 464 | /* |
466 | * reach the end of link list, | 465 | * reach the end of link list, return success and |
467 | * set address point to the starting address | 466 | * set address point to the starting address |
468 | * of the image | 467 | * of the image |
469 | */ | 468 | */ |
470 | goto done; | 469 | *validblockaddr = valid_addr; |
470 | /* skip first 2 bytes (link list pointer) */ | ||
471 | *validblockaddr += 2; | ||
472 | return 0; | ||
471 | } | 473 | } |
472 | /* more in the link list, continue */ | 474 | /* more in the link list, continue */ |
473 | usedblocks++; | 475 | usedblocks++; |
474 | } while (usedblocks < priv->cfg->max_ll_items); | 476 | } while (usedblocks <= priv->cfg->max_ll_items); |
475 | /* OTP full, use last block */ | 477 | |
476 | IWL_DEBUG_INFO(priv, "OTP is full, use last block\n"); | 478 | /* OTP has no valid blocks */ |
477 | done: | 479 | IWL_DEBUG_INFO(priv, "OTP has no valid blocks\n"); |
478 | *validblockaddr = valid_addr; | 480 | return -EINVAL; |
479 | /* skip first 2 bytes (link list pointer) */ | ||
480 | *validblockaddr += 2; | ||
481 | return ret; | ||
482 | } | 481 | } |
483 | 482 | ||
484 | /** | 483 | /** |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index fee6f0c7503e..b363c96fd6c6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h | |||
@@ -222,35 +222,35 @@ struct iwl_eeprom_enhanced_txpwr { | |||
222 | * Section 10: 2.4 GHz 40MHz channels: 132, 44 (_above_) | 222 | * Section 10: 2.4 GHz 40MHz channels: 132, 44 (_above_) |
223 | */ | 223 | */ |
224 | /* 2.4 GHz band: CCK */ | 224 | /* 2.4 GHz band: CCK */ |
225 | #define EEPROM_LB_CCK_20_COMMON ((0xAA)\ | 225 | #define EEPROM_LB_CCK_20_COMMON ((0xA8)\ |
226 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 8 bytes */ | 226 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 8 bytes */ |
227 | /* 2.4 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ | 227 | /* 2.4 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ |
228 | #define EEPROM_LB_OFDM_COMMON ((0xB2)\ | 228 | #define EEPROM_LB_OFDM_COMMON ((0xB0)\ |
229 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ | 229 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ |
230 | /* 5.2 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ | 230 | /* 5.2 GHz band: 20MHz-Legacy, 20MHz-HT, 40MHz-HT */ |
231 | #define EEPROM_HB_OFDM_COMMON ((0xCA)\ | 231 | #define EEPROM_HB_OFDM_COMMON ((0xC8)\ |
232 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ | 232 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ |
233 | /* 2.4GHz band channels: | 233 | /* 2.4GHz band channels: |
234 | * 1Legacy, 1HT, 2Legacy, 2HT, 10Legacy, 10HT, 11Legacy, 11HT */ | 234 | * 1Legacy, 1HT, 2Legacy, 2HT, 10Legacy, 10HT, 11Legacy, 11HT */ |
235 | #define EEPROM_LB_OFDM_20_BAND ((0xE2)\ | 235 | #define EEPROM_LB_OFDM_20_BAND ((0xE0)\ |
236 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 64 bytes */ | 236 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 64 bytes */ |
237 | /* 2.4 GHz band HT40 channels: (1,+1) (2,+1) (6,+1) (7,+1) (9,+1) */ | 237 | /* 2.4 GHz band HT40 channels: (1,+1) (2,+1) (6,+1) (7,+1) (9,+1) */ |
238 | #define EEPROM_LB_OFDM_HT40_BAND ((0x122)\ | 238 | #define EEPROM_LB_OFDM_HT40_BAND ((0x120)\ |
239 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 40 bytes */ | 239 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 40 bytes */ |
240 | /* 5.2GHz band channels: 36Legacy, 36HT, 64Legacy, 64HT, 100Legacy, 100HT */ | 240 | /* 5.2GHz band channels: 36Legacy, 36HT, 64Legacy, 64HT, 100Legacy, 100HT */ |
241 | #define EEPROM_HB_OFDM_20_BAND ((0x14A)\ | 241 | #define EEPROM_HB_OFDM_20_BAND ((0x148)\ |
242 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 48 bytes */ | 242 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 48 bytes */ |
243 | /* 5.2 GHz band HT40 channels: (36,+1) (60,+1) (100,+1) */ | 243 | /* 5.2 GHz band HT40 channels: (36,+1) (60,+1) (100,+1) */ |
244 | #define EEPROM_HB_OFDM_HT40_BAND ((0x17A)\ | 244 | #define EEPROM_HB_OFDM_HT40_BAND ((0x178)\ |
245 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ | 245 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 24 bytes */ |
246 | /* 2.4 GHz band, channnel 13: Legacy, HT */ | 246 | /* 2.4 GHz band, channnel 13: Legacy, HT */ |
247 | #define EEPROM_LB_OFDM_20_CHANNEL_13 ((0x192)\ | 247 | #define EEPROM_LB_OFDM_20_CHANNEL_13 ((0x190)\ |
248 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ | 248 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ |
249 | /* 5.2 GHz band, channnel 140: Legacy, HT */ | 249 | /* 5.2 GHz band, channnel 140: Legacy, HT */ |
250 | #define EEPROM_HB_OFDM_20_CHANNEL_140 ((0x1A2)\ | 250 | #define EEPROM_HB_OFDM_20_CHANNEL_140 ((0x1A0)\ |
251 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ | 251 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ |
252 | /* 5.2 GHz band, HT40 channnels (132,+1) (44,+1) */ | 252 | /* 5.2 GHz band, HT40 channnels (132,+1) (44,+1) */ |
253 | #define EEPROM_HB_OFDM_HT40_BAND_1 ((0x1B2)\ | 253 | #define EEPROM_HB_OFDM_HT40_BAND_1 ((0x1B0)\ |
254 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ | 254 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 16 bytes */ |
255 | 255 | ||
256 | 256 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 8e1bb53c0aa3..493626bcd3ec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -1044,7 +1044,7 @@ void iwl_rx_reply_rx(struct iwl_priv *priv, | |||
1044 | * as a bitmask. | 1044 | * as a bitmask. |
1045 | */ | 1045 | */ |
1046 | rx_status.antenna = | 1046 | rx_status.antenna = |
1047 | le16_to_cpu(phy_res->phy_flags & RX_RES_PHY_FLAGS_ANTENNA_MSK) | 1047 | (le16_to_cpu(phy_res->phy_flags) & RX_RES_PHY_FLAGS_ANTENNA_MSK) |
1048 | >> RX_RES_PHY_FLAGS_ANTENNA_POS; | 1048 | >> RX_RES_PHY_FLAGS_ANTENNA_POS; |
1049 | 1049 | ||
1050 | /* set the preamble flag if appropriate */ | 1050 | /* set the preamble flag if appropriate */ |
diff --git a/drivers/net/znet.c b/drivers/net/znet.c index a0384b6f09b6..b42347333750 100644 --- a/drivers/net/znet.c +++ b/drivers/net/znet.c | |||
@@ -169,7 +169,6 @@ static void znet_tx_timeout (struct net_device *dev); | |||
169 | static int znet_request_resources (struct net_device *dev) | 169 | static int znet_request_resources (struct net_device *dev) |
170 | { | 170 | { |
171 | struct znet_private *znet = netdev_priv(dev); | 171 | struct znet_private *znet = netdev_priv(dev); |
172 | unsigned long flags; | ||
173 | 172 | ||
174 | if (request_irq (dev->irq, &znet_interrupt, 0, "ZNet", dev)) | 173 | if (request_irq (dev->irq, &znet_interrupt, 0, "ZNet", dev)) |
175 | goto failed; | 174 | goto failed; |
@@ -187,13 +186,9 @@ static int znet_request_resources (struct net_device *dev) | |||
187 | free_sia: | 186 | free_sia: |
188 | release_region (znet->sia_base, znet->sia_size); | 187 | release_region (znet->sia_base, znet->sia_size); |
189 | free_tx_dma: | 188 | free_tx_dma: |
190 | flags = claim_dma_lock(); | ||
191 | free_dma (znet->tx_dma); | 189 | free_dma (znet->tx_dma); |
192 | release_dma_lock (flags); | ||
193 | free_rx_dma: | 190 | free_rx_dma: |
194 | flags = claim_dma_lock(); | ||
195 | free_dma (znet->rx_dma); | 191 | free_dma (znet->rx_dma); |
196 | release_dma_lock (flags); | ||
197 | free_irq: | 192 | free_irq: |
198 | free_irq (dev->irq, dev); | 193 | free_irq (dev->irq, dev); |
199 | failed: | 194 | failed: |
@@ -203,14 +198,11 @@ static int znet_request_resources (struct net_device *dev) | |||
203 | static void znet_release_resources (struct net_device *dev) | 198 | static void znet_release_resources (struct net_device *dev) |
204 | { | 199 | { |
205 | struct znet_private *znet = netdev_priv(dev); | 200 | struct znet_private *znet = netdev_priv(dev); |
206 | unsigned long flags; | ||
207 | 201 | ||
208 | release_region (znet->sia_base, znet->sia_size); | 202 | release_region (znet->sia_base, znet->sia_size); |
209 | release_region (dev->base_addr, znet->io_size); | 203 | release_region (dev->base_addr, znet->io_size); |
210 | flags = claim_dma_lock(); | ||
211 | free_dma (znet->tx_dma); | 204 | free_dma (znet->tx_dma); |
212 | free_dma (znet->rx_dma); | 205 | free_dma (znet->rx_dma); |
213 | release_dma_lock (flags); | ||
214 | free_irq (dev->irq, dev); | 206 | free_irq (dev->irq, dev); |
215 | } | 207 | } |
216 | 208 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index b332eefebb1b..83800091a31a 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -557,7 +557,7 @@ struct netdev_queue { | |||
557 | * Callback uses when the transmitter has not made any progress | 557 | * Callback uses when the transmitter has not made any progress |
558 | * for dev->watchdog ticks. | 558 | * for dev->watchdog ticks. |
559 | * | 559 | * |
560 | * struct net_device_stats* (*get_stats)(struct net_device *dev); | 560 | * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); |
561 | * Called when a user wants to get the network device usage | 561 | * Called when a user wants to get the network device usage |
562 | * statistics. If not defined, the counters in dev->stats will | 562 | * statistics. If not defined, the counters in dev->stats will |
563 | * be used. | 563 | * be used. |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index e92f1fd28aa5..5df2f6a0b0f0 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1077,12 +1077,16 @@ static int inetdev_event(struct notifier_block *this, unsigned long event, | |||
1077 | ip_mc_up(in_dev); | 1077 | ip_mc_up(in_dev); |
1078 | /* fall through */ | 1078 | /* fall through */ |
1079 | case NETDEV_CHANGEADDR: | 1079 | case NETDEV_CHANGEADDR: |
1080 | if (IN_DEV_ARP_NOTIFY(in_dev)) | 1080 | /* Send gratuitous ARP to notify of link change */ |
1081 | arp_send(ARPOP_REQUEST, ETH_P_ARP, | 1081 | if (IN_DEV_ARP_NOTIFY(in_dev)) { |
1082 | in_dev->ifa_list->ifa_address, | 1082 | struct in_ifaddr *ifa = in_dev->ifa_list; |
1083 | dev, | 1083 | |
1084 | in_dev->ifa_list->ifa_address, | 1084 | if (ifa) |
1085 | NULL, dev->dev_addr, NULL); | 1085 | arp_send(ARPOP_REQUEST, ETH_P_ARP, |
1086 | ifa->ifa_address, dev, | ||
1087 | ifa->ifa_address, NULL, | ||
1088 | dev->dev_addr, NULL); | ||
1089 | } | ||
1086 | break; | 1090 | break; |
1087 | case NETDEV_DOWN: | 1091 | case NETDEV_DOWN: |
1088 | ip_mc_down(in_dev); | 1092 | ip_mc_down(in_dev); |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index c01588f9d453..865fbc09be1a 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -2164,11 +2164,17 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, | |||
2164 | 2164 | ||
2165 | skb = rx.skb; | 2165 | skb = rx.skb; |
2166 | 2166 | ||
2167 | list_for_each_entry_rcu(sdata, &local->interfaces, list) { | 2167 | if (rx.sdata && ieee80211_is_data(hdr->frame_control)) { |
2168 | rx.flags |= IEEE80211_RX_RA_MATCH; | ||
2169 | prepares = prepare_for_handlers(rx.sdata, &rx, hdr); | ||
2170 | if (prepares) | ||
2171 | prev = rx.sdata; | ||
2172 | } else list_for_each_entry_rcu(sdata, &local->interfaces, list) { | ||
2168 | if (!netif_running(sdata->dev)) | 2173 | if (!netif_running(sdata->dev)) |
2169 | continue; | 2174 | continue; |
2170 | 2175 | ||
2171 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR) | 2176 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR || |
2177 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
2172 | continue; | 2178 | continue; |
2173 | 2179 | ||
2174 | rx.flags |= IEEE80211_RX_RA_MATCH; | 2180 | rx.flags |= IEEE80211_RX_RA_MATCH; |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index eec001491e66..594f2318c3d8 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -361,6 +361,7 @@ int sta_info_insert(struct sta_info *sta) | |||
361 | u.ap); | 361 | u.ap); |
362 | 362 | ||
363 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta); | 363 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta); |
364 | sdata = sta->sdata; | ||
364 | } | 365 | } |
365 | 366 | ||
366 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 367 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
@@ -496,6 +497,7 @@ static void __sta_info_unlink(struct sta_info **sta) | |||
496 | 497 | ||
497 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE, | 498 | drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE, |
498 | &(*sta)->sta); | 499 | &(*sta)->sta); |
500 | sdata = (*sta)->sdata; | ||
499 | } | 501 | } |
500 | 502 | ||
501 | if (ieee80211_vif_is_mesh(&sdata->vif)) { | 503 | if (ieee80211_vif_is_mesh(&sdata->vif)) { |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index fd4028296613..db4bda681ec9 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1704,7 +1704,8 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1704 | if (!is_multicast_ether_addr(hdr.addr1)) { | 1704 | if (!is_multicast_ether_addr(hdr.addr1)) { |
1705 | rcu_read_lock(); | 1705 | rcu_read_lock(); |
1706 | sta = sta_info_get(local, hdr.addr1); | 1706 | sta = sta_info_get(local, hdr.addr1); |
1707 | if (sta) | 1707 | /* XXX: in the future, use sdata to look up the sta */ |
1708 | if (sta && sta->sdata == sdata) | ||
1708 | sta_flags = get_sta_flags(sta); | 1709 | sta_flags = get_sta_flags(sta); |
1709 | rcu_read_unlock(); | 1710 | rcu_read_unlock(); |
1710 | } | 1711 | } |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index dd6564321369..aeb65b3d2295 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -339,7 +339,7 @@ void ieee80211_add_pending_skb(struct ieee80211_local *local, | |||
339 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 339 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
340 | 340 | ||
341 | if (WARN_ON(!info->control.vif)) { | 341 | if (WARN_ON(!info->control.vif)) { |
342 | kfree(skb); | 342 | kfree_skb(skb); |
343 | return; | 343 | return; |
344 | } | 344 | } |
345 | 345 | ||
@@ -367,7 +367,7 @@ int ieee80211_add_pending_skbs(struct ieee80211_local *local, | |||
367 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 367 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
368 | 368 | ||
369 | if (WARN_ON(!info->control.vif)) { | 369 | if (WARN_ON(!info->control.vif)) { |
370 | kfree(skb); | 370 | kfree_skb(skb); |
371 | continue; | 371 | continue; |
372 | } | 372 | } |
373 | 373 | ||
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 6a536949cdc0..7cf6c0fbc7a6 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -350,7 +350,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp, | |||
350 | tcm = NLMSG_DATA(nlh); | 350 | tcm = NLMSG_DATA(nlh); |
351 | tcm->tcm_family = AF_UNSPEC; | 351 | tcm->tcm_family = AF_UNSPEC; |
352 | tcm->tcm__pad1 = 0; | 352 | tcm->tcm__pad1 = 0; |
353 | tcm->tcm__pad1 = 0; | 353 | tcm->tcm__pad2 = 0; |
354 | tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex; | 354 | tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex; |
355 | tcm->tcm_parent = tp->classid; | 355 | tcm->tcm_parent = tp->classid; |
356 | tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); | 356 | tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 14004e2ebd62..f48394126bf9 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -4031,7 +4031,7 @@ static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) | |||
4031 | rdev = cfg80211_get_dev_from_info(info); | 4031 | rdev = cfg80211_get_dev_from_info(info); |
4032 | if (IS_ERR(rdev)) { | 4032 | if (IS_ERR(rdev)) { |
4033 | err = PTR_ERR(rdev); | 4033 | err = PTR_ERR(rdev); |
4034 | goto out; | 4034 | goto out_rtnl; |
4035 | } | 4035 | } |
4036 | 4036 | ||
4037 | net = get_net_ns_by_pid(pid); | 4037 | net = get_net_ns_by_pid(pid); |
@@ -4051,6 +4051,7 @@ static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info) | |||
4051 | put_net(net); | 4051 | put_net(net); |
4052 | out: | 4052 | out: |
4053 | cfg80211_unlock_rdev(rdev); | 4053 | cfg80211_unlock_rdev(rdev); |
4054 | out_rtnl: | ||
4054 | rtnl_unlock(); | 4055 | rtnl_unlock(); |
4055 | return err; | 4056 | return err; |
4056 | } | 4057 | } |